Passed
Push — master ( 86b6f9...3f7190 )
by Adrien
02:48
created

ImageResizerTest::testWebpToJpg()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 14
rs 9.9666
cc 1
nc 1
nop 0
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
    public function testResize(string $extension, int $wantedHeight, bool $useWebp, string $expected): void
20
    {
21
        $mime = match ($extension) {
22
            'png' => 'image/png',
23
            'svg' => 'image/svg+xml',
24
            'tiff' => 'image/tiff',
25
            default => throw new Exception('Unsupported extension: ' . $extension),
26
        };
27
28
        $imagineImage = $this->createMock(ImageInterface::class);
29
        $imagineImage->expects(self::atMost(1))->method('thumbnail')->willReturnSelf();
30
31
        $imagine = $this->createMock(ImagineInterface::class);
32
        $imagine->expects(self::atMost(1))->method('open')->willReturn($imagineImage);
33
34
        $resizer = new ImageResizer($imagine);
35
        $image = $this->createMock(Image::class);
36
        $image->expects(self::once())->method('getPath')->willReturn('/felix/image.' . $extension);
37
        $image->expects(self::atMost(1))->method('getFilename')->willReturn('image.' . $extension);
38
        $image->expects(self::atMost(1))->method('getHeight')->willReturn(200);
39
        $image->expects(self::atMost(1))->method('getMime')->willReturn($mime);
40
41
        $actual = $resizer->resize($image, $wantedHeight, $useWebp);
42
        self::assertStringEndsWith($expected, $actual);
43
    }
44
45
    public function providerResize(): array
46
    {
47
        return [
48
            'png smaller' => ['png', 100, false, 'data/cache/images/image-100.jpg'],
49
            'png smaller webp' => ['png', 100, true, 'data/cache/images/image-100.webp'],
50
            'png same' => ['png', 200, false, 'data/cache/images/image-200.jpg'],
51
            'png same webp' => ['png', 200, true, 'data/cache/images/image-200.webp'],
52
            'png bigger' => ['png', 300, false, 'data/cache/images/image-200.jpg'],
53
            'png bigger webp' => ['png', 300, true, 'data/cache/images/image-200.webp'],
54
55
            // SVG is never resized
56
            'svg smaller' => ['svg', 100, false, '/felix/image.svg'],
57
            'svg smaller webp' => ['svg', 100, true, '/felix/image.svg'],
58
            'svg same' => ['svg', 200, false, '/felix/image.svg'],
59
            'svg same webp' => ['svg', 200, true, '/felix/image.svg'],
60
            'svg bigger' => ['svg', 300, false, '/felix/image.svg'],
61
            'svg bigger webp' => ['svg', 300, true, '/felix/image.svg'],
62
63
            // TIFF is never returned as TIFF
64
            'tiff smaller' => ['tiff', 100, false, 'data/cache/images/image-100.jpg'],
65
            'tiff smaller webp' => ['tiff', 100, true, 'data/cache/images/image-100.webp'],
66
            'tiff same' => ['tiff', 200, false, 'data/cache/images/image-200.jpg'],
67
            'tiff same webp' => ['tiff', 200, true, 'data/cache/images/image-200.webp'],
68
            'tiff bigger' => ['tiff', 300, false, 'data/cache/images/image-200.jpg'],
69
            'tiff bigger webp' => ['tiff', 300, true, 'data/cache/images/image-200.webp'],
70
        ];
71
    }
72
73
    public function testWebpToJpg(): void
74
    {
75
        $imagineImage = $this->createMock(ImageInterface::class);
76
77
        $imagine = $this->createMock(ImagineInterface::class);
78
        $imagine->expects(self::once())->method('open')->willReturn($imagineImage);
79
80
        $imageResizer = new ImageResizer($imagine);
81
        $image = $this->createMock(Image::class);
82
        $image->expects(self::once())->method('getPath')->willReturn('/felix/image.webp');
83
        $image->expects(self::once())->method('getFilename')->willReturn('image.webp');
84
85
        $actual = $imageResizer->webpToJpg($image);
86
        self::assertStringEndsWith('data/cache/images/image.jpg', $actual);
87
    }
88
}
89