ldc-mesbr-app/tests/Unit/Domain/Models/Entities/PrintableCouponTest.php
2026-10-20 17:39:31 +02:00

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'));
});
});