From e4a0ad5b73ddfa1c832fff811ab28ebaa00c73e1 Mon Sep 17 00:00:00 2001 From: Corentin Huet Date: Tue, 13 Oct 2026 15:56:11 +0200 Subject: [PATCH] fix: :bug: restrict processing code to 13 digits --- .../Coupon/CouponProcessingCode.php | 4 +-- .../Create/CreateCampaignRequestTest.php | 2 +- .../Find/FindCampaignRequestTest.php | 2 +- .../List/ListCampaignsRequestTest.php | 4 +-- .../Reject/RejectCampaignRequestTest.php | 2 +- .../Models/Entities/CampaignRequestTest.php | 2 +- .../Coupon/CouponCountryCoverageTest.php | 4 +-- .../Coupon/CouponProcessingCode.php | 2 +- .../Coupon/CouponProcessingCodeArrayTest.php | 6 ++-- .../Coupon/CouponProcessingCodeTest.php | 28 ++++++------------- .../RequestedCoupon/RequestedCouponTest.php | 4 +-- 11 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php b/src/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php index b464eb3..55ef067 100644 --- a/src/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php +++ b/src/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php @@ -9,7 +9,7 @@ use Shared\Enums\Country; final readonly class CouponProcessingCode implements \Stringable, Equatable { - private const string PATTERN = '/^[A-Za-z0-9]{13}\z/'; + private const string PATTERN = '/^\d{13}\z/'; public function __construct( public string $value, @@ -17,7 +17,7 @@ final readonly class CouponProcessingCode implements \Stringable, Equatable ) { if (preg_match(self::PATTERN, $this->value) !== 1) { throw new \DomainException( - 'Processing Code must be exactly 13 alphanumeric characters, e.g. ABC1234567890.', + 'Processing Code must be exactly 13 numeric characters, e.g. 5425003944130.', ); } } diff --git a/tests/Unit/Application/UseCases/CampaignRequest/Create/CreateCampaignRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/Create/CreateCampaignRequestTest.php index 99d8350..4cacc2b 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/Create/CreateCampaignRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/Create/CreateCampaignRequestTest.php @@ -56,7 +56,7 @@ describe('create campaign request use case', function (): void { new PicturePath('files/mobileThumbnail.jpg') ), couponProcessingCodes: new CouponProcessingCodeArray([ - new CouponProcessingCode('ABC1234567890', Country::FRANCE), + new CouponProcessingCode('5425003944130', Country::FRANCE), ]), couponValidityInformations: new CouponValidityInformationArray([ new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), diff --git a/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php index 84f7b5b..0f60f77 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php @@ -60,7 +60,7 @@ describe('find campaign request use case', function (): void { new PicturePath('files/mobileThumbnail.jpg') ), couponProcessingCodes: new CouponProcessingCodeArray([ - new CouponProcessingCode('ABC1234567890', Country::FRANCE), + new CouponProcessingCode('5425003944130', Country::FRANCE), ]), couponValidityInformations: new CouponValidityInformationArray([ new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), diff --git a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php index 3f5f2e4..e253772 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php @@ -54,7 +54,7 @@ describe('list campaigns request use case', function (): void { new PicturePath('files/mobileThumbnail.jpg') ), couponProcessingCodes: new CouponProcessingCodeArray([ - new CouponProcessingCode('ABC1234567890', Country::FRANCE), + new CouponProcessingCode('5425003944130', Country::FRANCE), ]), couponValidityInformations: new CouponValidityInformationArray([ new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), @@ -79,7 +79,7 @@ describe('list campaigns request use case', function (): void { new PicturePath('files/mobileThumbnail.jpg') ), couponProcessingCodes: new CouponProcessingCodeArray([ - new CouponProcessingCode('ABC1234567890', Country::FRANCE), + new CouponProcessingCode('5425003944130', Country::FRANCE), ]), couponValidityInformations: new CouponValidityInformationArray([ new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), diff --git a/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php index e0e11a9..25521e1 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php @@ -55,7 +55,7 @@ describe('reject campaign request use case', function (): void { new PicturePath('files/mobileThumbnail.jpg') ), couponProcessingCodes: new CouponProcessingCodeArray([ - new CouponProcessingCode('ABC1234567890', Country::FRANCE), + new CouponProcessingCode('5425003944130', Country::FRANCE), ]), couponValidityInformations: new CouponValidityInformationArray([ new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), diff --git a/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php b/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php index 0790326..896514f 100644 --- a/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php +++ b/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php @@ -50,7 +50,7 @@ describe('campaign request', function (): void { new PicturePath('files/mobileThumbnail.jpg') ), couponProcessingCodes: new CouponProcessingCodeArray([ - new CouponProcessingCode('ABC1234567890', Country::FRANCE), + new CouponProcessingCode('5425003944130', Country::FRANCE), ]), couponValidityInformations: new CouponValidityInformationArray([ new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE), diff --git a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponCountryCoverageTest.php b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponCountryCoverageTest.php index d7b9b33..c09fd08 100644 --- a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponCountryCoverageTest.php +++ b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponCountryCoverageTest.php @@ -16,8 +16,8 @@ use Shared\Enums\Country; covers(CouponCountryCoverage::class); describe('coupon country coverage', function (): void { - $franceCode = new CouponProcessingCode('ABC1234567890', Country::FRANCE); - $beneluxCode = new CouponProcessingCode('XYZ0987654321', Country::BENELUX); + $franceCode = new CouponProcessingCode('5425003944130', Country::FRANCE); + $beneluxCode = new CouponProcessingCode('5425003944147', Country::BENELUX); $franceValidity = new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE); $beneluxValidity = new CouponValidityInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::BENELUX); $franceLegal = new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FRANCE); diff --git a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php index 7b1012a..cb83c24 100644 --- a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php +++ b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCode.php @@ -10,7 +10,7 @@ use Shared\Enums\Country; covers(CouponProcessingCode::class); describe('processing code', function (): void { - $value = 'ABC1234567890'; + $value = '5425003944130'; $emptyValue = ''; it('creates a valid processing code FRANCE', function () use ($value): void { diff --git a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeArrayTest.php b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeArrayTest.php index 14b931b..cbeb252 100644 --- a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeArrayTest.php +++ b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeArrayTest.php @@ -11,8 +11,8 @@ use Shared\Enums\Country; covers(CouponProcessingCodeArray::class); describe('coupon processing code array', function (): void { - $franceCode = new CouponProcessingCode('ABC1234567890', Country::FRANCE); - $beneluxCode = new CouponProcessingCode('XYZ0987654321', Country::BENELUX); + $franceCode = new CouponProcessingCode('5425003944130', Country::FRANCE); + $beneluxCode = new CouponProcessingCode('5425003944147', Country::BENELUX); it('creates an array containing a France processing code', function () use ($franceCode): void { // GIVEN @@ -52,7 +52,7 @@ describe('coupon processing code array', function (): void { // GIVEN $informations = [ $franceCode, - new CouponProcessingCode('XYZ0987654321', Country::FRANCE), + new CouponProcessingCode('5425003944130', Country::FRANCE), ]; // WHEN diff --git a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeTest.php b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeTest.php index fb61519..ec58e64 100644 --- a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeTest.php +++ b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeTest.php @@ -10,7 +10,7 @@ use Shared\Enums\Country; covers(CouponProcessingCode::class); describe('coupon processing code', function (): void { - $value = 'ABC1234567890'; + $value = '5425003944130'; it('creates a valid processing code', function () use ($value): void { // GIVEN / WHEN @@ -21,30 +21,20 @@ describe('coupon processing code', function (): void { ->and($code->availableIn)->toBe(Country::FRANCE); }); - it('accepts lowercase and uppercase letters and digits', function (): void { - // GIVEN / WHEN - $code = new CouponProcessingCode('aBc1234567xYz', Country::FRANCE); - - // THEN - expect($code->value)->toBe('aBc1234567xYz'); - }); - it('rejects an invalid value', function (string $invalidValue): void { // GIVEN / WHEN $action = fn (): CouponProcessingCode => new CouponProcessingCode($invalidValue, Country::FRANCE); // THEN - expect($action)->toThrow( - \DomainException::class, - 'Processing Code must be exactly 13 alphanumeric characters, e.g. ABC1234567890.', - ); + expect($action)->toThrow(\DomainException::class, 'Processing Code must be exactly 13 numeric characters'); })->with([ 'empty' => '', - 'too short' => 'ABC123456789', - 'too long' => 'ABC12345678901', - 'special char' => 'ABC123456789!', - 'with space' => 'ABC 123456789', - 'trailing break' => "ABC1234567890\n", + 'too short' => '542500394413', + 'too long' => '54250039441301', + 'with letters' => 'ABC1234567890', + 'special char' => '542500394413!', + 'with space' => '5425 03944130', + 'trailing break' => "5425003944130\n", ]); it('is equal to another processing code with the same value', function () use ($value): void { @@ -68,7 +58,7 @@ describe('coupon processing code', function (): void { it('is not equal to a processing code with a different value', function () use ($value): void { // GIVEN $code = new CouponProcessingCode($value, Country::FRANCE); - $other = new CouponProcessingCode('XYZ0987654321', Country::FRANCE); + $other = new CouponProcessingCode('4006381333931', Country::FRANCE); // WHEN / THEN expect($code->equals($other))->toBeFalse(); diff --git a/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php b/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php index fa7ed31..06368aa 100644 --- a/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php +++ b/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php @@ -38,8 +38,8 @@ describe('requested coupon', function (): void { new PicturePath('files/mobileThumbnail.jpg') ); - $franceProcessingCode = new CouponProcessingCode('ABC1234567890', Country::FRANCE); - $beneluxProcessingCode = new CouponProcessingCode('XYZ9876543210', Country::BENELUX); + $franceProcessingCode = new CouponProcessingCode('5425003944130', Country::FRANCE); + $beneluxProcessingCode = new CouponProcessingCode('5425003944147', Country::BENELUX); $couponProcessingCodes = new CouponProcessingCodeArray([ $franceProcessingCode, $beneluxProcessingCode,