. */ declare(strict_types=1); namespace Tests\integration\Api\Autocomplete; use FireflyIII\Models\Bill; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\integration\TestCase; use FireflyIII\User; use FireflyIII\Models\UserGroup; /** * Class BillControllerTest * * @internal * * @coversNothing */ final class BillControllerTest extends TestCase { /** * @covers \FireflyIII\Api\V1\Controllers\Autocomplete\BillController */ use RefreshDatabase; private function createAuthenticatedUser(): User { $userGroup = UserGroup::create(['title' => 'Test Group']); return User::create([ 'email' => 'test@email.com', 'password' => 'password', 'user_group_id' => $userGroup->id, ]); } private function createTestBills(int $count, User $user): void { for ($i = 1; $i <= $count; $i++) { $bill = Bill::create([ 'user_id' => $user->id, 'name' => 'Bill ' . $i, 'user_group_id' => $user->user_group_id, 'amount_min' => rand(1, 100), // random amount 'amount_max' => rand(101, 200), // random amount 'match' => 'MIGRATED_TO_RULES', 'date' => '2024-01-01', 'repeat_freq' => 'monthly', 'automatch' => 1, ]); } } public function testGivenAnUnauthenticatedRequestWhenCallingTheBillsEndpointThenReturns401HttpCode(): void { // test API $response = $this->get(route('api.v1.autocomplete.bills'), ['Accept' => 'application/json']); $response->assertStatus(401); $response->assertHeader('Content-Type', 'application/json'); $response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}'); } public function testGivenAuthenticatedRequestWhenCallingTheBillsEndpointThenReturns200HttpCode(): void { // act as a user $user = $this->createAuthenticatedUser(); $this->actingAs($user); $response = $this->get(route('api.v1.autocomplete.bills'), ['Accept' => 'application/json']); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/json'); } public function testGivenAuthenticatedRequestWhenCallingTheBillsEndpointThenReturnsBills(): void { $user = $this->createAuthenticatedUser(); $this->actingAs($user); $this->createTestBills(5, $user); $response = $this->get(route('api.v1.autocomplete.bills'), ['Accept' => 'application/json']); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/json'); $response->assertJsonCount(5); $response->assertJsonFragment(['name' => 'Bill 1']); $response->assertJsonStructure([ '*' => [ 'id', 'name', 'active' ] ]); } public function testGivenAuthenticatedRequestWhenCallingTheBillsEndpointWithQueryThenReturnsBillsWithLimit(): void { $user = $this->createAuthenticatedUser(); $this->actingAs($user); $this->createTestBills(5, $user); $response = $this->get(route('api.v1.autocomplete.bills', [ 'query' => 'Bill', 'limit' => 3 ]), ['Accept' => 'application/json']); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/json'); $response->assertJsonCount(3); $response->assertJsonFragment(['name' => 'Bill 1']); $response->assertJsonStructure([ '*' => [ 'id', 'name', 'active' ] ]); } public function testGivenAuthenticatedRequestWhenCallingTheBillsEndpointWithQueryThenReturnsBillsThatMatchQuery(): void { $user = $this->createAuthenticatedUser(); $this->actingAs($user); $this->createTestBills(20, $user); $response = $this->get(route('api.v1.autocomplete.bills', [ 'query' => 'Bill 1', 'limit' => 20, ]), ['Accept' => 'application/json']); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/json'); // Bill 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 (11) $response->assertJsonCount(11); $response->assertJsonMissing(['name' => 'Bill 2']); } }