. */ declare(strict_types=1); namespace Tests\Unit\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\TransactionRules\Triggers\ToAccountEnds; use Log; use Tests\TestCase; /** * Class ToAccountEndsTest */ class ToAccountEndsTest extends TestCase { /** * @covers \FireflyIII\TransactionRules\Triggers\ToAccountEnds::triggered */ public function testTriggered(): void { $repository = $this->mock(JournalRepositoryInterface::class); $loops = 0; // FINAL LOOP METHOD. do { /** @var TransactionJournal $journal */ $journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first(); $transaction = $journal->transactions()->where('amount', '>', 0)->first(); $account = null === $transaction ? null : $transaction->account; $count = $journal->transactions()->count(); $name = $account->name ?? ''; Log::debug(sprintf('Loop: %d, transaction count: %d, account is null: %d, name = "%s"', $loops, $count, (int)null === $account, $name)); $loops++; // do this while the following is untrue: // 1) account is not null, // 2) journal has two transactions // 3) loops is less than 30 // 4) $name is longer than 3 } while (!(null !== $account && 2 === $count && $loops < 30 && \strlen($name) > 3)); $trigger = ToAccountEnds::makeFromStrings(substr($account->name, -3), false); $result = $trigger->triggered($journal); $this->assertTrue($result); } /** * @covers \FireflyIII\TransactionRules\Triggers\ToAccountEnds::triggered */ public function testTriggeredLonger(): void { $repository = $this->mock(JournalRepositoryInterface::class); $loops = 0; // FINAL LOOP METHOD. do { /** @var TransactionJournal $journal */ $journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first(); $transaction = $journal->transactions()->where('amount', '>', 0)->first(); $account = null === $transaction ? null : $transaction->account; $count = $journal->transactions()->count(); $name = $account->name ?? ''; Log::debug(sprintf('Loop: %d, transaction count: %d, account is null: %d, name = "%s"', $loops, $count, (int)null === $account, $name)); $loops++; // do this while the following is untrue: // 1) account is not null, // 2) journal has two transactions // 3) loops is less than 30 // 4) $name is longer than 3 } while (!(null !== $account && 2 === $count && $loops < 30 && \strlen($name) > 3)); $trigger = ToAccountEnds::makeFromStrings('bla-bla-bla' . $account->name, false); $result = $trigger->triggered($journal); $this->assertFalse($result); } /** * @covers \FireflyIII\TransactionRules\Triggers\ToAccountEnds::triggered */ public function testTriggeredNot(): void { $repository = $this->mock(JournalRepositoryInterface::class); $loops = 0; // FINAL LOOP METHOD. do { /** @var TransactionJournal $journal */ $journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first(); $transaction = $journal->transactions()->where('amount', '>', 0)->first(); $account = null === $transaction ? null : $transaction->account; $count = $journal->transactions()->count(); $name = $account->name ?? ''; Log::debug(sprintf('Loop: %d, transaction count: %d, account is null: %d, name = "%s"', $loops, $count, (int)null === $account, $name)); $loops++; // do this while the following is untrue: // 1) account is not null, // 2) journal has two transactions // 3) loops is less than 30 // 4) $name is longer than 3 } while (!(null !== $account && 2 === $count && $loops < 30 && \strlen($name) > 3)); $trigger = ToAccountEnds::makeFromStrings((string)random_int(1, 1234), false); $result = $trigger->triggered($journal); $this->assertFalse($result); } /** * @covers \FireflyIII\TransactionRules\Triggers\ToAccountEnds::willMatchEverything */ public function testWillMatchEverythingEmpty(): void { $repository = $this->mock(JournalRepositoryInterface::class); $value = ''; $result = ToAccountEnds::willMatchEverything($value); $this->assertTrue($result); } /** * @covers \FireflyIII\TransactionRules\Triggers\ToAccountEnds::willMatchEverything */ public function testWillMatchEverythingNotNull(): void { $repository = $this->mock(JournalRepositoryInterface::class); $value = 'x'; $result = ToAccountEnds::willMatchEverything($value); $this->assertFalse($result); } /** * @covers \FireflyIII\TransactionRules\Triggers\ToAccountEnds::willMatchEverything */ public function testWillMatchEverythingNull(): void { $repository = $this->mock(JournalRepositoryInterface::class); $value = null; $result = ToAccountEnds::willMatchEverything($value); $this->assertTrue($result); } }