ldc-mesbr-app/tests/Unit/Application/UseCases/Campaign/Find/FindCampaignTest.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);
});
});