shouldReceive('findById')->once()->with($id)->andReturn($campaignRequest); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('findByCode')->once()->with($brandCode)->andReturn($brand); $useCase = new FindCampaignRequest($repository, $brandRepository); // WHEN $result = $useCase->execute(new Input(id: $id)); // THEN expect($result)->toBeInstanceOf(CampaignRequestFound::class) ->and($result->brand)->toBe($brand) ->and($result->name)->toBe($campaignRequest->name) ->and($result->applicant)->toBe($campaignRequest->applicant) ->and($result->campaignType)->toBe($campaignRequest->campaignType) ->and($result->requestedCoupon)->toBe($campaignRequest->requestedCoupon) ->and($result->status)->toBe($campaignRequest->status) ->and($result->rejectionReason)->toBeNull(); }); it('finds a rejected campaign request with its rejection reason', function () use ($requestedCoupon): void { // GIVEN $id = CampaignRequestId::generate(); $code = new BrandCode('AAA01'); $rejectionReason = new RejectionReason('Missing legal documents.'); $campaignRequest = CampaignRequest::hydrate( id: $id, brandCode: $code, name: new CampaignName('Campaign A'), applicant: new Applicant('John', 'Doe', new Email('john.doe@example.com')), campaignType: CampaignRequestType::CLUB, requestedCoupon: $requestedCoupon, status: CampaignRequestStatus::REJECTED, rejectionReason: $rejectionReason, ); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findById')->once()->with($id)->andReturn($campaignRequest); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('findByCode')->once()->with($code)->andReturn( Brand::hydrate( id: BrandId::generate(), code: $code, name: new BrandName('Brand A'), logo: new PicturePath('brands/logo.jpg'), rcs: new Rcs('RCS PARIS 111 222 333'), contact: new Email('contact@example.com'), ) ); $useCase = new FindCampaignRequest($repository, $brandRepository); // WHEN $result = $useCase->execute(new Input(id: $id)); // THEN expect($result)->toBeInstanceOf(CampaignRequestFound::class) ->and($result->status)->toBe(CampaignRequestStatus::REJECTED) ->and($result->rejectionReason)->toBe($rejectionReason); }); it('returns CampaignRequestNotFound when the id is not found', function (): void { // GIVEN $id = CampaignRequestId::generate(); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findById')->once()->with($id)->andReturn(null); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldNotReceive('findByCode'); $useCase = new FindCampaignRequest($repository, $brandRepository); // WHEN $result = $useCase->execute(new Input(id: $id)); // THEN expect($result)->toBeInstanceOf(CampaignRequestNotFound::class); }); it('throws when the campaign request references a brand that no longer exists', function () use ($requestedCoupon): void { // GIVEN $id = CampaignRequestId::generate(); $brandCode = new BrandCode('AAA01'); $campaignRequest = CampaignRequest::hydrate( id: $id, brandCode: $brandCode, name: new CampaignName('Campaign A'), applicant: new Applicant('John', 'Doe', new Email('john.doe@example.com')), campaignType: CampaignRequestType::CLUB, requestedCoupon: $requestedCoupon, status: CampaignRequestStatus::CREATED, ); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findById')->once()->with($id)->andReturn($campaignRequest); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('findByCode')->once()->with($brandCode)->andReturn(null); $useCase = new FindCampaignRequest($repository, $brandRepository); // WHEN $action = fn (): Output => $useCase->execute(new Input(id: $id)); // THEN expect($action)->toThrow(\DomainException::class); }); }); describe('find campaign request use case assertions', function (): void { it('rejects an input of the wrong type', function (): void { // GIVEN $repository = \Mockery::mock(CampaignRequestRepository::class); $brandRepository = \Mockery::mock(BrandRepository::class); $useCase = new FindCampaignRequest($repository, $brandRepository); $invalidInput = new class () implements BaseInput { }; // WHEN $action = fn (): Output => $useCase->execute($invalidInput); // THEN expect($action)->toThrow(\InvalidArgumentException::class); }); });