CouponCountryCoverage::assert( new ProcessingCodeArray([$franceCode]), new CouponValidityInformationArray([$franceValidity]), new CouponLegalInformationArray([$franceLegal]), ); // THEN expect($action)->not->toThrow(\DomainException::class); }); it('accepts a coupon fully covered for france and benelux', function () use ( $franceCode, $beneluxCode, $franceValidity, $beneluxValidity, $franceLegal, $beneluxLegal, ): void { // GIVEN / WHEN $action = fn () => CouponCountryCoverage::assert( new ProcessingCodeArray([$franceCode, $beneluxCode]), new CouponValidityInformationArray([$franceValidity, $beneluxValidity]), new CouponLegalInformationArray([$franceLegal, $beneluxLegal]), ); // THEN expect($action)->not->toThrow(\DomainException::class); }); it('rejects a benelux processing code without benelux validity information', function () use ( $franceCode, $beneluxCode, $franceValidity, $franceLegal, $beneluxLegal, ): void { // GIVEN / WHEN $action = fn () => CouponCountryCoverage::assert( new ProcessingCodeArray([$franceCode, $beneluxCode]), new CouponValidityInformationArray([$franceValidity]), new CouponLegalInformationArray([$franceLegal, $beneluxLegal]), ); // THEN expect($action)->toThrow(\DomainException::class, 'A coupon requires validity information for BENELUX.'); }); it('rejects a benelux processing code without benelux legal information', function () use ( $franceCode, $beneluxCode, $franceValidity, $beneluxValidity, $franceLegal, ): void { // GIVEN / WHEN $action = fn () => CouponCountryCoverage::assert( new ProcessingCodeArray([$franceCode, $beneluxCode]), new CouponValidityInformationArray([$franceValidity, $beneluxValidity]), new CouponLegalInformationArray([$franceLegal]), ); // THEN expect($action)->toThrow(\DomainException::class, 'A coupon requires legal information for BENELUX.'); }); it('rejects information for a country where the coupon is not diffused', function () use ( $franceCode, $franceValidity, $beneluxValidity, $franceLegal, ): void { // GIVEN / WHEN $action = fn () => CouponCountryCoverage::assert( new ProcessingCodeArray([$franceCode]), new CouponValidityInformationArray([$franceValidity, $beneluxValidity]), new CouponLegalInformationArray([$franceLegal]), ); // THEN expect($action)->toThrow(\DomainException::class, 'A coupon requires exactly one information per diffusion country.'); }); it('cannot be instantiated from the outside', function (): void { // GIVEN $reflection = new \ReflectionClass(CouponCountryCoverage::class); $constructor = $reflection->getConstructor(); // WHEN $constructor?->invoke($reflection->newInstanceWithoutConstructor()); // THEN expect($constructor?->isPrivate())->toBeTrue(); }); });