toBeInstanceOf(IncoShort::class) ->and($short)->toBeInstanceOf(Dto::class) ->and($short->id)->toBeInstanceOf(IncoId::class) ->and($short->id->value)->toBe('100') ->and($short->name)->toBe('Poulet rôti') ->and($short->libelle)->toBe('Poulet rôti 1kg') ->and($short->description)->toBe('Poulet rôti cuit prêt à consommer') ->and($short->created_at)->toBe($createdAt) ->and($short->updated_at)->toBe($updatedAt); }); it('can jsonSerialize complete IncoShort object graph', function (): void { // GIVEN $createdAt = new DateTimeImmutable('2024-01-01T10:00:00+00:00'); $updatedAt = new DateTimeImmutable('2024-06-01T12:00:00+00:00'); $short = createCompleteIncoShort(createdAt: $createdAt, updatedAt: $updatedAt); // WHEN $serialized = $short->jsonSerialize(); // THEN expect($serialized)->toBe([ 'id' => '100', 'name' => 'Poulet rôti', 'libelle' => 'Poulet rôti 1kg', 'description' => 'Poulet rôti cuit prêt à consommer', 'created_at' => $createdAt, 'updated_at' => $updatedAt, ]); $jsonEncoded = json_encode($short); expect($jsonEncoded)->toBeString(); $decoded = json_decode((string) $jsonEncoded, true); expect($decoded['id'])->toBe('100') ->and($decoded['name'])->toBe('Poulet rôti') ->and($decoded['libelle'])->toBe('Poulet rôti 1kg') ->and($decoded['description'])->toBe('Poulet rôti cuit prêt à consommer'); }); it('can instantiate IncoShort with null timestamps', function (): void { // GIVEN / WHEN $short = new IncoShort( id: new IncoId('200'), name: 'Dinde', libelle: 'Escalope de dinde', description: 'Escalope de dinde 500g', created_at: null, updated_at: null, ); // THEN expect($short->created_at)->toBeNull() ->and($short->updated_at)->toBeNull(); $serialized = $short->jsonSerialize(); expect($serialized)->toBe([ 'id' => '200', 'name' => 'Dinde', 'libelle' => 'Escalope de dinde', 'description' => 'Escalope de dinde 500g', 'created_at' => null, 'updated_at' => null, ]); }); });