From fd32a692c1f879397d2c12cd162fa593397cecae Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 25 Aug 2025 15:31:51 +0200 Subject: [PATCH] Add some API tests. --- .../Autocomplete/RecurrenceController.php | 1 + .../Autocomplete/RuleController.php | 5 +- .../Autocomplete/RecurrenceControllerTest.php | 147 ++++++++++++++++++ .../Api/System/AboutControllerTest.php | 2 +- 4 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 tests/integration/Api/Autocomplete/RecurrenceControllerTest.php diff --git a/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php b/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php index f061df1443..2d76c0eb6f 100644 --- a/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php +++ b/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php @@ -69,6 +69,7 @@ class RecurrenceController extends Controller 'id' => (string) $recurrence->id, 'name' => $recurrence->title, 'description' => $recurrence->description, + 'active' => $recurrence->active ]; } diff --git a/app/Api/V1/Controllers/Autocomplete/RuleController.php b/app/Api/V1/Controllers/Autocomplete/RuleController.php index acc44effcd..c2de7bb83b 100644 --- a/app/Api/V1/Controllers/Autocomplete/RuleController.php +++ b/app/Api/V1/Controllers/Autocomplete/RuleController.php @@ -37,7 +37,7 @@ use Illuminate\Http\JsonResponse; class RuleController extends Controller { private RuleRepositoryInterface $repository; - protected array $acceptedRoles = [UserRoleEnum::READ_RULES]; + protected array $acceptedRoles = [UserRoleEnum::READ_RULES]; /** * RuleController constructor. @@ -66,9 +66,10 @@ class RuleController extends Controller /** @var Rule $rule */ foreach ($rules as $rule) { $response[] = [ - 'id' => (string) $rule->id, + 'id' => (string)$rule->id, 'name' => $rule->title, 'description' => $rule->description, + 'active' => $rule->active, ]; } diff --git a/tests/integration/Api/Autocomplete/RecurrenceControllerTest.php b/tests/integration/Api/Autocomplete/RecurrenceControllerTest.php new file mode 100644 index 0000000000..32d5cae547 --- /dev/null +++ b/tests/integration/Api/Autocomplete/RecurrenceControllerTest.php @@ -0,0 +1,147 @@ +. + */ + +declare(strict_types=1); + +namespace Tests\integration\Api\Autocomplete; + +use FireflyIII\Models\Recurrence; +use FireflyIII\User; +use Illuminate\Foundation\Testing\RefreshDatabase; +use Tests\integration\TestCase; + +/** + * Class BillControllerTest + * + * @internal + * + * @coversNothing + */ +final class RecurrenceControllerTest extends TestCase +{ + /** + * @covers \FireflyIII\Api\V1\Controllers\Autocomplete\RecurrenceController + */ + use RefreshDatabase; + + private function createTestRecurrences(int $count, User $user): void + { + for ($i = 1; $i <= $count; ++$i) { + $recurrence = Recurrence::create([ + 'user_id' => $user->id, + 'user_group_id' => $user->user_group_id, + 'transaction_type_id' => 1, + 'title' => 'Recurrence ' . $i, + 'description' => 'Recurrence ' . $i, + 'first_date' => today(), + 'apply_rules' => 1, + 'active' => 1, + 'repetitions' => 5, + + ]); + } + } + + public function testUnAuthenticatedCall(): void + { + // test API + $response = $this->get(route('api.v1.autocomplete.recurring'), ['Accept' => 'application/json']); + $response->assertStatus(401); + $response->assertHeader('Content-Type', 'application/json'); + $response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}'); + } + + public function testAuthenticatedCall(): void + { + // act as a user + $user = $this->createAuthenticatedUser(); + $this->actingAs($user); + + $response = $this->get(route('api.v1.autocomplete.recurring'), ['Accept' => 'application/json']); + $response->assertStatus(200); + $response->assertHeader('Content-Type', 'application/json'); + } + + public function testGivenAuthenticatedRequestWithItems(): void + { + $user = $this->createAuthenticatedUser(); + $this->actingAs($user); + + $this->createTestRecurrences(5, $user); + $response = $this->get(route('api.v1.autocomplete.recurring'), ['Accept' => 'application/json']); + $response->assertStatus(200); + $response->assertHeader('Content-Type', 'application/json'); + $response->assertJsonCount(5); + $response->assertJsonFragment(['name' => 'Recurrence 1']); + $response->assertJsonStructure([ + '*' => [ + 'id', + 'name', + 'active', + ], + ]); + + } + + public function testGivenAuthenticatedRequestWithItemsLimited(): void + { + $user = $this->createAuthenticatedUser(); + $this->actingAs($user); + + $this->createTestRecurrences(5, $user); + $response = $this->get(route('api.v1.autocomplete.recurring', [ + 'query' => 'Recurrence', + 'limit' => 3, + ]), ['Accept' => 'application/json']); + + $response->assertStatus(200); + $response->assertHeader('Content-Type', 'application/json'); + $response->assertJsonCount(3); + $response->assertJsonFragment(['name' => 'Recurrence 1']); + $response->assertJsonStructure([ + '*' => [ + 'id', + 'name', + 'active', + ], + ]); + + } + + public function testGivenAuthenticatedRequestWithItemsLots(): void + { + $user = $this->createAuthenticatedUser(); + $this->actingAs($user); + + $this->createTestRecurrences(20, $user); + $response = $this->get(route('api.v1.autocomplete.recurring', [ + 'query' => 'Recurrence 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' => 'Recurrence 2']); + } +} diff --git a/tests/integration/Api/System/AboutControllerTest.php b/tests/integration/Api/System/AboutControllerTest.php index f12179e6a1..6ffb04b044 100644 --- a/tests/integration/Api/System/AboutControllerTest.php +++ b/tests/integration/Api/System/AboutControllerTest.php @@ -22,7 +22,7 @@ declare(strict_types=1); -namespace Tests\integration\Api\About; +namespace Tests\integration\Api\System; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Testing\Fluent\AssertableJson;