feat: implement preview manager

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-08-29 18:42:30 -04:00
parent eaea5f4c83
commit f39ad1804d
13 changed files with 676 additions and 175 deletions
@@ -5,7 +5,7 @@ declare(strict_types=1);
namespace KTXT\Unit\Preview;
use KTXF\Preview\MimeType;
use KTXF\Preview\PreviewException;
use KTXF\Preview\PreviewGenerationException;
use KTXF\Preview\PreviewRequest;
use KTXF\Preview\PreviewResult;
use KTXF\Preview\PreviewSource;
@@ -26,28 +26,17 @@ final class PreviewContractsTest extends TestCase
}
#[Test]
public function normalizesMimeTypesAndMatchesWildcards(): void
public function normalizesMimeTypes(): void
{
self::assertSame('image/jpeg', MimeType::normalize(' Image/JPEG; charset=binary '));
self::assertTrue(MimeType::matches('image/*', 'IMAGE/WEBP'));
self::assertTrue(MimeType::matches('application/pdf', 'application/pdf'));
self::assertFalse(MimeType::matches('image/*', 'application/pdf'));
}
#[Test]
public function requestHasADeterministicNormalizedRepresentation(): void
public function requestNormalizesItsOutputMimeType(): void
{
$request = new PreviewRequest('popover', 640, 440, 'IMAGE/WEBP', 80, page: 1);
$request = new PreviewRequest(640, 440, 'IMAGE/WEBP', 80);
self::assertSame([
'variant' => 'popover',
'maxWidth' => 640,
'maxHeight' => 440,
'preferredMimeType' => 'image/webp',
'quality' => 80,
'page' => 1,
'timestamp' => null,
], $request->normalized());
self::assertSame('image/webp', $request->preferredMimeType);
}
#[Test]
@@ -75,7 +64,7 @@ final class PreviewContractsTest extends TestCase
public function sourceRejectsAnInvalidFactoryResult(): void
{
$source = new PreviewSource('document', 'entity', 'revision', 'image/jpeg', 1, fn() => 'invalid');
$this->expectException(PreviewException::class);
$this->expectException(PreviewGenerationException::class);
$source->open();
}