fix: US2.4 - Review feedbacks - Removed pagination from find output

This commit is contained in:
Noah Lancien 2026-10-27 16:15:31 +01:00
parent f50cd625b0
commit 20f7f32bbd
4 changed files with 8 additions and 48 deletions

View file

@ -11,7 +11,6 @@ use Domain\Ports\Repositories\CampaignRepository;
use Shared\DDD\UseCases\Input as BaseInput;
use Shared\DDD\UseCases\Output;
use Shared\DDD\UseCases\UseCase;
use Shared\ValueObjects\Pagination\Paginated;
use Webmozart\Assert\Assert;
/** @implements UseCase<\Application\UseCases\Campaign\Find\Input, \Shared\DDD\UseCases\Output> */
@ -33,25 +32,13 @@ final readonly class FindCampaign implements UseCase
return new CampaignNotFound();
}
$allCampaignCoupons = $campaign->coupons->value;
$couponsToDisplay = array_slice(
$allCampaignCoupons,
$input->couponsPagination->from(),
$input->couponsPagination->pageSize(),
);
return new CampaignFound(
name: $campaign->name,
code: $campaign->code,
brandCode: $campaign->brandCode,
publication: $campaign->publication,
printAllAtOnce: $campaign->printAllAtOnce,
coupons: new Paginated(
pagination: $input->couponsPagination,
items: $couponsToDisplay,
total: count($allCampaignCoupons),
),
coupons: $campaign->coupons,
createdAt: $campaign->createdAt(),
updatedAt: $campaign->updatedAt(),
);

View file

@ -6,13 +6,11 @@ namespace Application\UseCases\Campaign\Find;
use Domain\Models\ValueObjects\Campaign\CampaignCode;
use Shared\DDD\UseCases\Input as UseCaseInput;
use Shared\ValueObjects\Pagination\Pagination;
final readonly class Input implements UseCaseInput
{
public function __construct(
public CampaignCode $code,
public Pagination $couponsPagination,
) {
}
}

View file

@ -6,20 +6,18 @@ namespace Application\UseCases\Campaign\Find\Outputs;
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\CampaignName;
use Shared\ValueObjects\Pagination\Paginated;
final readonly class CampaignFound implements Output
{
/** @param Paginated<CampaignCoupon> $coupons */
public function __construct(
public CampaignName $name,
public CampaignCode $code,
public BrandCode $brandCode,
public bool $publication,
public bool $printAllAtOnce,
public Paginated $coupons,
public CampaignCouponArray $coupons,
public \DateTimeInterface $createdAt,
public ?\DateTimeInterface $updatedAt,
) {

View file

@ -8,13 +8,10 @@ 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 Application\UseCases\Campaign\Find\Outputs\Output;
use Domain\Models\Entities\Campaign;
use Domain\Models\ValueObjects\Campaign\CampaignCode;
use Domain\Ports\Repositories\CampaignRepository;
use Shared\DDD\UseCases\Input as BaseInput;
use Domain\Models\ValueObjects\PrintRules;
use Shared\ValueObjects\Pagination\Pagination;
use Tests\Fixtures\Campaign\CampaignFactory;
covers(FindCampaign::class, Input::class, CampaignFound::class, CampaignNotFound::class);
@ -31,14 +28,13 @@ describe('find campaign use case', function (): void {
it('finds a campaign by its code with paginated coupons', function () use ($makeCampaign): void {
// GIVEN
$campaign = $makeCampaign();
$pagination = Pagination::firstPage();
$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, couponsPagination: $pagination));
$result = $useCase->execute(new Input(code: $campaign->code));
// THEN
expect($result)->toBeInstanceOf(CampaignFound::class)
@ -47,16 +43,14 @@ describe('find campaign use case', function (): void {
->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())
->and($result->coupons->getItems())->toEqual($campaign->coupons->value)
->and($result->coupons->getTotal())->toBe(1)
->and($result->coupons->getPagination()->equals($pagination))->toBeTrue();
->and($result->updatedAt)->toEqual($campaign->updatedAt());
});
it('returns CampaignNotFound when the code is not found', function (): void {
// GIVEN
$pagination = Pagination::firstPage();
$code = CampaignCode::generate();
$repository = \Mockery::mock(CampaignRepository::class);
@ -65,26 +59,9 @@ describe('find campaign use case', function (): void {
$useCase = new FindCampaign($repository);
// WHEN
$result = $useCase->execute(new Input(code: $code, couponsPagination: $pagination));
$result = $useCase->execute(new Input(code: $code));
// WHEN / THEN
expect($result)->toBeInstanceOf(CampaignNotFound::class);
});
});
describe('find campaign use case assertions', function (): void {
it('rejects an input of the wrong type', function (): void {
// GIVEN
$repository = \Mockery::mock(CampaignRepository::class);
$useCase = new FindCampaign($repository);
$invalidInput = new class () implements BaseInput
{
};
// WHEN
$action = fn (): Output => $useCase->execute($invalidInput);
// THEN
expect($action)->toThrow(\InvalidArgumentException::class);
});
});