123 lines
4.2 KiB
PHP
123 lines
4.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Unit\Domain\Models\Entities;
|
|
|
|
use DateTimeInterface;
|
|
use Domain\Models\Entities\PrintableCoupon;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignCode;
|
|
use Domain\Models\ValueObjects\Coupon\CouponCode;
|
|
use Domain\Models\ValueObjects\Coupon\CouponName;
|
|
use Domain\Models\ValueObjects\CrmHashcode;
|
|
use Domain\Models\ValueObjects\PrintableCoupon\PrintableCouponCode;
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
covers(PrintableCoupon::class);
|
|
|
|
describe('printable coupon', function (): void {
|
|
$campaignCode = CampaignCode::generate();
|
|
$couponCode = new CouponCode('AAA01');
|
|
$couponName = new CouponName('Coupon name');
|
|
$crmCustomerHashcode = new CrmHashcode(Uuid::uuid4());
|
|
$distributableUntil = new \DateTimeImmutable('2027-01-01');
|
|
|
|
it('creates a printable coupon with the given values', function () use (
|
|
$campaignCode,
|
|
$couponCode,
|
|
$couponName,
|
|
$crmCustomerHashcode,
|
|
$distributableUntil,
|
|
): void {
|
|
// GIVEN / WHEN
|
|
$printable = PrintableCoupon::create(
|
|
$campaignCode,
|
|
$couponCode,
|
|
$couponName,
|
|
$crmCustomerHashcode,
|
|
$distributableUntil,
|
|
);
|
|
|
|
// THEN
|
|
expect($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())->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'));
|
|
});
|
|
});
|