|null $items * @return PageOf */ function createCompletePageOf( ?PaginationDto $pagination = null, ?array $items = null, ): PageOf { $pagination ??= new PaginationDto( page: 1, pageSize: 2, totalItems: 5, totalPages: 3, ); /** @var array $actualItems */ $actualItems = $items ?? [ new Brand(new BrandCode('LGL39'), 'Le Gaulois'), new Brand(new BrandCode('MAI01'), 'Maître CoQ'), ]; return new PageOf($pagination, $actualItems); } describe('PageOf DTO test', function (): void { it('can instantiate PageOf with complete DTO object graph', function (): void { // GIVEN $pagination = new PaginationDto(page: 1, pageSize: 2, totalItems: 5, totalPages: 3); $brand1 = new Brand(new BrandCode('LGL39'), 'Le Gaulois'); $brand2 = new Brand(new BrandCode('MAI01'), 'Maître CoQ'); // WHEN $page = createCompletePageOf($pagination, [$brand1, $brand2]); // THEN expect($page)->toBeInstanceOf(PageOf::class) ->and($page)->toBeInstanceOf(Dto::class) ->and($page->pagination())->toBe($pagination) ->and($page->items())->toHaveCount(2) ->and($page->items()[0])->toBe($brand1) ->and($page->items()[1])->toBe($brand2); }); it('can jsonSerialize complete PageOf graph recursively', function (): void { // GIVEN $page = createCompletePageOf(); // WHEN $serialized = $page->jsonSerialize(); // THEN expect($serialized)->toBeArray() ->and($serialized)->toHaveKey('pagination') ->and($serialized)->toHaveKey('items') ->and($serialized['pagination'])->toBeInstanceOf(PaginationDto::class) ->and($serialized['items'])->toHaveCount(2) ->and($serialized['items'][0])->toBeInstanceOf(Brand::class); $jsonEncoded = json_encode($page); expect($jsonEncoded)->toBeString(); $decoded = json_decode((string) $jsonEncoded, true); expect($decoded)->toBeArray() ->and($decoded['pagination']['page'])->toBe(1) ->and($decoded['pagination']['pageSize'])->toBe(2) ->and($decoded['pagination']['totalItems'])->toBe(5) ->and($decoded['pagination']['totalPages'])->toBe(3) ->and($decoded['items'])->toHaveCount(2) ->and($decoded['items'][0]['code'])->toBe('LGL39') ->and($decoded['items'][0]['label'])->toBe('Le Gaulois') ->and($decoded['items'][1]['code'])->toBe('MAI01') ->and($decoded['items'][1]['label'])->toBe('Maître CoQ'); }); it('re-indexes associative array keys for items', function (): void { // GIVEN $brand1 = new Brand(new BrandCode('LGL39'), 'Le Gaulois'); $brand2 = new Brand(new BrandCode('MAI01'), 'Maître CoQ'); // WHEN $page = createCompletePageOf(items: [ 'first' => $brand1, 'second' => $brand2, ]); // THEN expect(array_keys($page->items()))->toBe([0, 1]) ->and($page->items()[0])->toBe($brand1) ->and($page->items()[1])->toBe($brand2); }); it('can instantiate an empty PageOf', function (): void { // GIVEN $pagination = new PaginationDto(page: 1, pageSize: 10, totalItems: 0, totalPages: 0); // WHEN $page = new PageOf($pagination, []); // THEN expect($page->items())->toBeEmpty() ->and($page->pagination()->totalItems)->toBe(0) ->and($page->pagination()->totalPages)->toBe(0); $serialized = $page->jsonSerialize(); expect($serialized['items'])->toBe([]); }); });