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";