ldc-file-storage-service/tests/Unit/Lib/PathGenerators/UuidPathGeneratorTest.php

141 lines
5 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace Uwil\Storage\Tests\Unit\Lib\PathGenerators;
use Illuminate\Support\Str;
use Uwil\Storage\Lib\PathGenerators\UuidPathGenerator;
use Uwil\Storage\Lib\ValueObjects\DiskName;
use Uwil\Storage\Lib\ValueObjects\FileStream;
use Uwil\Storage\Lib\ValueObjects\SanitizedFile;
use Uwil\Storage\Lib\ValueObjects\StorageFilePath;
covers(UuidPathGenerator::class);
describe('UuidPathGenerator generation without directory', function (): void {
it('generates a storage file path containing a valid UUID and extension', function (): void {
// GIVEN
$generator = new UuidPathGenerator();
$disk = new DiskName('local', 'local');
$sanitizedFile = new SanitizedFile(
originalName: 'picture.png',
sanitizedName: 'picture.png',
contents: FileStream::fromString('image bytes')
);
// WHEN
$result = $generator->generate($disk, $sanitizedFile);
// THEN
expect($result)->toBeInstanceOf(StorageFilePath::class);
$filename = $result->value;
expect($filename)->toMatch('#^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.png$#');
$uuidOnly = pathinfo($filename, PATHINFO_FILENAME);
expect(Str::isUuid($uuidOnly))->toBeTrue();
});
it('generates a storage file path without extension when file has no extension', function (): void {
// GIVEN
$generator = new UuidPathGenerator();
$disk = new DiskName('local', 'local');
$sanitizedFile = new SanitizedFile(
originalName: 'DOCKERFILE',
sanitizedName: 'DOCKERFILE',
contents: FileStream::fromString('FROM php:8.5')
);
// WHEN
$result = $generator->generate($disk, $sanitizedFile);
// THEN
expect($result)->toBeInstanceOf(StorageFilePath::class)
->and(Str::isUuid($result->value))->toBeTrue();
});
it('generates unique paths on successive calls for the same file', function (): void {
// GIVEN
$generator = new UuidPathGenerator();
$disk = new DiskName('local', 'local');
$sanitizedFile = new SanitizedFile(
originalName: 'data.json',
sanitizedName: 'data.json',
contents: FileStream::fromString('{}')
);
// WHEN
$path1 = $generator->generate($disk, $sanitizedFile);
$path2 = $generator->generate($disk, $sanitizedFile);
// THEN
expect($path1->value)->not->toBe($path2->value);
});
});
describe('UuidPathGenerator generation with directory', function (): void {
it('prepends the given directory to the generated UUID filename', function (): void {
// GIVEN
$generator = new UuidPathGenerator();
$disk = new DiskName('local', 'local');
$sanitizedFile = new SanitizedFile(
originalName: 'invoice.pdf',
sanitizedName: 'invoice.pdf',
contents: FileStream::fromString('PDF DATA')
);
$directory = 'billing/invoices';
// WHEN
$result = $generator->generate($disk, $sanitizedFile, $directory);
// THEN
expect($result)->toBeInstanceOf(StorageFilePath::class)
->and($result->value)->toStartWith('billing/invoices/')
->and($result->value)->toMatch('#^billing/invoices/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.pdf$#');
});
it('trims leading and trailing slashes from the directory', function (string $directory): void {
// GIVEN
$generator = new UuidPathGenerator();
$disk = new DiskName('local', 'local');
$sanitizedFile = new SanitizedFile(
originalName: 'file.txt',
sanitizedName: 'file.txt',
contents: FileStream::fromString('text')
);
// WHEN
$result = $generator->generate($disk, $sanitizedFile, $directory);
// THEN
expect($result->value)->toStartWith('custom/path/');
})->with([
'leading slash' => '/custom/path',
'trailing slash' => 'custom/path/',
'both slashes' => '/custom/path/',
'multiple outer slashes' => '///custom/path///',
]);
it('ignores empty or slash-only directory', function (string $directory): void {
// GIVEN
$generator = new UuidPathGenerator();
$disk = new DiskName('local', 'local');
$sanitizedFile = new SanitizedFile(
originalName: 'file.txt',
sanitizedName: 'file.txt',
contents: FileStream::fromString('text')
);
// WHEN
$result = $generator->generate($disk, $sanitizedFile, $directory);
// THEN
expect($result->value)->toMatch('#^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.txt$#');
})->with([
'empty string' => '',
'single slash' => '/',
'multi slashes' => '///',
]);
});