code, createdBy: ActorId::generate(), products: new CouponProductArray([ new IncoCode(35784), new IncoCode(15522), ]), movements: new CouponMovementArray([ new CouponMovement(1000) ]), ); $campaign = Campaign::create( name: new CampaignName('Campaign name'), printAllAtOnce: true, coupons: new CampaignCouponArray([ new CampaignCoupon($coupon->code), ]), brandCode: $brand->code, actorId: ActorId::generate(), ); it('finds a coupon by its code', function () use ($coupon, $campaign): void { // GIVEN $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('existsByCode')->once()->with($coupon->brandCode)->andReturnTrue(); $couponRepository = \Mockery::mock(CouponRepository::class); $couponRepository->shouldReceive('findByCode')->once()->with($coupon->code)->andReturn($coupon); $campaignRepository = \Mockery::mock(CampaignRepository::class); $campaignRepository->shouldReceive('findByCouponCode')->once()->with($coupon->code)->andReturn([$campaign]); $useCase = new FindCoupon($couponRepository, $brandRepository, $campaignRepository); // WHEN $result = $useCase->execute(new Input(code: $coupon->code)); // THEN expect($result)->toBeInstanceOf(CouponFound::class) ->and($result->code)->toBe($coupon->code) ->and($result->name)->toBe($coupon->name) ->and($result->amount)->toBe($coupon->amount) ->and($result->picture)->toBe($coupon->picture) ->and($result->diffusion)->toBe($coupon->diffusion) ->and($result->availabilityCalendar)->toBe($coupon->availabilityCalendar) ->and($result->validityInformations)->toBe($coupon->validityInformations) ->and($result->legalInformations)->toBe($coupon->legalInformations) ->and($result->processingCode)->toBe($coupon->processingCode) ->and($result->brandCode)->toBe($coupon->brandCode) ->and($result->createdBy)->toBe($coupon->createdBy) ->and($result->products)->toBe($coupon->products) ->and($result->movements)->toBe($coupon->movements) ->and($result->quantity)->toBe($coupon->quantity()) ->and($result->campaigns)->toBe([$campaign]) ->and($result->createdAt)->toBeInstanceOf(\DateTimeInterface::class) ->and($result->updatedAt)->toBeNull(); }); it('returns CouponNotFound when the code is not found', function (): void { // GIVEN $code = new CouponCode('COU02'); $couponRepository = \Mockery::mock(CouponRepository::class); $couponRepository->shouldReceive('findByCode')->once()->with($code)->andReturn(null); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldNotReceive('existsByCode'); $campaignRepository = \Mockery::mock(CampaignRepository::class); $campaignRepository->shouldNotReceive('findByCouponCode'); $useCase = new FindCoupon($couponRepository, $brandRepository, $campaignRepository); // WHEN $result = $useCase->execute(new Input(code: $code)); // THEN expect($result)->toBeInstanceOf(CouponNotFound::class); }); it('throws when the brand of the coupon is not found', function () use ($coupon): void { // GIVEN $couponRepository = \Mockery::mock(CouponRepository::class); $couponRepository->shouldReceive('findByCode')->once()->with($coupon->code)->andReturn($coupon); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('existsByCode')->once()->with($coupon->brandCode)->andReturnFalse(); $campaignRepository = \Mockery::mock(CampaignRepository::class); $campaignRepository->shouldNotReceive('findByCouponCode'); $useCase = new FindCoupon($couponRepository, $brandRepository, $campaignRepository); // WHEN / THEN expect($useCase->execute(new Input(code: $coupon->code))) ->toBeInstanceOf(BrandNotFound::class); }); it('finds a coupon not attached to any campaign', function () use ($coupon): void { // GIVEN $couponRepository = \Mockery::mock(CouponRepository::class); $couponRepository->shouldReceive('findByCode')->once()->with($coupon->code)->andReturn($coupon); $brandRepository = \Mockery::mock(BrandRepository::class); $brandRepository->shouldReceive('existsByCode')->once()->with($coupon->brandCode)->andReturnTrue(); $campaignRepository = \Mockery::mock(CampaignRepository::class); $campaignRepository->shouldReceive('findByCouponCode')->once()->with($coupon->code)->andReturn([]); $useCase = new FindCoupon($couponRepository, $brandRepository, $campaignRepository); // WHEN $result = $useCase->execute(new Input(code: $coupon->code)); // THEN expect($result)->toBeInstanceOf(CouponFound::class) ->and($result->campaigns)->toBe([]); }); });