extractor = new MetadataExtractor(); }); it('extracts image dimensions from valid image', function () { // Create a minimal valid JPEG (1x1 pixel) $imageContent = "\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xFF\xD9"; // Create a real 1x1 pixel image using GD $img = imagecreatetruecolor(100, 200); ob_start(); imagejpeg($img); $imageContent = ob_get_clean(); imagedestroy($img); $meta = $this->extractor->extractImageMetadata($imageContent); expect($meta->getWidth())->toBe(100); expect($meta->getHeight())->toBe(200); }); it('returns empty metadata for invalid image content', function () { $meta = $this->extractor->extractImageMetadata('invalid-image-content'); expect($meta->getWidth())->toBeNull(); expect($meta->getHeight())->toBeNull(); }); it('extracts EXIF data when available', function () { // Create a minimal JPEG $img = imagecreatetruecolor(100, 100); ob_start(); imagejpeg($img); $imageContent = ob_get_clean(); imagedestroy($img); $meta = $this->extractor->extractImageMetadata($imageContent); // EXIF might not be available in test environment, but method should not throw expect($meta)->toBeInstanceOf(\App\Domain\Asset\ValueObjects\AssetMetadata::class); }); it('returns empty metadata for video content', function () { $meta = $this->extractor->extractVideoMetadata('video-content'); expect($meta->toArray())->toBe([]); }); it('returns empty metadata for audio content', function () { $meta = $this->extractor->extractAudioMetadata('audio-content'); expect($meta->toArray())->toBe([]); }); it('returns null for blurhash generation', function () { $img = imagecreatetruecolor(100, 100); ob_start(); imagejpeg($img); $imageContent = ob_get_clean(); imagedestroy($img); $blurhash = $this->extractor->generateBlurhash($imageContent); expect($blurhash)->toBeNull(); }); it('returns null for dominant color extraction', function () { $img = imagecreatetruecolor(100, 100); ob_start(); imagejpeg($img); $imageContent = ob_get_clean(); imagedestroy($img); $color = $this->extractor->extractDominantColor($imageContent); expect($color)->toBeNull(); }); });