feat: ds
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Services\PhotoPreview;
|
||||
use Illuminate\Support\Facades\Process;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use Tests\TestCase;
|
||||
|
||||
class PhotoPreviewTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function detects_heic_ftyp_header(): void
|
||||
{
|
||||
$preview = new PhotoPreview;
|
||||
$heicHead = "\x00\x00\x00\x28ftypheic\x00\x00\x00\x00mif1";
|
||||
$this->assertTrue($preview->headLooksHeic($heicHead));
|
||||
$this->assertFalse($preview->headLooksHeic("\xFF\xD8\xFF\xD9"));
|
||||
$this->assertFalse($preview->headLooksHeic(''));
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function jpeg_passthrough_does_not_convert(): void
|
||||
{
|
||||
Storage::fake('local');
|
||||
$abs = $this->writeJpeg();
|
||||
$out = (new PhotoPreview)->payload($abs, 'dev-prev', hash('sha256', 'jpeg'));
|
||||
$this->assertFalse($out['converted']);
|
||||
$this->assertSame('image/jpeg', $out['mime']);
|
||||
$this->assertSame(file_get_contents($abs), $out['bytes']);
|
||||
@unlink($abs);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function heic_converts_to_jpeg_and_leaves_original(): void
|
||||
{
|
||||
if (! is_executable('/usr/bin/sips')) {
|
||||
$this->markTestSkipped('sips is required to generate and convert HEIC');
|
||||
}
|
||||
Storage::fake('local');
|
||||
$heic = $this->writeHeic();
|
||||
$original = file_get_contents($heic);
|
||||
$this->assertNotFalse($original);
|
||||
$sha = hash('sha256', $original);
|
||||
|
||||
$out = (new PhotoPreview)->payload($heic, 'dev-prev', $sha);
|
||||
$this->assertTrue($out['converted']);
|
||||
$this->assertSame('image/jpeg', $out['mime']);
|
||||
$this->assertSame("\xFF\xD8", substr($out['bytes'], 0, 2));
|
||||
$this->assertSame($original, file_get_contents($heic));
|
||||
Storage::disk('local')->assertExists('c2/photo-previews/dev-prev/'.$sha.'.jpg');
|
||||
|
||||
@unlink($heic);
|
||||
}
|
||||
|
||||
private function writeJpeg(): string
|
||||
{
|
||||
$path = sys_get_temp_dir().'/preview_'.uniqid().'.jpg';
|
||||
$im = imagecreatetruecolor(8, 8);
|
||||
imagefilledrectangle($im, 0, 0, 7, 7, imagecolorallocate($im, 255, 255, 255));
|
||||
imagejpeg($im, $path, 90);
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
private function writeHeic(): string
|
||||
{
|
||||
$jpg = $this->writeJpeg();
|
||||
$heic = sys_get_temp_dir().'/preview_'.uniqid().'.heic';
|
||||
$result = Process::timeout(20)->run(['/usr/bin/sips', '-s', 'format', 'heic', '--out', $heic, $jpg]);
|
||||
@unlink($jpg);
|
||||
if (! $result->successful() || ! is_file($heic)) {
|
||||
$this->markTestSkipped('sips could not write a HEIC fixture');
|
||||
}
|
||||
|
||||
return $heic;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user