68 lines
2.2 KiB
PHP
68 lines
2.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace Tests\Unit\App\Services;
|
||
|
|
|
||
|
|
use App\Services\CodeGenerationService;
|
||
|
|
use Domain\Models\ValueObjects\Code;
|
||
|
|
use Domain\Models\ValueObjects\Matricule;
|
||
|
|
use Kwaadpepper\Serial\Converters\NativeBaseConverter;
|
||
|
|
use Kwaadpepper\Serial\SerialCasterBuilder;
|
||
|
|
use Kwaadpepper\Serial\Shufflers\FisherYatesShuffler;
|
||
|
|
|
||
|
|
covers(CodeGenerationService::class);
|
||
|
|
|
||
|
|
describe('CodeGenerationService', function (): void {
|
||
|
|
it('generates a valid code of exactly 6 characters from matricule', function (): void {
|
||
|
|
// GIVEN
|
||
|
|
$builder = (new SerialCasterBuilder(new NativeBaseConverter()))
|
||
|
|
->withShuffler(new FisherYatesShuffler())
|
||
|
|
->withSeed(12345);
|
||
|
|
|
||
|
|
$service = new CodeGenerationService($builder);
|
||
|
|
$matricule = new Matricule('0100759');
|
||
|
|
|
||
|
|
// WHEN
|
||
|
|
$code = $service->generateFrom($matricule);
|
||
|
|
|
||
|
|
// THEN
|
||
|
|
expect($code)->toBeInstanceOf(Code::class)
|
||
|
|
->and(strlen($code->value))->toBe(Code::LENGTH)
|
||
|
|
->and(preg_match('/^[' . Code::ALLOWED_CHARACTERS . ']+$/', $code->value))->toBe(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('generates deterministic codes for the same matricule', function (): void {
|
||
|
|
// GIVEN
|
||
|
|
$builder = (new SerialCasterBuilder(new NativeBaseConverter()))
|
||
|
|
->withShuffler(new FisherYatesShuffler())
|
||
|
|
->withSeed(12345);
|
||
|
|
|
||
|
|
$service = new CodeGenerationService($builder);
|
||
|
|
$matricule = new Matricule('0100759');
|
||
|
|
|
||
|
|
// WHEN
|
||
|
|
$code1 = $service->generateFrom($matricule);
|
||
|
|
$code2 = $service->generateFrom($matricule);
|
||
|
|
|
||
|
|
// THEN
|
||
|
|
expect($code1->value)->toBe($code2->value);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('generates different codes for different matricules', function (): void {
|
||
|
|
// GIVEN
|
||
|
|
$builder = (new SerialCasterBuilder(new NativeBaseConverter()))
|
||
|
|
->withShuffler(new FisherYatesShuffler())
|
||
|
|
->withSeed(12345);
|
||
|
|
|
||
|
|
$service = new CodeGenerationService($builder);
|
||
|
|
|
||
|
|
// WHEN
|
||
|
|
$code1 = $service->generateFrom(new Matricule('0100759'));
|
||
|
|
$code2 = $service->generateFrom(new Matricule('0100760'));
|
||
|
|
|
||
|
|
// THEN
|
||
|
|
expect($code1->value)->not->toBe($code2->value);
|
||
|
|
});
|
||
|
|
});
|