refactor: ♻️ make sort required in campaign request list

This commit is contained in:
Corentin Huet 2026-10-02 17:13:05 +02:00
parent 5a59a92546
commit 0b7da69567
3 changed files with 26 additions and 22 deletions

View file

@ -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,
) {
}

View file

@ -25,7 +25,7 @@ interface CampaignRequestRepository extends Repository
*/
public function findAll(
Pagination $pagination,
?CampaignRequestSortCriteria $sortCriteria = null,
CampaignRequestSortCriteria $sortCriteria,
?CampaignRequestFilters $filters = null,
): Paginated;
}

View file

@ -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);