new Input( brandCode: new BrandCode('AAA01'), name: new CampaignName('Campaign name'), applicant: new Applicant('John', 'Doe', new Email('john.doe@example.com')), campaignType: CampaignRequestType::CLUB, requestedCoupon: new RequestedCoupon( couponName: new CouponName('Coupon A'), quantity: new RequestedCouponQuantity(100), diffusion: new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01')), moneyAmount: new MoneyAmount(new Money(Currency::EUR, 300)), couponPicture: new CouponPicture( new PicturePath('files/product.jpg'), new PicturePath('files/thumbnail.jpg'), new PicturePath('files/mobileThumbnail.jpg') ), couponProcessingCodes: new CouponProcessingCodeArray([ new CouponProcessingCode('ABC1234567890', Country::FRANCE), ]), couponValidityInformations: new CouponValidityInformationArray([ new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::BENELUX) ]), couponLegalInformations: new CouponLegalInformationArray([ new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::BENELUX) ]), couponProducts: new CouponProductArray([new CouponIncoCode(35784), new CouponIncoCode(15522)]), printRules: new PrintRules(maxPerCustomer: 3) ), ); it('creates a campaign request when the brand exists', function () use ($makeInput): void { // GIVEN $input = $makeInput(); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('existsByCode')->once()->with($input->brandCode)->andReturn(true); $campaignRequestRepository = \Mockery::mock(CampaignRequestRepository::class); $campaignRequestRepository->shouldReceive('save')->once()->with(\Mockery::type(CampaignRequest::class)); $useCase = new CreateCampaignRequest($campaignRequestRepository, $brandRepository); // WHEN $result = $useCase->execute($input); // THEN expect($result)->toBeInstanceOf(Output::class) ->and($result->status)->toBe(CampaignRequestStatus::CREATED) ->and($result->brandCode)->toBe($input->brandCode); }); it('throws when the brand does not exist', function () use ($makeInput): void { // GIVEN $input = $makeInput(); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('existsByCode')->once()->with($input->brandCode)->andReturn(false); $campaignRequestRepository = \Mockery::mock(CampaignRequestRepository::class); $campaignRequestRepository->shouldNotReceive('save'); $useCase = new CreateCampaignRequest($campaignRequestRepository, $brandRepository); // WHEN $action = fn (): Output => $useCase->execute($input); // THEN expect($action)->toThrow(\DomainException::class); }); });