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->legalInformation)->toBe($legalInformation) ->and($coupon->code)->toBe($code) ->and($coupon->brandCode)->toBe($brandCode) ->and($coupon->createdBy)->toBe($createdBy) ->and($coupon->gtin)->toBe($gtin) ->and($coupon->updatedAt)->toBeNull() ->and($coupon->updatedAt())->toBeNull(); }); it('creates a coupon without gs1', 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([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); $legalInformation = [ new CouponLegalInformation( 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE ) ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $createdBy = ActorId::generate(); // WHEN $coupon = Coupon::hydrate( $id, $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legalInformation, $code, $brandCode, $createdBy, ); // THEN expect($coupon->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->legalInformation)->toBe($legalInformation) ->and($coupon->code)->toBe($code) ->and($coupon->brandCode)->toBe($brandCode) ->and($coupon->createdBy)->toBe($createdBy) ->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([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); $legalInformation = [ new CouponLegalInformation( 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE ) ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $gtin = new GS1('110101010', BarcodeFormat::EAN13); $createdBy = ActorId::generate(); $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, $legalInformation, $code, $brandCode, $createdBy, $gtin, $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([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); $legalInformation = [ new CouponLegalInformation( 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE ) ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $createdBy = ActorId::generate(); $gtin = new GS1('110101010', BarcodeFormat::EAN13); // WHEN $coupon = Coupon::create( $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legalInformation, $code, $brandCode, $createdBy, $gtin, ); // 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->legalInformation)->toBe($legalInformation) ->and($coupon->code)->toBe($code) ->and($coupon->brandCode)->toBe($brandCode) ->and($coupon->createdBy)->toBe($createdBy) ->and($coupon->gtin)->toBe($gtin) ->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([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); $legalInformation = [ new CouponLegalInformation( 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE ) ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $createdBy = ActorId::generate(); $gtin = new GS1('110101010', BarcodeFormat::EAN13); // WHEN $firstCoupon = Coupon::create( $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legalInformation, $code, $brandCode, $createdBy, $gtin ); $secondCoupon = Coupon::create( $name, $status, $productName, $amount, $picture, $product, $diffusion, $availability, $validity, $legalInformation, $code, $brandCode, $createdBy, $gtin ); // 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([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]), new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]), new CouponValidity(30, new DateTime('2026-11-30')), [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE)], new ProcessingCode('5425003944130'), new BrandCode('AAA01'), ActorId::generate(), new GS1('110101010', BarcodeFormat::EAN13), ); // 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')); }); });