shouldReceive('findByCodes') ->once() ->with(\Mockery::on( static fn (array $codes): bool => array_map( static fn ($code): string => $code->value, $codes, ) === $campaignCodes, )) ->andReturn($coupons); return $repository; }; it('is available with an active coupon', function () use ($makeRepository): void { // GIVEN $campaign = CampaignFactory::hydrated(couponCodes: ['COU01']); $repository = $makeRepository(['COU01'], [CouponFactory::make('COU01')]); $service = new CampaignAvailabilityChecker($repository); // WHEN $result = $service->hasActiveCoupon($campaign); // THEN expect($result)->toBeTrue(); }); it('is available with one active and one expired coupon', function () use ($makeRepository): void { // GIVEN $campaign = CampaignFactory::hydrated(couponCodes: ['COU01', 'COU02']); $repository = $makeRepository(['COU01', 'COU02'], [ CouponFactory::expired('COU01'), CouponFactory::make('COU02'), ]); $service = new CampaignAvailabilityChecker($repository); // WHEN $result = $service->hasActiveCoupon($campaign); // THEN expect($result)->toBeTrue(); }); it('is not available when every coupon is expired or upcoming', function () use ($makeRepository): void { // GIVEN $campaign = CampaignFactory::hydrated(couponCodes: ['COU01', 'COU02']); $repository = $makeRepository(['COU01', 'COU02'], [ CouponFactory::expired('COU01'), CouponFactory::upcoming('COU02'), ]); $service = new CampaignAvailabilityChecker($repository); // WHEN $result = $service->hasActiveCoupon($campaign); // THEN expect($result)->toBeFalse(); }); it('is not available when no coupon is found', function () use ($makeRepository): void { // GIVEN $campaign = CampaignFactory::hydrated(couponCodes: ['COU01']); $repository = $makeRepository(['COU01'], []); $service = new CampaignAvailabilityChecker($repository); // WHEN $result = $service->hasActiveCoupon($campaign); // THEN expect($result)->toBeFalse(); }); });