87 lines
2.9 KiB
PHP
87 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Unit\Application\UseCases\Campaign\Update;
|
|
|
|
use Domain\Ports\Repositories\CouponRepository;
|
|
use Domain\Services\Campaign\CampaignAvailabilityChecker;
|
|
use Tests\Fixtures\Campaign\CampaignFactory;
|
|
use Tests\Fixtures\Coupon\CouponFactory;
|
|
|
|
covers(CampaignAvailabilityChecker::class);
|
|
|
|
describe('campaign availability checker', function (): void {
|
|
$makeRepository = static function (array $campaignCodes, array $coupons): CouponRepository {
|
|
$repository = \Mockery::mock(CouponRepository::class);
|
|
$repository->shouldReceive('findByCodes')
|
|
->once()
|
|
->with(\Mockery::on(
|
|
static fn (array $codes): bool => array_map(
|
|
static fn ($code): string => $code->value,
|
|
$codes,
|
|
) === $campaignCodes,
|
|
))
|
|
->andReturn($coupons);
|
|
|
|
return $repository;
|
|
};
|
|
|
|
it('is available with an active coupon', function () use ($makeRepository): void {
|
|
// GIVEN
|
|
$campaign = CampaignFactory::hydrated(couponCodes: ['COU01']);
|
|
$repository = $makeRepository(['COU01'], [CouponFactory::make('COU01')]);
|
|
$service = new CampaignAvailabilityChecker($repository);
|
|
|
|
// WHEN
|
|
$result = $service->hasActiveCoupon($campaign);
|
|
|
|
// THEN
|
|
expect($result)->toBeTrue();
|
|
});
|
|
|
|
it('is available with one active and one expired coupon', function () use ($makeRepository): void {
|
|
// GIVEN
|
|
$campaign = CampaignFactory::hydrated(couponCodes: ['COU01', 'COU02']);
|
|
$repository = $makeRepository(['COU01', 'COU02'], [
|
|
CouponFactory::expired('COU01'),
|
|
CouponFactory::make('COU02'),
|
|
]);
|
|
$service = new CampaignAvailabilityChecker($repository);
|
|
|
|
// WHEN
|
|
$result = $service->hasActiveCoupon($campaign);
|
|
|
|
// THEN
|
|
expect($result)->toBeTrue();
|
|
});
|
|
|
|
it('is not available when every coupon is expired or upcoming', function () use ($makeRepository): void {
|
|
// GIVEN
|
|
$campaign = CampaignFactory::hydrated(couponCodes: ['COU01', 'COU02']);
|
|
$repository = $makeRepository(['COU01', 'COU02'], [
|
|
CouponFactory::expired('COU01'),
|
|
CouponFactory::upcoming('COU02'),
|
|
]);
|
|
$service = new CampaignAvailabilityChecker($repository);
|
|
|
|
// WHEN
|
|
$result = $service->hasActiveCoupon($campaign);
|
|
|
|
// THEN
|
|
expect($result)->toBeFalse();
|
|
});
|
|
|
|
it('is not available when no coupon is found', function () use ($makeRepository): void {
|
|
// GIVEN
|
|
$campaign = CampaignFactory::hydrated(couponCodes: ['COU01']);
|
|
$repository = $makeRepository(['COU01'], []);
|
|
$service = new CampaignAvailabilityChecker($repository);
|
|
|
|
// WHEN
|
|
$result = $service->hasActiveCoupon($campaign);
|
|
|
|
// THEN
|
|
expect($result)->toBeFalse();
|
|
});
|
|
});
|