count(3)->create(); }); it('returns 200 OK for default inco-sheets list request', function (): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; // WHEN $response = $test->getJson('/api/v1/inco-sheets'); // THEN $response->assertStatus(200); $response->assertJsonStructure([ 'incoSheets', 'pagination' => [ 'page', 'pageSize', 'totalItems', 'totalPages', 'links', ], ]); }); it('returns 200 OK for page and pageSize pagination query', function (): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; // WHEN $response = $test->getJson('/api/v1/inco-sheets?page=1&pageSize=2'); // THEN $response->assertStatus(200); $response->assertJsonPath('pagination.pageSize', 2); }); it('returns 200 OK for offset and limit pagination query', function (): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; // WHEN $response = $test->getJson('/api/v1/inco-sheets?offset=0&limit=2'); // THEN $response->assertStatus(200); $response->assertJsonPath('pagination.pageSize', 2); }); it('returns 200 OK for sorting query parameters', function (string $sortBy, string $direction): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; // WHEN $response = $test->getJson("/api/v1/inco-sheets?sortBy={$sortBy}&sortDirection={$direction}"); // THEN $response->assertStatus(200); })->with([ ['incoSheetId', 'Ascending'], ['createdAt', 'Descending'], ['updatedAt', 'Ascending'], ]); it('returns 200 OK with matching sheets filtered by BrandCode', function (): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; ArcadiaBrand::query()->firstOrCreate(['code' => 504], ['libelle' => 'LE GAULOIS PROFESSIONNEL']); $brand = app(BrandResolver::class)->resolve(new ArcadiaId('504')); IncoSheet::factory()->create([ 'id' => '9999001', 'name' => 'Produit Gaulois Pro', 'brand' => ['code' => 504, 'label' => 'LE GAULOIS PROFESSIONNEL'], ]); // WHEN $response = $test->getJson("/api/v1/inco-sheets?brands[]={$brand->code->value}"); // THEN $response->assertStatus(200); $response->assertJsonPath('incoSheets.0.id', '9999001') ->assertJsonPath('incoSheets.0.brand.code', $brand->code->value) ->assertJsonPath('incoSheets.0.brand.label', 'LE GAULOIS PROFESSIONNEL'); }); it('returns 422 Unprocessable Entity when brand code format is invalid', function (): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; // WHEN $response = $test->getJson('/api/v1/inco-sheets?brands[]=invalid'); // THEN $response->assertStatus(422); }); it('returns 200 OK with short form inco sheets when short parameter is true', function (): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; // WHEN $response = $test->getJson('/api/v1/inco-sheets?short=true'); // THEN $response->assertStatus(200); $response->assertJsonStructure([ 'incoSheets' => [ '*' => [ 'id', 'name', 'label', 'createdAt', 'updatedAt', ], ], 'pagination', ]); $firstItem = $response->json('incoSheets.0'); expect($firstItem) ->toHaveKeys(['id', 'name', 'label', 'createdAt', 'updatedAt']) ->and($firstItem)->not->toHaveKey('description') ->and($firstItem)->not->toHaveKey('allegations') ->and($firstItem)->not->toHaveKey('ingredients') ->and($firstItem)->not->toHaveKey('brand'); }); it('returns 200 OK with short form inco sheets when short parameter is numeric 1', function (): void { // GIVEN /** @var \Tests\TestCase $test */ $test = $this; // WHEN $response = $test->getJson('/api/v1/inco-sheets?short=1'); // THEN $response->assertStatus(200); $response->assertJsonStructure([ 'incoSheets' => [ '*' => [ 'id', 'name', 'label', 'createdAt', 'updatedAt', ], ], 'pagination', ]); $firstItem = $response->json('incoSheets.0'); expect($firstItem) ->toHaveKeys(['id', 'name', 'label', 'createdAt', 'updatedAt']) ->and($firstItem)->not->toHaveKey('description') ->and($firstItem)->not->toHaveKey('ingredients'); }); });