id())->toBe($id) ->and($coupon->name)->toBe($name) ->and($coupon->status)->toBe($status) ->and($coupon->productName)->toBe($productName) ->and($coupon->amount)->toBe($amount) ->and($coupon->picture)->toBe($picture) ->and($coupon->product)->toBe($product) ->and($coupon->diffusion)->toBe($diffusion) ->and($coupon->availability)->toBe($availability) ->and($coupon->validity)->toBe($validity) ->and($coupon->legal)->toBe($legal) ->and($coupon->gtin)->toBe($gtin) ->and($coupon->code)->toBe($code) ->and($coupon->brandCode)->toBe($brandCode) ->and($coupon->updatedAt)->toBeNull() ->and($coupon->updatedAt())->toBeNull(); }); it('creates a coupon with an explicit updatedAt date', function (): void { // GIVEN $id = CouponId::generate(); $name = new CouponName('Name'); $status = \boolval(0); $productName = new CouponProductName('Lorem ipsum'); $amount = new MoneyAmount(new Money(Currency::EUR, 1)); $picture = new CouponPicture(new PicturePath('files/product.jpg'), new PicturePath('files/thumbnail.jpg')); $product = new CouponProduct('Lorem ipsum', [], []); $diffusion = new CouponDiffusion(['2026-08-25', '2026-10-31']); $availability = new CouponAvailabilityCalendar(['2026-08-25', '2026-10-31']); $validity = new CouponValidity(30, new DateTime('2026-11-30')); $legal = new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR); $gtin = new GS1('110101010', BarcodeFormat::EAN13); $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $updatedAt = new \DateTimeImmutable('2026-09-22 10:00:00', new \DateTimeZone('UTC')); // WHEN $coupon = Coupon::hydrate( $id, $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legal, $gtin, $code, $brandCode, $updatedAt ); // THEN expect($coupon->updatedAt)->toBe($updatedAt) ->and($coupon->updatedAt())->toBe($updatedAt); }); it('creates a new coupon with a freshly generated id', function (): void { // GIVEN $name = new CouponName('Name'); $status = \boolval(0); $productName = new CouponProductName('Lorem ipsum'); $amount = new MoneyAmount(new Money(Currency::EUR, 1)); $picture = new CouponPicture(new PicturePath('files/product.jpg'), new PicturePath('files/thumbnail.jpg')); $product = new CouponProduct('Lorem ipsum', [], []); $diffusion = new CouponDiffusion(['2026-08-25', '2026-10-31']); $availability = new CouponAvailabilityCalendar(['2026-08-25', '2026-10-31']); $validity = new CouponValidity(30, new DateTime('2026-11-30')); $legal = new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR); $gtin = new GS1('110101010', BarcodeFormat::EAN13); $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); // WHEN $coupon = Coupon::create( $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legal, $gtin, $code, $brandCode ); // THEN expect($coupon->id())->toBeInstanceOf(CouponId::class) ->and($coupon->name)->toBe($name) ->and($coupon->status)->toBe($status) ->and($coupon->productName)->toBe($productName) ->and($coupon->amount)->toBe($amount) ->and($coupon->picture)->toBe($picture) ->and($coupon->product)->toBe($product) ->and($coupon->diffusion)->toBe($diffusion) ->and($coupon->availability)->toBe($availability) ->and($coupon->validity)->toBe($validity) ->and($coupon->legal)->toBe($legal) ->and($coupon->gtin)->toBe($gtin) ->and($coupon->code)->toBe($code) ->and($coupon->brandCode)->toBe($brandCode) ->and($coupon->updatedAt)->toBeNull() ->and($coupon->updatedAt())->toBeNull(); }); it('generates a different id for each created coupon', function (): void { // GIVEN $name = new CouponName('Name'); $status = \boolval(0); $productName = new CouponProductName('Lorem ipsum'); $amount = new MoneyAmount(new Money(Currency::EUR, 1)); $picture = new CouponPicture(new PicturePath('files/product.jpg'), new PicturePath('files/thumbnail.jpg')); $product = new CouponProduct('Lorem ipsum', [], []); $diffusion = new CouponDiffusion(['2026-08-25', '2026-10-31']); $availability = new CouponAvailabilityCalendar(['2026-08-25', '2026-10-31']); $validity = new CouponValidity(30, new DateTime('2026-11-30')); $legal = new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR); $gtin = new GS1('110101010', BarcodeFormat::EAN13); $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); // WHEN $firstCoupon = Coupon::create( $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legal, $gtin, $code, $brandCode ); $secondCoupon = Coupon::create( $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legal, $gtin, $code, $brandCode ); // THEN expect($firstCoupon->id()->equals($secondCoupon->id()))->toBeFalse(); }); it('returns the creation date extracted from the id', function (): void { // GIVEN $expected = new \DateTimeImmutable('2024-06-15 12:34:56.789000', new \DateTimeZone('UTC')); $id = new CouponId(Uuid::uuid7($expected)); $coupon = Coupon::hydrate( $id, new CouponName('Name'), \boolval(0), new CouponProductName('Lorem ipsum'), new MoneyAmount(new Money(Currency::EUR, 1)), new CouponPicture(new PicturePath('files/product.jpg'), new PicturePath('files/thumbnail.jpg')), new CouponProduct('Lorem ipsum', [], []), new CouponDiffusion(['2026-08-25', '2026-10-31']), new CouponAvailabilityCalendar(['2026-08-25', '2026-10-31']), new CouponValidity(30, new DateTime('2026-11-30')), new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR), new GS1('110101010', BarcodeFormat::EAN13), new ProcessingCode('5425003944130'), new BrandCode('AAA01') ); // WHEN $result = $coupon->createdAt(); // THEN expect($result->format('Y-m-d H:i:s.v'))->toBe($expected->format('Y-m-d H:i:s.v')); }); });