ldc-mesbr-app/tests/Unit/Domain/Models/ValueObjects/Campaign/CampaignCouponArrayTest.php

170 lines
4.9 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace Tests\Unit\Domain\Models\ValueObjects\Campaign;
use Domain\Models\ValueObjects\Campaign\CampaignCoupon;
use Domain\Models\ValueObjects\Campaign\CampaignCouponArray;
use Domain\Models\ValueObjects\Coupon\CouponCode;
use Domain\Models\ValueObjects\PrintRules;
covers(CampaignCouponArray::class);
describe('campaign coupon array', function (): void {
$coupon = new CampaignCoupon(
CouponCode::generate(),
new PrintRules(maxPerCustomer: 3),
);
$coupon2 = new CampaignCoupon(
CouponCode::generate(),
new PrintRules(maxPerCustomer: 3),
);
it('creates an array with valid coupons', function () use ($coupon, $coupon2): void {
// GIVEN
$coupons = [$coupon, $coupon2];
// WHEN
$array = new CampaignCouponArray($coupons);
// THEN
expect($array->toArray())->toBe($coupons)
->and($array->toArray())->toHaveCount(2);
});
it('rejects an empty array', function (): void {
// GIVEN / WHEN
$action = fn (): CampaignCouponArray => new CampaignCouponArray([]);
// THEN
expect($action)->toThrow(\DomainException::class, 'Coupons requires at least one CampaignCoupon.');
});
it('rejects a non-coupon element', function (): void {
// GIVEN / WHEN
$action = fn (): CampaignCouponArray => new CampaignCouponArray(['PC1']);
// THEN
expect($action)->toThrow(
\DomainException::class,
'CampaignCouponArray only accepts CampaignCoupon.'
);
});
it('rejects a non-coupon element mixed with valid coupons', function () use ($coupon): void {
// GIVEN
$coupons = [$coupon, 'PC1'];
// WHEN
$action = fn (): CampaignCouponArray => new CampaignCouponArray($coupons);
// THEN
expect($action)->toThrow(
\DomainException::class,
'CampaignCouponArray only accepts CampaignCoupon.'
);
});
it('rejects the same coupon twice at initialisation', function (): void {
// GIVEN
$couponCode = CouponCode::generate();
$coupons = [
new CampaignCoupon($couponCode),
new CampaignCoupon($couponCode),
];
// WHEN
$action = fn (): CampaignCouponArray => new CampaignCouponArray($coupons);
//WHEN / THEN
expect($action)->toThrow(\DomainException::class, sprintf(
'"%s" is present more than once.',
$couponCode
));
});
it('adds a coupon to a campaign coupon array', function (): void {
// GIVEN
$coupons = [
new CampaignCoupon(CouponCode::generate()),
new CampaignCoupon(CouponCode::generate()),
];
2026-10-22 10:43:36 +02:00
$array = new CampaignCouponArray($coupons);
// WHEN
$array = $array->addCoupon(new CampaignCoupon(CouponCode::generate()));
// THEN
expect($array->toArray())->toHaveCount(3);
});
it('removes a coupon to a campaign coupon array', function () use ($coupon, $coupon2): void {
// GIVEN
$coupons = [$coupon, $coupon2];
2026-10-22 10:43:36 +02:00
$array = new CampaignCouponArray($coupons);
// WHEN
$array = $array->removeCoupon($coupon2->couponCode);
// THEN
expect($array->toArray())->toHaveCount(1);
});
it('cant remove a coupon which is not on the campaign', function (): void {
// GIVEN
$coupons = [
new CampaignCoupon(CouponCode::generate()),
new CampaignCoupon(CouponCode::generate()),
];
$array = new CampaignCouponArray($coupons);
$couponCodeToRemove = CouponCode::generate();
// WHEN
$action = fn () => $array->removeCoupon($couponCodeToRemove);
// THEN
expect($action)->toThrow(\DomainException::class, sprintf(
'"%s" is not in the set.',
$couponCodeToRemove
));
});
it('returns all coupon codes', function () use ($coupon, $coupon2): void {
// GIVEN
$coupons = [$coupon, $coupon2];
2026-10-22 10:43:36 +02:00
$array = new CampaignCouponArray($coupons);
// WHEN
$result = $array->getCouponCodes();
// THEN
expect($result)->toBe([$coupon->couponCode, $coupon2->couponCode]);
});
it('returns the requested coupon', function () use ($coupon, $coupon2): void {
// GIVEN
$coupons = [$coupon, $coupon2];
2026-10-22 10:43:36 +02:00
$array = new CampaignCouponArray($coupons);
// WHEN
$result = $array->findCoupon($coupon->couponCode);
// THEN
expect($result)->toBe($coupon);
});
it('returns null for an unexisting coupon', function () use ($coupon, $coupon2): void {
// GIVEN
$coupons = [$coupon];
2026-10-22 10:43:36 +02:00
$array = new CampaignCouponArray($coupons);
// WHEN
$result = $array->findCoupon($coupon2->couponCode);
// THEN
expect($result)->toBeNull();
});
});