. // }}} namespace Component\Attachment\tests\Entity; use App\Core\DB; use App\Core\Event; use App\Util\Exception\NotStoredLocallyException; use App\Util\GNUsocialTestCase; use Component\Attachment\Entity\Attachment; use Component\Attachment\Entity\AttachmentThumbnail; use Functional as F; use Jchook\AssertThrows\AssertThrows; use SplFileInfo; class AttachmentThumbnailTest extends GNUsocialTestCase { use AssertThrows; public function testAttachmentThumbnailLifecycle() { parent::bootKernel(); // Data fixture already loaded this file, but we need to get its hash to find it $file = new SplFileInfo(INSTALLDIR . '/tests/sample-uploads/attachment-lifecycle-target.jpg'); $hash = null; Event::handle('HashFile', [$file->getPathname(), &$hash]); $attachment = DB::findOneBy(Attachment::class, ['filehash' => $hash]); $expected = [ AttachmentThumbnail::getOrCreate($attachment, 'small', crop: false), AttachmentThumbnail::getOrCreate($attachment, 'medium', crop: false), $thumb = AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false), ]; static::assertSame($attachment, $thumb->getAttachment()); $thumb->setAttachment(null); static::assertSame($attachment, $thumb->getAttachment()); $actual = $attachment->getThumbnails(); static::assertSame(\count($expected), \count($actual)); foreach ($expected as $e) { $a = array_shift($actual); static::assertObjectEquals($e, $a); } array_pop($expected); $thumb->delete(); $actual = $attachment->getThumbnails(); static::assertSame(\count($expected), \count($actual)); foreach ($expected as $e) { $a = array_shift($actual); static::assertObjectEquals($e, $a); } $attachment->deleteStorage(); foreach (array_reverse($attachment->getThumbnails()) as $t) { // Since we still have thumbnails, those will be used as the new thumbnail, even though we don't have the original $new = AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false); static::assertSame([$t->getFilename(), $t->getSize()], [$new->getFilename(), $new->getSize()]); $t->delete(); } // Since the backed storage was deleted and we don't have any more previous thumnbs, we can't generate another thumbnail static::assertThrows(NotStoredLocallyException::class, fn () => AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false)); $attachment->kill(); // static::assertThrows(NotStoredLocallyException::class, fn () => AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false)); } public function testInvalidThumbnail() { parent::bootKernel(); $file = new SplFileInfo(INSTALLDIR . '/tests/sample-uploads/spreadsheet.ods'); $hash = null; Event::handle('HashFile', [$file->getPathname(), &$hash]); $attachment = DB::findOneBy('attachment', ['filehash' => $hash]); static::assertNull(AttachmentThumbnail::getOrCreate($attachment, 'small', crop: false)); } public function testPredictScalingValues() { parent::bootKernel(); // TODO test with cropping $inputs = [ [100, 100], [400, 200], [800, 400], [1600, 800], [1600, 1600], // 16:9 video [854, 480], [1280, 720], [1920, 1080], [2560, 1440], [3840, 2160], ]; $outputs = [ 'small' => [ [100, 100], [400, 200], [32, 14], [32, 14], [32, 32], // 16:9 video [32, 21], [32, 21], [32, 21], [32, 21], [32, 21], ], 'medium' => [ [100, 100], [400, 200], [256, 116], [256, 116], [256, 256], // 16:9 video [256, 170], [256, 170], [256, 170], [256, 170], [256, 170], ], 'big' => [ [100, 100], [400, 200], [496, 225], [496, 225], [496, 496], // 16:9 video [496, 330], [496, 330], [496, 330], [496, 330], [496, 330], ], ]; foreach (['small', 'medium', 'big'] as $size) { foreach (F\zip($inputs, $outputs[$size]) as [$existing, $results]) { static::assertSame($results, AttachmentThumbnail::predictScalingValues(existing_width: $existing[0], existing_height: $existing[1], requested_size: $size, crop: false)); } } } public function testGetUrl() { parent::bootKernel(); $attachment = DB::findBy(Attachment::class, ['mimetype' => 'image/png'], limit: 1)[0]; $thumb = AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false); $id = $attachment->getId(); $expected = "/object/note/42/attachment/{$id}/thumbnail/big"; static::assertSame($expected, $thumb->getUrl(note: 42)); } }