diff --git a/tests/Api/V1/Controllers/BillControllerTest.php b/tests/Api/V1/Controllers/BillControllerTest.php index 493b3f1585..970b4e8d4f 100644 --- a/tests/Api/V1/Controllers/BillControllerTest.php +++ b/tests/Api/V1/Controllers/BillControllerTest.php @@ -62,7 +62,7 @@ class BillControllerTest extends TestCase $repository->shouldReceive('setUser')->once(); $repository->shouldReceive('destroy')->once()->andReturn(true); - // get account: + // get bill: $bill = $this->user()->bills()->first(); // call API diff --git a/tests/Api/V1/Controllers/BudgetControllerTest.php b/tests/Api/V1/Controllers/BudgetControllerTest.php new file mode 100644 index 0000000000..dc5bb91cf9 --- /dev/null +++ b/tests/Api/V1/Controllers/BudgetControllerTest.php @@ -0,0 +1,175 @@ +. + */ + +declare(strict_types=1); + +namespace Tests\Api\V1\Controllers; + + +use FireflyIII\Models\Budget; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use Laravel\Passport\Passport; +use Log; +use Tests\TestCase; + +/** + * + * Class BudgetControllerTest + */ +class BudgetControllerTest extends TestCase +{ + /** + * + */ + public function setUp(): void + { + parent::setUp(); + Passport::actingAs($this->user()); + Log::debug(sprintf('Now in %s.', \get_class($this))); + } + + /** + * Delete a budget. + * + * @covers \FireflyIII\Api\V1\Controllers\BudgetController + */ + public function testDelete(): void + { + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('destroy')->once()->andReturn(true); + + // get budget: + $budget = $this->user()->budgets()->first(); + + // call API + $response = $this->delete('/api/v1/budgets/' . $budget->id); + $response->assertStatus(204); + } + + /** + * Show all budgets + * + * @covers \FireflyIII\Api\V1\Controllers\BudgetController + */ + public function testIndex(): void + { + $budgets = $this->user()->budgets()->get(); + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getBudgets')->once()->andReturn($budgets); + + // call API + $response = $this->get('/api/v1/budgets'); + $response->assertStatus(200); + $response->assertSee($budgets->first()->name); + } + + /** + * Show a single budget. + * + * @covers \FireflyIII\Api\V1\Controllers\BudgetController + */ + public function testShow(): void + { + $budget = $this->user()->budgets()->first(); + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + + // call API + $response = $this->get('/api/v1/budgets/' . $budget->id); + $response->assertStatus(200); + $response->assertSee($budget->name); + } + + /** + * Store a new budget. + * + * @covers \FireflyIII\Api\V1\Controllers\BudgetController + */ + public function testStore(): void + { + /** @var Budget $budget */ + $budget = $this->user()->budgets()->first(); + + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('store')->once()->andReturn($budget); + + // data to submit + $data = [ + 'name' => 'Some budget', + 'active' => '1', + ]; + + // test API + $response = $this->post('/api/v1/budgets', $data); + $response->assertStatus(200); + $response->assertJson(['data' => ['type' => 'budgets', 'links' => true],]); + $response->assertSee($budget->name); // the amount + $response->assertHeader('Content-Type', 'application/vnd.api+json'); + } + + /** + * Update a budget. + * + * @covers \FireflyIII\Api\V1\Controllers\BudgetController + */ + public function testUpdate(): void + { + // mock repositories + $repository = $this->mock(BudgetRepositoryInterface::class); + + /** @var Budget $budget */ + $budget = $this->user()->budgets()->first(); + + // mock calls: + $repository->shouldReceive('setUser'); + $repository->shouldReceive('update')->once()->andReturn($budget); + + // data to submit + $data = [ + 'name' => 'Some new budget', + 'active' => '1', + ]; + + // test API + $response = $this->put('/api/v1/budgets/' . $budget->id, $data, ['Accept' => 'application/json']); + $response->assertStatus(200); + $response->assertJson(['data' => ['type' => 'budgets', 'links' => true],]); + $response->assertHeader('Content-Type', 'application/vnd.api+json'); + $response->assertSee($budget->name); + } + + +} \ No newline at end of file diff --git a/tests/Unit/TransactionRules/Triggers/ToAccountEndsTest.php b/tests/Unit/TransactionRules/Triggers/ToAccountEndsTest.php index 14b52e1e87..022d4fdaf0 100644 --- a/tests/Unit/TransactionRules/Triggers/ToAccountEndsTest.php +++ b/tests/Unit/TransactionRules/Triggers/ToAccountEndsTest.php @@ -36,14 +36,15 @@ class ToAccountEndsTest extends TestCase */ public function testTriggered(): void { - $count = 0; - while ($count === 0) { + $count = 0; + $account = null; + while ($count === 0 && $account === null) { $journal = TransactionJournal::inRandomOrder()->whereNull('deleted_at')->first(); $count = $journal->transactions()->where('amount', '>', 0)->count(); $transaction = $journal->transactions()->where('amount', '>', 0)->first(); + $account = $transaction->account; } - $account = $transaction->account; $trigger = ToAccountEnds::makeFromStrings(substr($account->name, -3), false); $result = $trigger->triggered($journal); $this->assertTrue($result); @@ -60,7 +61,7 @@ class ToAccountEndsTest extends TestCase $count = $journal->transactions()->where('amount', '>', 0)->count(); $transaction = $journal->transactions()->where('amount', '>', 0)->first(); } - $account = $transaction->account; + $account = $transaction->account; $trigger = ToAccountEnds::makeFromStrings('bla-bla-bla' . $account->name, false); $result = $trigger->triggered($journal); @@ -74,8 +75,8 @@ class ToAccountEndsTest extends TestCase { $count = 0; while ($count === 0) { - $journal = TransactionJournal::inRandomOrder()->whereNull('deleted_at')->first(); - $count = $journal->transactions()->where('amount', '>', 0)->count(); + $journal = TransactionJournal::inRandomOrder()->whereNull('deleted_at')->first(); + $count = $journal->transactions()->where('amount', '>', 0)->count(); } $trigger = ToAccountEnds::makeFromStrings((string)random_int(1, 1234), false);