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 $couponCode = CouponCode::generate(); $coupons = [ new CampaignCoupon($couponCode), new CampaignCoupon($couponCode), ]; // WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray($coupons); //WHEN / THEN expect($action)->toThrow(\DomainException::class, sprintf( '"%s" is present more than once.', $couponCode )); }); it('adds a coupon to a campaign coupon array', function (): void { // GIVEN $coupons = [ new CampaignCoupon(CouponCode::generate()), new CampaignCoupon(CouponCode::generate()), ]; $array = new CampaignCouponArray($coupons); // WHEN $array = $array->addCoupon(new CampaignCoupon(CouponCode::generate())); // 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(CouponCode::generate()), new CampaignCoupon(CouponCode::generate()), ]; $array = new CampaignCouponArray($coupons); $couponCodeToRemove = CouponCode::generate(); // WHEN $action = fn () => $array->removeCoupon($couponCodeToRemove); // THEN expect($action)->toThrow(\DomainException::class, sprintf( '"%s" is not in the set.', $couponCodeToRemove )); }); 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(); }); });