campaignCode)->toBe($campaignCode) ->and($printable->couponCode)->toBe($couponCode) ->and($printable->couponName)->toBe($couponName) ->and($printable->crmCustomerHashcode)->toBe($crmCustomerHashcode) ->and($printable->distributableUntil)->toBe($distributableUntil) ->and($printable->createdAt())->toBeInstanceOf(DateTimeInterface::class) ->and($printable->updatedAt())->toBeNull(); }); it('generates a new code on each creation', function () use ( $campaignCode, $couponCode, $couponName, $crmCustomerHashcode, $distributableUntil, ): void { // GIVEN / WHEN $first = PrintableCoupon::create($campaignCode, $couponCode, $couponName, $crmCustomerHashcode, $distributableUntil); $second = PrintableCoupon::create($campaignCode, $couponCode, $couponName, $crmCustomerHashcode, $distributableUntil); // THEN expect($first->code)->toBeInstanceOf(PrintableCouponCode::class) ->and($first->code->equals($second->code))->toBeFalse(); }); it('hydrates a printable coupon with the given values', function () use ( $campaignCode, $couponCode, $couponName, $crmCustomerHashcode, $distributableUntil, ): void { // GIVEN $code = PrintableCouponCode::generate(); // WHEN $printable = PrintableCoupon::hydrate( $code, $campaignCode, $couponCode, $couponName, $crmCustomerHashcode, $distributableUntil, ); // THEN expect($printable->code)->toBe($code) ->and($printable->campaignCode)->toBe($campaignCode) ->and($printable->couponCode)->toBe($couponCode) ->and($printable->couponName)->toBe($couponName) ->and($printable->crmCustomerHashcode)->toBe($crmCustomerHashcode) ->and($printable->distributableUntil)->toBe($distributableUntil) ->and($printable->createdAt())->toBeInstanceOf(DateTimeInterface::class) ->and($printable->updatedAt())->toBeInstanceOf(DateTimeInterface::class); }); it('returns the creation date extracted from the id', function () use ( $campaignCode, $couponCode, $couponName, $crmCustomerHashcode, $distributableUntil, ): void { // GIVEN $expected = new \DateTimeImmutable('2024-06-15 12:34:56.789000', new \DateTimeZone('UTC')); $code = new PrintableCouponCode(Uuid::uuid7($expected)); $printableCoupon = PrintableCoupon::hydrate( $code, $campaignCode, $couponCode, $couponName, $crmCustomerHashcode, $distributableUntil, ); // WHEN $result = $printableCoupon->createdAt(); // THEN expect($result->format('Y-m-d H:i:s.v'))->toBe($expected->format('Y-m-d H:i:s.v')); }); });