id())->toBe($id) ->and($coupon->name)->toBe($name) ->and($coupon->productName)->toBe($productName) ->and($coupon->quantity)->toBe($quantity) ->and($coupon->warningThresholdQuantity)->toBe($warningThresholdQuantity) ->and($coupon->period)->toBe($period) ->and($coupon->moneyAmount)->toBe($moneyAmount) ->and($coupon->processingCode)->toBe($processingCode) ->and($coupon->couponPicture)->toBe($couponPicture) ->and($coupon->gs1)->toBe($gs1) ->and($coupon->couponValidity)->toBe($couponValidity) ->and($coupon->updatedAt)->toBeNull() ->and($coupon->updatedAt())->toBeNull(); }); it('hydrates a requested coupon with an explicit updatedAt date', function (): void { // GIVEN $updatedAt = new \DateTimeImmutable('2026-06-15 12:00:00', new \DateTimeZone('UTC')); // WHEN $coupon = RequestedCoupon::hydrate( RequestedCouponId::generate(), new CouponName('Coupon A'), new CouponProductName('Product A'), 100, 10, new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01')), new MoneyAmount(new Money(Currency::EUR, 300)), new ProcessingCode('PC1'), new CouponPicture(new PicturePath('coupons/product.jpg'), new PicturePath('coupons/thumbnail.jpg')), new GS1('01234567890128', BarcodeFormat::EAN13), new CouponValidity(30, DateTime::now()), $updatedAt, ); // THEN expect($coupon->updatedAt)->toBe($updatedAt) ->and($coupon->updatedAt())->toBe($updatedAt); }); 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 RequestedCouponId(Uuid::uuid7($expected)); $coupon = RequestedCoupon::hydrate( $id, new CouponName('Coupon A'), new CouponProductName('Product A'), 100, 10, new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01')), new MoneyAmount(new Money(Currency::EUR, 300)), new ProcessingCode('PC1'), new CouponPicture(new PicturePath('coupons/product.jpg'), new PicturePath('coupons/thumbnail.jpg')), new GS1('01234567890128', BarcodeFormat::EAN13), new CouponValidity(30, DateTime::now()), ); // 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')); }); });