Files
server/tests/php/Unit/Preview/PreviewConfigurationTest.php
T
Sebastian a0093c9547 feat: implement 3 variants
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-08-29 19:10:48 -04:00

111 lines
4.5 KiB
PHP

<?php
declare(strict_types=1);
namespace KTXT\Unit\Preview;
use InvalidArgumentException;
use KTXC\Models\Tenant\TenantConfiguration;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
final class PreviewConfigurationTest extends TestCase
{
#[Test]
public function providesSafeDefaultsWhenPreviewConfigurationIsAbsent(): void
{
$preview = (new TenantConfiguration())->preview();
self::assertTrue($preview->enabled());
self::assertSame('previews', $preview->store());
self::assertSame(26214400, $preview->maxSourceSize());
self::assertSame(128, $preview->variants()->variant('thumbnail')?->width);
self::assertSame(128, $preview->variants()->variant('thumbnail')?->height);
self::assertSame(70, $preview->variants()->variant('thumbnail')?->quality);
self::assertSame(640, $preview->variants()->variant('inline')?->width);
self::assertSame(640, $preview->variants()->variant('inline')?->height);
self::assertSame('image/webp', $preview->variants()->variant('inline')?->format);
self::assertSame(80, $preview->variants()->variant('inline')?->quality);
self::assertSame(2560, $preview->variants()->variant('fullscreen')?->width);
self::assertSame(2560, $preview->variants()->variant('fullscreen')?->height);
self::assertSame(90, $preview->variants()->variant('fullscreen')?->quality);
}
#[Test]
public function loadsAndSerializesTenantPreviewConfiguration(): void
{
$data = [
'enabled' => true,
'store' => 'generated-content',
'maxSourceSize' => 1024,
'variants' => [
'inline' => [
'width' => 800,
'height' => 600,
'format' => 'IMAGE/PNG',
'quality' => 90,
],
],
];
$configuration = (new TenantConfiguration())->jsonDeserialize(['preview' => $data]);
self::assertSame('generated-content', $configuration->preview()->store());
self::assertSame(1024, $configuration->preview()->maxSourceSize());
self::assertSame(['inline'], array_keys($configuration->preview()->variants()->all()));
self::assertSame('image/png', $configuration->preview()->variants()->variant('inline')?->format);
$data['variants']['inline']['format'] = 'image/png';
self::assertSame($data, $configuration->jsonSerialize()['preview']);
}
#[Test]
public function mergesKnownVariantDefaultsForPartialOverrides(): void
{
$configuration = (new TenantConfiguration())->jsonDeserialize([
'preview' => [
'variants' => [
'inline' => ['width' => 900],
],
],
]);
$variant = $configuration->preview()->variants()->variant('inline');
self::assertSame(900, $variant?->width);
self::assertSame(640, $variant?->height);
self::assertSame('image/webp', $variant?->format);
self::assertSame(80, $variant?->quality);
self::assertNull($configuration->preview()->variants()->variant('thumbnail'));
}
#[Test]
public function allowsNoVariantsWhenPreviewsAreDisabled(): void
{
$configuration = (new TenantConfiguration())->jsonDeserialize([
'preview' => ['enabled' => false, 'variants' => []],
]);
self::assertFalse($configuration->preview()->enabled());
self::assertSame([], $configuration->preview()->variants()->all());
}
/** @return iterable<string, array{array<string, mixed>}> */
public static function invalidConfigurations(): iterable
{
yield 'invalid store' => [['store' => '../previews']];
yield 'zero source limit' => [['maxSourceSize' => 0]];
yield 'invalid variant name' => [['variants' => ['../inline' => []]]];
yield 'invalid dimensions' => [['variants' => ['inline' => ['width' => 0]]]];
yield 'invalid output MIME' => [['variants' => ['inline' => ['format' => 'webp']]]];
yield 'invalid quality' => [['variants' => ['inline' => ['quality' => 101]]]];
yield 'enabled without variants' => [['enabled' => true, 'variants' => []]];
}
#[Test]
#[\PHPUnit\Framework\Attributes\DataProvider('invalidConfigurations')]
public function rejectsInvalidConfiguration(array $data): void
{
$this->expectException(InvalidArgumentException::class);
(new TenantConfiguration())->jsonDeserialize(['preview' => $data]);
}
}