Raiju/tests/agent-image-label-smoke.php
2026-10-25 06:05:42 +03:00

56 lines
2.9 KiB
PHP

<?php
declare(strict_types=1);
// Images stored by the AI gateway carry the "generated" label automatically.
$root = dirname(__DIR__);
$tmp = sys_get_temp_dir() . '/raiju-image-label-' . bin2hex(random_bytes(4));
mkdir($tmp . '/generated', 0755, true);
register_shutdown_function(static fn() => exec('rm -rf ' . escapeshellarg($tmp)));
define('RAIJU_MEDIA_META_PATH', $tmp . '/media-meta.json');
define('RAIJU_AI_GENERATED_IMAGE_DIR', $tmp . '/generated');
define('SETTINGS_PATH', $tmp . '/settings.json');
ini_set('error_log', $tmp . '/php-errors.log');
require_once $root . '/includes/ai/ai-helper.php';
function labelAssert(bool $condition, string $message): void {
if (!$condition) {
fwrite(STDERR, "FAIL: {$message}\n");
exit(1);
}
}
function labelPng(int $color): string {
$image = imagecreatetruecolor(8, 8);
imagefill($image, 0, 0, $color);
ob_start();
imagepng($image);
return (string)ob_get_clean();
}
$path = raijuAiStoreGeneratedImage(labelPng(0xCC3300), 'Red square');
labelAssert($path === '/assets/images/generated/red-square.png' && is_file($tmp . '/generated/red-square.png'), 'image stored: ' . $path);
labelAssert(raijuMediaAiLabel($path) === 'generated', 'stored AI image carries the generated label');
$meta = json_decode((string)file_get_contents(RAIJU_MEDIA_META_PATH), true);
labelAssert(($meta['image']['generated/red-square.png']['ai'] ?? '') === 'generated', 'label is stored under the media-library name');
labelAssert(str_contains(raijuAiLabelHtml($path), 'ai-label'), 'the label renders wherever the image is used: ' . raijuAiLabelHtml($path));
// Variants, collisions and format conversion each get their own entry
$second = raijuAiStoreGeneratedImage(labelPng(0x0033CC), 'Red square');
$webp = raijuAiStoreGeneratedImage(labelPng(0x00CC33), 'Green', 'auto', 2, 'webp');
labelAssert($second === '/assets/images/generated/red-square-2.png' && $webp === '/assets/images/generated/green-v2.webp', 'file names: ' . $second . ' ' . $webp);
foreach ([$second, $webp] as $stored) {
labelAssert(raijuMediaAiLabel($stored) === 'generated', "{$stored} is labelled");
}
// A broken metadata store must not lose the image
unlink(RAIJU_MEDIA_META_PATH);
file_put_contents(RAIJU_MEDIA_META_PATH, '{damaged');
$kept = raijuAiStoreGeneratedImage(labelPng(0x333333), 'Kept despite label failure');
labelAssert(is_file($tmp . '/generated/kept-despite-label-failure.png') && $kept === '/assets/images/generated/kept-despite-label-failure.png', 'image survives a failed label write');
labelAssert(file_get_contents(RAIJU_MEDIA_META_PATH) === '{damaged', 'a damaged metadata file is not replaced');
labelAssert(str_contains((string)@file_get_contents($tmp . '/php-errors.log'), 'could not store the AI label'), 'the failed label write is logged');
echo "PASS agent image label: generated images are labelled automatically, failures are logged without losing the image\n";