Files
server/tests/php/Unit/Preview/PreviewContractsTest.php
T
2026-08-29 18:42:30 -04:00

90 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace KTXT\Unit\Preview;
use KTXF\Preview\MimeType;
use KTXF\Preview\PreviewGenerationException;
use KTXF\Preview\PreviewRequest;
use KTXF\Preview\PreviewResult;
use KTXF\Preview\PreviewSource;
use KTXF\Preview\Provider\PreviewProviderInterface;
use KTXF\Resource\BinaryResource;
use KTXF\Resource\Provider\ProviderInterface;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
final class PreviewContractsTest extends TestCase
{
#[Test]
public function registersThePreviewProviderType(): void
{
self::assertSame('preview', ProviderInterface::TYPE_PREVIEW);
self::assertTrue((new ReflectionClass(PreviewProviderInterface::class))->isSubclassOf(ProviderInterface::class));
}
#[Test]
public function normalizesMimeTypes(): void
{
self::assertSame('image/jpeg', MimeType::normalize(' Image/JPEG; charset=binary '));
}
#[Test]
public function requestNormalizesItsOutputMimeType(): void
{
$request = new PreviewRequest(640, 440, 'IMAGE/WEBP', 80);
self::assertSame('image/webp', $request->preferredMimeType);
}
#[Test]
public function sourceDoesNotOpenUntilRequested(): void
{
$opened = 0;
$source = new PreviewSource(
sourceType: 'document',
identity: 'provider/service/entity',
signature: 'revision-1',
mimeType: 'image/jpeg',
size: 7,
resourceFactory: function () use (&$opened): BinaryResource {
$opened++;
return $this->resource('source');
},
);
self::assertSame(0, $opened);
self::assertInstanceOf(BinaryResource::class, $source->open());
self::assertSame(1, $opened);
}
#[Test]
public function sourceRejectsAnInvalidFactoryResult(): void
{
$source = new PreviewSource('document', 'entity', 'revision', 'image/jpeg', 1, fn() => 'invalid');
$this->expectException(PreviewGenerationException::class);
$source->open();
}
#[Test]
public function resultUsesItsBinaryResourceMimeType(): void
{
$result = new PreviewResult($this->resource('preview'), 320, 200);
self::assertSame('image/webp', $result->resource->mimeType());
self::assertSame(320, $result->width);
self::assertSame(200, $result->height);
}
private function resource(string $content): BinaryResource
{
return new BinaryResource(
'preview.webp',
'image/webp',
(function () use ($content): \Generator { yield $content; })(),
);
}
}