79 lines
3.3 KiB
PHP
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);
|
|
});
|
|
});
|