toArray())->toBe($coupons) ->and($array->toArray())->toHaveCount(2); }); it('rejects an empty array', function (): void { // GIVEN / WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray([]); // THEN expect($action)->toThrow(\DomainException::class, 'Coupons requires at least one CampaignCoupon.'); }); it('rejects a non-coupon element', function (): void { // GIVEN / WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray(['PC1']); // THEN expect($action)->toThrow( \DomainException::class, 'CampaignCouponArray only accepts CampaignCoupon.' ); }); it('rejects a non-coupon element mixed with valid coupons', function () use ($coupon): void { // GIVEN $coupons = [$coupon, 'PC1']; // WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray($coupons); // THEN expect($action)->toThrow( \DomainException::class, 'CampaignCouponArray only accepts CampaignCoupon.' ); }); it('rejects the same coupon twice at initialisation', function (): void { // GIVEN $coupons = [ new CampaignCoupon(new CouponCode('AAA01')), new CampaignCoupon(new CouponCode('AAA01')), ]; // WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray($coupons); //WHEN / THEN expect($action)->toThrow(\DomainException::class, '"AAA01" is present more than once.'); }); it('adds a coupon to a campaign coupon array', function (): void { // GIVEN $coupons = [ new CampaignCoupon(new CouponCode('AAA01')), new CampaignCoupon(new CouponCode('AAA02')), ]; $array = new CampaignCouponArray($coupons); // WHEN $array = $array->addCoupon(new CampaignCoupon(new CouponCode('AAA03'))); // THEN expect($array->toArray())->toHaveCount(3); }); it('removes a coupon to a campaign coupon array', function () use ($coupon, $coupon2): void { // GIVEN $coupons = [$coupon, $coupon2]; $array = new CampaignCouponArray($coupons); // WHEN $array = $array->removeCoupon($coupon2->couponCode); // THEN expect($array->toArray())->toHaveCount(1); }); it('cant remove a coupon which is not on the campaign', function (): void { // GIVEN $coupons = [ new CampaignCoupon(new CouponCode('AAA01')), new CampaignCoupon(new CouponCode('AAA02')), ]; $array = new CampaignCouponArray($coupons); // WHEN $action = fn () => $array->removeCoupon(new CouponCode('AAA03')); // THEN expect($action)->toThrow(\DomainException::class, '"AAA03" is not in the set.'); }); it('returns all coupon codes', function () use ($coupon, $coupon2): void { // GIVEN $coupons = [$coupon, $coupon2]; $array = new CampaignCouponArray($coupons); // WHEN $result = $array->getCouponCodes(); // THEN expect($result)->toBe([$coupon->couponCode, $coupon2->couponCode]); }); it('returns the requested coupon', function () use ($coupon, $coupon2): void { // GIVEN $coupons = [$coupon, $coupon2]; $array = new CampaignCouponArray($coupons); // WHEN $result = $array->findCoupon($coupon->couponCode); // THEN expect($result)->toBe($coupon); }); it('returns null for an unexisting coupon', function () use ($coupon, $coupon2): void { // GIVEN $coupons = [$coupon]; $array = new CampaignCouponArray($coupons); // WHEN $result = $array->findCoupon($coupon2->couponCode); // THEN expect($result)->toBeNull(); }); });