83 lines
2.7 KiB
PHP
83 lines
2.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Unit\Domain\Models\ValueObjects\Coupon;
|
|
|
|
use Domain\Models\ValueObjects\ProcessingCode;
|
|
use Shared\Enums\Country;
|
|
|
|
covers(ProcessingCode::class);
|
|
|
|
describe('coupon processing code', function (): void {
|
|
$value = '5425003944130';
|
|
|
|
it('creates a valid processing code', function () use ($value): void {
|
|
// GIVEN / WHEN
|
|
$code = new ProcessingCode($value, Country::FRANCE);
|
|
|
|
// THEN
|
|
expect($code->value)->toBe($value)
|
|
->and($code->availableIn)->toBe(Country::FRANCE);
|
|
});
|
|
|
|
it('rejects an invalid value', function (string $invalidValue): void {
|
|
// GIVEN / WHEN
|
|
$action = fn (): ProcessingCode => new ProcessingCode($invalidValue, Country::FRANCE);
|
|
|
|
// THEN
|
|
expect($action)->toThrow(\DomainException::class, 'Processing Code must be exactly 13 numeric characters');
|
|
})->with([
|
|
'empty' => '',
|
|
'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 {
|
|
// GIVEN
|
|
$code = new ProcessingCode($value, Country::FRANCE);
|
|
$other = new ProcessingCode($value, Country::FRANCE);
|
|
|
|
// WHEN / THEN
|
|
expect($code->equals($other))->toBeTrue();
|
|
});
|
|
|
|
it('ignores the country when comparing', function () use ($value): void {
|
|
// GIVEN
|
|
$france = new ProcessingCode($value, Country::FRANCE);
|
|
$benelux = new ProcessingCode($value, Country::BENELUX);
|
|
|
|
// WHEN / THEN
|
|
expect($france->equals($benelux))->toBeTrue();
|
|
});
|
|
|
|
it('is not equal to a processing code with a different value', function () use ($value): void {
|
|
// GIVEN
|
|
$code = new ProcessingCode($value, Country::FRANCE);
|
|
$other = new ProcessingCode('4006381333931', Country::FRANCE);
|
|
|
|
// WHEN / THEN
|
|
expect($code->equals($other))->toBeFalse();
|
|
});
|
|
|
|
it('is not equal to a value that is not a processing code', function () use ($value): void {
|
|
// GIVEN
|
|
$code = new ProcessingCode($value, Country::FRANCE);
|
|
|
|
// WHEN / THEN
|
|
expect($code->equals($value))->toBeFalse()
|
|
->and($code->equals(null))->toBeFalse();
|
|
});
|
|
|
|
it('is converted to its value as a string', function () use ($value): void {
|
|
// GIVEN
|
|
$code = new ProcessingCode($value, Country::FRANCE);
|
|
|
|
// WHEN / THEN
|
|
expect((string) $code)->toBe($value);
|
|
});
|
|
});
|