178 lines
5.4 KiB
PHP
178 lines
5.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Feature\Api\V1\IncoSheets;
|
|
|
|
use Domain\Models\ValueObjects\Brand\ArcadiaId;
|
|
use Domain\Services\BrandResolver;
|
|
use Infra\Database\Models\ArcadiaBrand;
|
|
use Infra\Database\Models\IncoSheet;
|
|
|
|
describe('IncoSheets Index Feature API', function (): void {
|
|
beforeEach(function (): void {
|
|
IncoSheet::factory()->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');
|
|
});
|
|
});
|