ldc-mesbr-app/tests/Unit/Domain/Services/CampaignAvailabilityCheckerTest.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();
});
});