67 lines
2.6 KiB
PHP
67 lines
2.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Unit\Application\UseCases\Campaign\Find;
|
|
|
|
use Application\UseCases\Campaign\Find\FindCampaign;
|
|
use Application\UseCases\Campaign\Find\Input;
|
|
use Application\UseCases\Campaign\Find\Outputs\CampaignFound;
|
|
use Application\UseCases\Campaign\Find\Outputs\CampaignNotFound;
|
|
use Domain\Models\Entities\Campaign;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignCode;
|
|
use Domain\Ports\Repositories\CampaignRepository;
|
|
use Domain\Models\ValueObjects\PrintRules;
|
|
use Tests\Fixtures\Campaign\CampaignFactory;
|
|
|
|
covers(FindCampaign::class, Input::class, CampaignFound::class, CampaignNotFound::class);
|
|
|
|
describe('find campaign use case', function (): void {
|
|
$makeCampaign = static fn (array $couponCodes = ['COU01']): Campaign => CampaignFactory::hydrated(
|
|
published: true,
|
|
name: 'Campaign A',
|
|
printAllAtOnce: false,
|
|
couponCodes: $couponCodes,
|
|
printRules: new PrintRules(maxPerCustomer: 1),
|
|
);
|
|
|
|
it('finds a campaign by its code with paginated coupons', function () use ($makeCampaign): void {
|
|
// GIVEN
|
|
$campaign = $makeCampaign();
|
|
$repository = \Mockery::mock(CampaignRepository::class);
|
|
$repository->shouldReceive('findByCode')->once()->with($campaign->code)->andReturn($campaign);
|
|
|
|
$useCase = new FindCampaign($repository);
|
|
|
|
// WHEN
|
|
$result = $useCase->execute(new Input(code: $campaign->code));
|
|
|
|
// THEN
|
|
expect($result)->toBeInstanceOf(CampaignFound::class)
|
|
->and($result->name)->toBe($campaign->name)
|
|
->and($result->code)->toBe($campaign->code)
|
|
->and($result->brandCode)->toBe($campaign->brandCode)
|
|
->and($result->publication)->toBe($campaign->publication)
|
|
->and($result->printAllAtOnce)->toBe($campaign->printAllAtOnce)
|
|
->and($result->coupons)->toBe($campaign->coupons)
|
|
->and($result->coupons->value[0]->couponCode->value)->toBe('COU01')
|
|
->and($result->createdAt)->toEqual($campaign->createdAt())
|
|
->and($result->updatedAt)->toEqual($campaign->updatedAt());
|
|
});
|
|
|
|
it('returns CampaignNotFound when the code is not found', function (): void {
|
|
// GIVEN
|
|
$code = CampaignCode::generate();
|
|
|
|
$repository = \Mockery::mock(CampaignRepository::class);
|
|
$repository->shouldReceive('findByCode')->once()->with($code)->andReturn(null);
|
|
|
|
$useCase = new FindCampaign($repository);
|
|
|
|
// WHEN
|
|
$result = $useCase->execute(new Input(code: $code));
|
|
|
|
// WHEN / THEN
|
|
expect($result)->toBeInstanceOf(CampaignNotFound::class);
|
|
});
|
|
});
|