diff --git a/src/app/Console/Commands/Wallet/TransactionsCommand.php b/src/app/Console/Commands/Wallet/TransactionsCommand.php index 70ad541b..81ab6ee8 100644 --- a/src/app/Console/Commands/Wallet/TransactionsCommand.php +++ b/src/app/Console/Commands/Wallet/TransactionsCommand.php @@ -1,63 +1,72 @@ getWallet($this->argument('wallet')); if (!$wallet) { $this->error("Wallet not found."); return 1; } - $wallet->transactions()->orderBy('created_at')->each(function ($transaction) { + $withDetail = $this->option('detail'); + $balanceMode = $this->option('balance'); + $balance = 0; + + $transactions = $wallet->transactions()->orderBy('created_at')->cursor(); + + foreach ($transactions as $transaction) { + $balance += $transaction->amount; + $this->info( sprintf( "%s: %s %s", $transaction->id, $transaction->created_at, $transaction->toString() ) + . ($balanceMode ? sprintf(' (balance: %s)', $wallet->money($balance)) : '') ); - if ($this->option('detail')) { + if ($withDetail) { $elements = \App\Transaction::where('transaction_id', $transaction->id) ->orderBy('created_at')->get(); foreach ($elements as $element) { $this->info( sprintf( " + %s: %s", $element->id, $element->toString() ) ); } } - }); + } } } diff --git a/src/tests/Feature/Console/Wallet/TransactionsTest.php b/src/tests/Feature/Console/Wallet/TransactionsTest.php index a837ed9d..12777008 100644 --- a/src/tests/Feature/Console/Wallet/TransactionsTest.php +++ b/src/tests/Feature/Console/Wallet/TransactionsTest.php @@ -1,13 +1,66 @@ deleteTestUser('test-user1@kolabnow.com'); + } + + /** + * {@inheritDoc} + */ + public function tearDown(): void + { + $this->deleteTestUser('test-user1@kolabnow.com'); + + parent::tearDown(); + } + public function testHandle(): void { - $this->markTestIncomplete(); + $user = $this->getTestUser('test-user1@kolabnow.com'); + $wallet = $user->wallets()->first(); + + // Non-existing wallet + $code = \Artisan::call("wallet:transactions 123"); + $output = trim(\Artisan::output()); + + $this->assertSame(1, $code); + $this->assertSame("Wallet not found.", $output); + + // Empty wallet + $code = \Artisan::call("wallet:transactions {$wallet->id}"); + $output = trim(\Artisan::output()); + + $this->assertSame(0, $code); + $this->assertSame("", $output); + + // Non-Empty wallet + $this->createTestTransactions($wallet); + $code = \Artisan::call("wallet:transactions {$wallet->id}"); + $output = trim(\Artisan::output()); + + $this->assertSame(0, $code); + $this->assertCount(12, explode("\n", $output)); + + // With --detail and --balance + $code = \Artisan::call("wallet:transactions --detail --balance {$wallet->id}"); + $output = trim(\Artisan::output()); + + $this->assertSame(0, $code); + $this->assertCount(12, explode("\n", $output)); + $this->assertStringContainsString('(balance: 20,00 CHF)', $output); + + // TODO: Add and test some detail sub-transactions } }