From febe60b3d1559039572d6022c37344c573cc3378 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 23 Aug 2020 08:51:58 +0200 Subject: [PATCH] Test more actions in new format. --- .../Actions/DeleteTransaction.php | 32 +++++++- app/TransactionRules/Actions/LinkToBill.php | 28 ++++++- .../Actions/DeleteTransactionTest.php | 80 +++++++++++++++++++ .../Actions/LinkToBillTest.php | 57 ++++--------- 4 files changed, 149 insertions(+), 48 deletions(-) create mode 100644 tests/Unit/TransactionRules/Actions/DeleteTransactionTest.php diff --git a/app/TransactionRules/Actions/DeleteTransaction.php b/app/TransactionRules/Actions/DeleteTransaction.php index f1bf216423..9a53db92f0 100644 --- a/app/TransactionRules/Actions/DeleteTransaction.php +++ b/app/TransactionRules/Actions/DeleteTransaction.php @@ -24,6 +24,7 @@ namespace FireflyIII\TransactionRules\Actions; use Exception; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Services\Internal\Destroy\JournalDestroyService; use FireflyIII\Services\Internal\Destroy\TransactionGroupDestroyService; @@ -45,11 +46,12 @@ class DeleteTransaction implements ActionInterface /** * Will delete transaction journal. Also the group if no other journals are in the group. - * * @param TransactionJournal $journal * - * @throws Exception * @return bool + * @throws Exception + * @deprecated + * @codeCoverageIgnore */ public function act(TransactionJournal $journal): bool { @@ -84,6 +86,30 @@ class DeleteTransaction implements ActionInterface */ public function actOnArray(array $journal): bool { - // TODO: Implement actOnArray() method. + $count = TransactionJournal::where('transaction_group_id', $journal['transaction_group_id'])->count(); + + // destroy entire group. + if (1 === $count) { + Log::debug( + sprintf( + 'RuleAction DeleteTransaction DELETED the entire transaction group of journal #%d ("%s").', + $journal['transaction_journal_id'], $journal['description'] + ) + ); + $group = TransactionGroup::find($journal['transaction_group_id']); + $service = app(TransactionGroupDestroyService::class); + $service->destroy($group); + + return true; + } + Log::debug(sprintf('RuleAction DeleteTransaction DELETED transaction journal #%d ("%s").', $journal['transaction_journal_id'], $journal['description'])); + + // trigger delete factory: + $journal = TransactionJournal::find($journal['transaction_group_id']); + /** @var JournalDestroyService $service */ + $service = app(JournalDestroyService::class); + $service->destroy($journal); + + return true; } } diff --git a/app/TransactionRules/Actions/LinkToBill.php b/app/TransactionRules/Actions/LinkToBill.php index 64c4ac6d0c..f78169e729 100644 --- a/app/TransactionRules/Actions/LinkToBill.php +++ b/app/TransactionRules/Actions/LinkToBill.php @@ -22,10 +22,12 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use DB; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use FireflyIII\User; use Log; /** @@ -50,17 +52,18 @@ class LinkToBill implements ActionInterface /** * Set bill to be X. - * * @param TransactionJournal $journal * * @return bool + * @deprecated + * @codeCoverageIgnore */ public function act(TransactionJournal $journal): bool { /** @var BillRepositoryInterface $repository */ $repository = app(BillRepositoryInterface::class); $repository->setUser($this->action->rule->user); - $billName = (string)$this->action->action_value; + $billName = (string) $this->action->action_value; $bill = $repository->findByName($billName); if (null !== $bill && $journal->transactionType->type === TransactionType::WITHDRAWAL) { @@ -82,6 +85,25 @@ class LinkToBill implements ActionInterface */ public function actOnArray(array $journal): bool { - // TODO: Implement actOnArray() method. + $user = User::find($journal['user_id']); + /** @var BillRepositoryInterface $repository */ + $repository = app(BillRepositoryInterface::class); + $repository->setUser($user); + $billName = (string) $this->action->action_value; + $bill = $repository->findByName($billName); + + if (null !== $bill && $journal['transaction_type_type'] === TransactionType::WITHDRAWAL) { + DB::table('transaction_journals') + ->where('id', '=', $journal['transaction_journal_id']) + ->update(['bill_id' => $bill->id]); + Log::debug(sprintf('RuleAction LinkToBill set the bill of journal #%d to bill #%d ("%s").', $journal['transaction_journal_id'], $bill->id, $bill->name)); + + return true; + } + + Log::error(sprintf('RuleAction LinkToBill could not set the bill of journal #%d to bill "%s": no such bill found or not a withdrawal.', $journal['transaction_journal_id'], $billName)); + + + return false; } } diff --git a/tests/Unit/TransactionRules/Actions/DeleteTransactionTest.php b/tests/Unit/TransactionRules/Actions/DeleteTransactionTest.php new file mode 100644 index 0000000000..c095c9d22c --- /dev/null +++ b/tests/Unit/TransactionRules/Actions/DeleteTransactionTest.php @@ -0,0 +1,80 @@ +. + */ +declare(strict_types=1); + +namespace Tests\Unit\TransactionRules\Actions; + +use Exception; +use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Actions\DeleteTransaction; +use Log; +use Tests\TestCase; + +/** + * Class AddTagTest + */ +class DeleteTransactionTest extends TestCase +{ + /** + * + */ + public function setUp(): void + { + parent::setUp(); + Log::info(sprintf('Now in %s.', get_class($this))); + } + + /** + * @covers \FireflyIII\TransactionRules\Actions\DeleteTransaction + */ + public function testAct(): void + { + $journal = TransactionJournal::whereDescription('Withdrawal to DELETE.')->first(); + + + // fire the action: + $ruleAction = new RuleAction; + $ruleAction->action_value = null; + $action = new DeleteTransaction($ruleAction); + + $array = [ + 'transaction_journal_id' => $journal->id, + 'transaction_group_id' => $journal->transaction_group_id, + 'description' => $journal->description, + ]; + + try { + $result = $action->actOnArray($array); + } catch (Exception $e) { + Log::error($e->getMessage()); + Log::error($e->getTraceAsString()); + $this->assertTrue(false, $e->getMessage()); + } + $this->assertTrue($result); + + // assert result + $journal->refresh(); + $this->assertNotNull($journal->deleted_at); + } + + +} diff --git a/tests/Unit/TransactionRules/Actions/LinkToBillTest.php b/tests/Unit/TransactionRules/Actions/LinkToBillTest.php index ec34088835..176040ff89 100644 --- a/tests/Unit/TransactionRules/Actions/LinkToBillTest.php +++ b/tests/Unit/TransactionRules/Actions/LinkToBillTest.php @@ -25,16 +25,12 @@ namespace Tests\Unit\TransactionRules\Actions; use FireflyIII\Models\RuleAction; -use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\TransactionRules\Actions\LinkToBill; use Log; use Tests\TestCase; /** * Class LinkToBillTest - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @SuppressWarnings(PHPMD.TooManyPublicMethods) */ class LinkToBillTest extends TestCase { @@ -43,9 +39,6 @@ class LinkToBillTest extends TestCase */ public function setUp(): void { - self::markTestIncomplete('Incomplete for refactor.'); - - return; parent::setUp(); Log::info(sprintf('Now in %s.', get_class($this))); } @@ -55,49 +48,29 @@ class LinkToBillTest extends TestCase */ public function testBasic(): void { - $repos = $this->mock(BillRepositoryInterface::class); - $withdrawal = $this->getRandomWithdrawal(); - $rule = $this->getRandomRule(); - $bill = $this->getRandomBill(); + $withdrawal = $this->getRandomWithdrawal(); + $bill = $this->getRandomBill(); + + $array = [ + 'transaction_journal_id' => $withdrawal->id, + 'transaction_type_type' => $withdrawal->transactionType->type, + 'user_id' => $this->user()->id, + ]; + $ruleAction = new RuleAction; - $ruleAction->rule = $rule; $ruleAction->action_type = 'link_to_bill'; $ruleAction->action_value = $bill->name; - $repos->shouldReceive('setUser'); - $repos->shouldReceive('findByName')->withArgs([$bill->name])->andReturn($bill); - $action = new LinkToBill($ruleAction); - $result = $action->act($withdrawal); + $result = $action->actOnArray($array); $this->assertTrue($result); + // withdrawal has bill id. + $withdrawal->refresh(); + $this->assertEquals($bill->id, $withdrawal->bill_id); - + $withdrawal->bill_id = null; + $withdrawal->save(); } - - /** - * @covers \FireflyIII\TransactionRules\Actions\LinkToBill - */ - public function testNoBill(): void - { - $repos = $this->mock(BillRepositoryInterface::class); - $withdrawal = $this->getRandomWithdrawal(); - $rule = $this->getRandomRule(); - $bill = $this->getRandomBill(); - $ruleAction = new RuleAction; - $ruleAction->rule = $rule; - $ruleAction->action_type = 'link_to_bill'; - $ruleAction->action_value = $bill->name; - - $repos->shouldReceive('setUser'); - $repos->shouldReceive('findByName')->withArgs([$bill->name])->andReturnNull(); - - $action = new LinkToBill($ruleAction); - $result = $action->act($withdrawal); - - $this->assertFalse($result); - - - } }