ldc-mesbr-app/tests/Unit/Application/UseCases/Campaign/Create/CreateCampaignTest.php
2026-10-20 17:39:31 +02:00

79 lines
3.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Unit\Application\UseCases\Campaign\Create;
use Application\UseCases\Campaign\Create\Outputs\CampaignCreated;
use Application\UseCases\Campaign\Create\Outputs\CampaignCreationFailed;
use Application\UseCases\Campaign\Create\CreateCampaign;
use Application\UseCases\Campaign\Create\Input;
use Application\UseCases\Campaign\Create\Outputs\CreateCampaignError;
use Domain\Models\Entities\Campaign;
use Domain\Models\ValueObjects\Actor\ActorId;
use Domain\Models\ValueObjects\Brand\BrandCode;
use Domain\Models\ValueObjects\Campaign\CampaignCode;
use Domain\Models\ValueObjects\Campaign\CampaignCoupon;
use Domain\Models\ValueObjects\Campaign\CampaignCouponArray;
use Domain\Models\ValueObjects\Campaign\CampaignId;
use Domain\Models\ValueObjects\Campaign\CampaignName;
use Domain\Models\ValueObjects\Coupon\CouponCode;
use Domain\Ports\Repositories\CampaignRepository;
use Domain\Models\ValueObjects\PrintRules;
covers(CreateCampaign::class, Input::class, CampaignCreated::class, CampaignCreationFailed::class);
describe('create campaign use case', function (): void {
$makeInput = fn (array $overrides = []): Input => new Input(...array_merge([
'name' => new CampaignName('Name'),
'brandCode' => new BrandCode('AAA01'),
'printAllAtOnce' => false,
'coupons' => new CampaignCouponArray([
new CampaignCoupon(new CouponCode('COU01'), new PrintRules(maxPerCustomer: 1)),
new CampaignCoupon(new CouponCode('COU02'), new PrintRules(cooldownDays: 30)),
]),
'createdBy' => ActorId::generate(),
], $overrides));
it('creates a campaign when the name is unique', function () use ($makeInput): void {
// GIVEN
$input = $makeInput();
$repository = \Mockery::mock(CampaignRepository::class);
$repository->shouldReceive('existsByName')->once()->with($input->name)->andReturn(false);
$repository->shouldReceive('save')->once()->with(\Mockery::type(Campaign::class));
$useCase = new CreateCampaign($repository);
// WHEN
$result = $useCase->execute($input);
// THEN
expect($result)->toBeInstanceOf(CampaignCreated::class)
->and($result->code)->toBeInstanceOf(CampaignCode::class)
->and($result->name)->toEqual($input->name)
->and($result->publication)->toBeFalse()
->and($result->printAllAtOnce)->toBeFalse()
->and($result->brandCode)->toBeInstanceOf(BrandCode::class)
->and($result->brandCode)->toEqual($input->brandCode)
->and($result->actorId)->toEqual($input->createdBy)
->and($result->coupons)->toEqual($input->coupons);
});
it('throws when the campaign name already exists', function () use ($makeInput): void {
// GIVEN
$input = $makeInput();
$repository = \Mockery::mock(CampaignRepository::class);
$repository->shouldReceive('existsByName')->once()->with($input->name)->andReturn(true);
$useCase = new CreateCampaign($repository);
// WHEN
$result = $useCase->execute($input);
// THEN
expect($result)->toBeInstanceOf(CampaignCreationFailed::class)
->and($result->error)->toBe(CreateCampaignError::CampaignNameAlreadyExists);
});
});