ImageResizerTest::testResize()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 17
c 4
b 0
f 0
dl 0
loc 24
rs 9.7
cc 1
nc 1
nop 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EcodevTests\Felix\Service;
6
7
use Ecodev\Felix\Model\Image;
8
use Ecodev\Felix\Service\ImageResizer;
9
use Exception;
10
use Imagine\Image\ImageInterface;
11
use Imagine\Image\ImagineInterface;
12
use PHPUnit\Framework\TestCase;
13
14
class ImageResizerTest extends TestCase
15
{
16
    /**
17
     * @dataProvider providerResize
18
     *
19
     * @param non-empty-string $expected
20
     */
21
    public function testResize(string $extension, int $wantedHeight, bool $useWebp, string $expected): void
22
    {
23
        $mime = match ($extension) {
24
            'png' => 'image/png',
25
            'svg' => 'image/svg+xml',
26
            'tiff' => 'image/tiff',
27
            default => throw new Exception('Unsupported extension: ' . $extension),
28
        };
29
30
        $imagineImage = $this->createMock(ImageInterface::class);
31
        $imagineImage->expects(self::atMost(1))->method('thumbnail')->willReturnSelf();
32
33
        $imagine = $this->createMock(ImagineInterface::class);
34
        $imagine->expects(self::atMost(1))->method('open')->willReturn($imagineImage);
35
36
        $resizer = new ImageResizer($imagine);
37
        $image = $this->createMock(Image::class);
38
        $image->expects(self::once())->method('getPath')->willReturn('/felix/image.' . $extension);
39
        $image->expects(self::atMost(1))->method('getFilename')->willReturn('image.' . $extension);
40
        $image->expects(self::atMost(1))->method('getHeight')->willReturn(200);
41
        $image->expects(self::atMost(1))->method('getMime')->willReturn($mime);
42
43
        $actual = $resizer->resize($image, $wantedHeight, $useWebp);
44
        self::assertStringEndsWith($expected, $actual);
45
    }
46
47
    public static function providerResize(): iterable
48
    {
49
        return [
50
            'png smaller' => ['png', 100, false, 'data/cache/images/image-100.jpg'],
51
            'png smaller webp' => ['png', 100, true, 'data/cache/images/image-100.webp'],
52
            'png same' => ['png', 200, false, 'data/cache/images/image-200.jpg'],
53
            'png same webp' => ['png', 200, true, 'data/cache/images/image-200.webp'],
54
            'png bigger' => ['png', 300, false, 'data/cache/images/image-200.jpg'],
55
            'png bigger webp' => ['png', 300, true, 'data/cache/images/image-200.webp'],
56
57
            // SVG is never resized
58
            'svg smaller' => ['svg', 100, false, '/felix/image.svg'],
59
            'svg smaller webp' => ['svg', 100, true, '/felix/image.svg'],
60
            'svg same' => ['svg', 200, false, '/felix/image.svg'],
61
            'svg same webp' => ['svg', 200, true, '/felix/image.svg'],
62
            'svg bigger' => ['svg', 300, false, '/felix/image.svg'],
63
            'svg bigger webp' => ['svg', 300, true, '/felix/image.svg'],
64
65
            // TIFF is never returned as TIFF
66
            'tiff smaller' => ['tiff', 100, false, 'data/cache/images/image-100.jpg'],
67
            'tiff smaller webp' => ['tiff', 100, true, 'data/cache/images/image-100.webp'],
68
            'tiff same' => ['tiff', 200, false, 'data/cache/images/image-200.jpg'],
69
            'tiff same webp' => ['tiff', 200, true, 'data/cache/images/image-200.webp'],
70
            'tiff bigger' => ['tiff', 300, false, 'data/cache/images/image-200.jpg'],
71
            'tiff bigger webp' => ['tiff', 300, true, 'data/cache/images/image-200.webp'],
72
        ];
73
    }
74
75
    public function testWebpToJpg(): void
76
    {
77
        $imagineImage = $this->createMock(ImageInterface::class);
78
79
        $imagine = $this->createMock(ImagineInterface::class);
80
        $imagine->expects(self::once())->method('open')->willReturn($imagineImage);
81
82
        $imageResizer = new ImageResizer($imagine);
83
        $image = $this->createMock(Image::class);
84
        $image->expects(self::once())->method('getPath')->willReturn('/felix/image.webp');
85
        $image->expects(self::once())->method('getFilename')->willReturn('image.webp');
86
87
        $actual = $imageResizer->webpToJpg($image);
88
        self::assertStringEndsWith('data/cache/images/image.jpg', $actual);
89
    }
90
}
91