From 0b7da6956793e11c1086e66cbf842e15cd539f4e Mon Sep 17 00:00:00 2001 From: Corentin Huet Date: Fri, 2 Oct 2026 17:13:05 +0200 Subject: [PATCH] refactor: :recycle: make sort required in campaign request list --- .../UseCases/CampaignRequest/List/Input.php | 2 +- .../CampaignRequestRepository.php | 2 +- .../List/ListCampaignsRequestTest.php | 44 ++++++++++--------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/Application/UseCases/CampaignRequest/List/Input.php b/src/Application/UseCases/CampaignRequest/List/Input.php index 9b2802c..5683492 100644 --- a/src/Application/UseCases/CampaignRequest/List/Input.php +++ b/src/Application/UseCases/CampaignRequest/List/Input.php @@ -13,7 +13,7 @@ final readonly class Input implements UseCaseInput { public function __construct( public Pagination $pagination, - public ?CampaignRequestSortCriteria $sort = null, + public CampaignRequestSortCriteria $sort, public ?CampaignRequestFilters $filters = null, ) { } diff --git a/src/Domain/Ports/Repositories/CampaignRequestRepository.php b/src/Domain/Ports/Repositories/CampaignRequestRepository.php index 909202a..4b9c521 100644 --- a/src/Domain/Ports/Repositories/CampaignRequestRepository.php +++ b/src/Domain/Ports/Repositories/CampaignRequestRepository.php @@ -25,7 +25,7 @@ interface CampaignRequestRepository extends Repository */ public function findAll( Pagination $pagination, - ?CampaignRequestSortCriteria $sortCriteria = null, + CampaignRequestSortCriteria $sortCriteria, ?CampaignRequestFilters $filters = null, ): Paginated; } diff --git a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php index aa717b2..cfb1914 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php @@ -71,11 +71,18 @@ describe('list campaigns request use case', function (): void { new PrintRules(maxPerCustomer: 3), new GS1('01234567890128', BarcodeFormat::EAN13) ); + + $this->pagination = Pagination::firstPage(); + + $this->sort = new CampaignRequestSortCriteria( + clauses: [ + new CampaignRequestSortClause(field: CampaignRequestSortField::CreatedAt, direction: \SortDirection::Descending), + ] + ); }); it('maps repository campaigns request to list items, preserving pagination and sort', function (): void { // GIVEN - $pagination = Pagination::firstPage(); $campaignRequest1 = CampaignRequest::hydrate( CampaignRequestId::generate(), new BrandCode('AAA01'), @@ -94,7 +101,7 @@ describe('list campaigns request use case', function (): void { $this->couponB, CampaignRequestStatus::CREATED, ); - $paginated = new Paginated($pagination, [$campaignRequest1, $campaignRequest2], 2); + $paginated = new Paginated($this->pagination, [$campaignRequest1, $campaignRequest2], 2); $sort = new CampaignRequestSortCriteria( clauses: [ @@ -103,12 +110,12 @@ describe('list campaigns request use case', function (): void { ] ); $filters = new CampaignRequestFilters($campaignRequest2->brandCode, CampaignRequestStatus::CREATED); - $input = new Input(pagination: $pagination, sort: $sort, filters: $filters); + $input = new Input(pagination: $this->pagination, sort: $sort, filters: $filters); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findAll') ->once() - ->with($pagination, CampaignRequestSortCriteria::class, CampaignRequestFilters::class) + ->with($this->pagination, CampaignRequestSortCriteria::class, CampaignRequestFilters::class) ->andReturn($paginated); $useCase = new ListCampaignsRequest($repository); @@ -128,12 +135,11 @@ describe('list campaigns request use case', function (): void { ->and($items[0]->campaignType)->toBe($campaignRequest1->campaignType) ->and($items[0]->status)->toBe($campaignRequest1->status) ->and($result->campaignsRequest->getTotal())->toBe(2) - ->and($result->campaignsRequest->getPagination())->toBe($pagination); + ->and($result->campaignsRequest->getPagination())->toBe($this->pagination); }); - it('lists campaigns request with filters but without sort', function (): void { + it('lists campaigns request with filters', function (): void { // GIVEN - $pagination = Pagination::firstPage(); $campaignRequest = CampaignRequest::hydrate( CampaignRequestId::generate(), new BrandCode('AAA01'), @@ -143,15 +149,15 @@ describe('list campaigns request use case', function (): void { $this->couponA, CampaignRequestStatus::CREATED, ); - $paginated = new Paginated($pagination, [$campaignRequest], 1); + $paginated = new Paginated($this->pagination, [$campaignRequest], 1); $filters = new CampaignRequestFilters($campaignRequest->brandCode, CampaignRequestStatus::CREATED); - $input = new Input(pagination: $pagination, filters: $filters); + $input = new Input(pagination: $this->pagination, sort: $this->sort, filters: $filters); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findAll') ->once() - ->with($pagination, null, $filters) + ->with($this->pagination, $this->sort, $filters) ->andReturn($paginated); $useCase = new ListCampaignsRequest($repository); @@ -167,12 +173,11 @@ describe('list campaigns request use case', function (): void { ->and($items[0]->name)->toBe($campaignRequest->name) ->and($items[0]->status)->toBe($campaignRequest->status) ->and($result->campaignsRequest->getTotal())->toBe(1) - ->and($result->campaignsRequest->getPagination())->toBe($pagination); + ->and($result->campaignsRequest->getPagination())->toBe($this->pagination); }); it('lists campaigns request with sort but without filters', function (): void { // GIVEN - $pagination = Pagination::firstPage(); $campaignRequest1 = CampaignRequest::hydrate( CampaignRequestId::generate(), new BrandCode('AAA01'), @@ -191,19 +196,19 @@ describe('list campaigns request use case', function (): void { $this->couponB, CampaignRequestStatus::CREATED, ); - $paginated = new Paginated($pagination, [$campaignRequest2, $campaignRequest1], 2); + $paginated = new Paginated($this->pagination, [$campaignRequest2, $campaignRequest1], 2); $sort = new CampaignRequestSortCriteria( clauses: [ new CampaignRequestSortClause(field: CampaignRequestSortField::BrandCode, direction: \SortDirection::Descending), ] ); - $input = new Input(pagination: $pagination, sort: $sort); + $input = new Input(pagination: $this->pagination, sort: $sort); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findAll') ->once() - ->with($pagination, $sort, null) + ->with($this->pagination, $sort, null) ->andReturn($paginated); $useCase = new ListCampaignsRequest($repository); @@ -217,19 +222,18 @@ describe('list campaigns request use case', function (): void { ->and($items[0]->brandCode)->toBe($campaignRequest2->brandCode) ->and($items[1]->brandCode)->toBe($campaignRequest1->brandCode) ->and($result->campaignsRequest->getTotal())->toBe(2) - ->and($result->campaignsRequest->getPagination())->toBe($pagination); + ->and($result->campaignsRequest->getPagination())->toBe($this->pagination); }); it('returns an empty list without error when there are no campaigns request', function (): void { // GIVEN - $pagination = Pagination::firstPage(); - $paginated = new Paginated($pagination, [], 0); - $input = new Input(pagination: $pagination); + $paginated = new Paginated($this->pagination, [], 0); + $input = new Input(pagination: $this->pagination, sort: $this->sort); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findAll') ->once() - ->with($pagination, null, null) + ->with($this->pagination, $this->sort, null) ->andReturn($paginated); $useCase = new ListCampaignsRequest($repository);