ldc-mesbr-app/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProcessingCodeTest.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);
});
});