View source
<?php
namespace Drupal\Tests\transaction\Kernel;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\transaction\Entity\Transaction;
use Drupal\transaction\Entity\TransactionType;
class BalanceTransactionTest extends KernelTransactionTestBase {
protected function prepareTransactionType() {
$this->transactionType = TransactionType::create([
'id' => 'test_balance',
'label' => 'Test balance',
'target_entity_type' => 'entity_test',
'transactor' => [
'id' => 'transaction_balance',
'settings' => [
'last_transaction' => 'field_last_transaction',
'log_message' => 'field_log_message',
'amount' => 'field_amount',
'balance' => 'field_balance',
'target_balance' => 'field_balance',
],
],
]);
$this->transactionType
->save();
$this
->prepareTransactionAmountField();
$this
->prepareTransactionBalanceField();
$this
->prepareTargetEntityBalanceField();
$this
->addTransactionLogMessageField();
}
protected function prepareTransactionAmountField() {
$field_storage = FieldStorageConfig::create([
'field_name' => 'field_amount',
'type' => 'decimal',
'entity_type' => 'transaction',
]);
$field_storage
->save();
FieldConfig::create([
'label' => 'Amount',
'field_storage' => $field_storage,
'bundle' => $this->transactionType
->id(),
])
->save();
}
protected function prepareTransactionBalanceField() {
$field_storage = FieldStorageConfig::create([
'field_name' => 'field_balance',
'type' => 'decimal',
'entity_type' => 'transaction',
]);
$field_storage
->save();
FieldConfig::create([
'label' => 'Balance',
'field_storage' => $field_storage,
'bundle' => $this->transactionType
->id(),
])
->save();
}
protected function prepareTargetEntityBalanceField() {
$field_storage = FieldStorageConfig::create([
'field_name' => 'field_balance',
'type' => 'decimal',
'entity_type' => 'entity_test',
]);
$field_storage
->save();
FieldConfig::create([
'label' => 'Balance',
'field_storage' => $field_storage,
'bundle' => 'entity_test',
])
->save();
}
public function testBalanceTransactionCreation() {
$transaction = $this->transaction;
$this
->assertEquals('Unsaved transaction (pending)', $transaction
->getDescription());
$transaction
->save();
$this
->assertEquals('Zero amount transaction (pending)', $transaction
->getDescription());
$this
->assertEquals([
$this->logMessage,
], $transaction
->getDetails());
$transaction
->set('field_amount', -10);
$this
->assertEquals('Debit transaction (pending)', $transaction
->getDescription(TRUE));
$transaction
->set('field_amount', 10);
$this
->assertEquals('Credit transaction (pending)', $transaction
->getDescription(TRUE));
}
public function testBalanceTransactionExecution() {
$transaction = $this->transaction;
$transaction
->set('field_balance', 10);
$transaction
->set('field_amount', 10);
$this
->assertTrue($transaction
->execute());
$this
->assertEquals($transaction
->id(), $this->targetEntity
->get('field_last_transaction')->target_id);
$this
->assertGreaterThan(0, $transaction
->getResultCode());
$this
->assertEquals('Transaction executed successfully.', $transaction
->getResultMessage());
$this
->assertEquals('Credit transaction', trim($transaction
->getDescription()));
$this
->assertEquals(20, $transaction
->get('field_balance')->value);
$this
->assertEquals(20, $this->targetEntity
->get('field_balance')->value);
$second_transaction = Transaction::create([
'type' => $this->transactionType
->id(),
'target_entity' => $this->targetEntity,
'field_log_message' => $this->logMessage,
'field_balance' => 50,
'field_amount' => -10,
]);
$this->targetEntity
->set('field_balance', 50);
$this
->assertTrue($second_transaction
->execute());
$this
->assertEquals('Debit transaction', trim($second_transaction
->getDescription()));
$this
->assertEquals(10, $second_transaction
->get('field_balance')->value);
$this
->assertEquals(10, $this->targetEntity
->get('field_balance')->value);
$this
->assertEquals($second_transaction
->id(), $this->targetEntity
->get('field_last_transaction')->target_id);
}
}