Passed
Push — dependabot/composer/mailmotor/... ( d27c6d...72bc92 )
by
unknown
104:58 queued 99:56
created

ThumbnailsTest::getWidthFromFolder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 2
nc 2
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace ForkCMS\Tests\Utility;
4
5
use ForkCMS\Utility\Thumbnails;
6
use PHPUnit\Framework\TestCase;
7
use Symfony\Component\Filesystem\Filesystem;
8
9
class ThumbnailsTest extends TestCase
10
{
11
    // test images
12
    private const IMAGE_SQUARE = 'square.png'; // (200x200)
13
    private const IMAGE_LANDSCAPE = 'landscape.png'; // (200x100)
14
    private const IMAGE_PORTRAIT = 'portrait.png'; // (100x200)
15
    private const IMAGE_SOURCES = [
16
        self::IMAGE_SQUARE => 'data:image/png;base64,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',
17
        self::IMAGE_LANDSCAPE => 'data:image/png;base64,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',
18
        self::IMAGE_PORTRAIT => 'data:image/png;base64,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',
19
    ];
20
21
    // Folders
22
    private const BASE_FOLDER = __DIR__ . '/../../var/cache/test/thumbnails';
23
    private const SOURCE_FOLDER = 'source';
24
    private const IMAGE_FOLDERS = [
25
        '50x50',
26
        '50x200',
27
        '50x300',
28
        '100x100',
29
        '100x200',
30
        '100x300',
31
        '200x50',
32
        '200x100',
33
        '200x200',
34
        '200x300',
35
        '300x50',
36
        '300x100',
37
        '300x200',
38
        '300x300',
39
        'x50',
40
        '50x',
41
        'x100',
42
        '100x',
43
        'x200',
44
        '200x',
45
        'x300',
46
        '300x',
47
    ];
48
49
    /** @var Thumbnails */
50
    private $thumbnails;
51
52
    /** @var string */
53
    private $realBaseFolder;
54
55
    public static function setUpBeforeClass(): void
56
    {
57
        parent::setUpBeforeClass();
58
59
        self::createFolders();
60
        self::createImages();
61
    }
62
63
    public static function tearDownAfterClass(): void
64
    {
65
        parent::tearDownAfterClass();
66
67
        self::deleteFolders();
68
    }
69
70
    public function testGettingTheFolders(): void
71
    {
72
        $folderInfo = $this->thumbnails->getFolders(self::BASE_FOLDER);
73
        $this->assertCount(count($folderInfo), $folderInfo);
74
        foreach ($folderInfo as $info) {
75
            $this->assertArrayHasKey('dirname', $info, 'The array key dirname should exist');
76
            $folder = $info['dirname'];
77
            $this->assertContains($folder, self::IMAGE_FOLDERS, 'The folder "' . $folder . '" should not exist');
78
            $this->assertContains(
79
                [
80
                    'dirname' => $folder,
81
                    'path' => $this->realBaseFolder . '/' . $folder,
82
                    'url' => '',
83
                    'width' => $this->getWidthFromFolder($folder),
84
                    'height' => $this->getHeightFromFolder($folder),
85
                ],
86
                $folderInfo
87
            );
88
        }
89
    }
90
91
    public function testImagesAreGenerated(): void
92
    {
93
        foreach (self::IMAGE_SOURCES as $filename => $source) {
94
            // verify that the source image exists first
95
            self::assertTrue(is_file($this->realBaseFolder . '/' . self::SOURCE_FOLDER . '/' . $filename));
96
97
            // generate the thumbnails
98
            $this->thumbnails->generate(
99
                $this->realBaseFolder,
100
                $this->realBaseFolder . '/' . self::SOURCE_FOLDER . '/' . $filename
101
            );
102
103
            // check if the thumbnail got generated
104
            $this->assertImageExistsInThumbnailFolders($filename);
105
106
            foreach (self::IMAGE_FOLDERS as $imageFolder) {
107
                [$width, $height] = getimagesize($this->realBaseFolder . '/' . $imageFolder . '/' . $filename);
108
                $folderWidth = $this->getWidthFromFolder($imageFolder);
109
                $folderHeight = $this->getHeightFromFolder($imageFolder);
110
                if ($folderWidth === null) {
111
                    $folderWidth = (int) ($folderHeight * ($width/$height));
112
                }
113
                $this->assertSame($width, $folderWidth);
114
                if ($folderHeight === null) {
115
                    $folderHeight = (int) ($folderWidth * ($height/$width));
116
                }
117
                $this->assertSame($height, $folderHeight);
118
            }
119
        }
120
    }
121
122
    public function testImagesAreRemoved(): void
123
    {
124
        $fileSystem = new Filesystem();
125
126
        foreach (self::IMAGE_SOURCES as $filename => $source) {
127
            // verify that the source image exists first
128
            self::assertTrue(is_file($this->realBaseFolder . '/' . self::SOURCE_FOLDER . '/' . $filename));
129
130
            foreach (self::IMAGE_FOLDERS as $imageFolder) {
131
                $fileSystem->copy(
132
                    $this->realBaseFolder . '/' . self::SOURCE_FOLDER . '/' . $filename,
133
                    $this->realBaseFolder . '/' . $imageFolder . '/' . $filename
134
                );
135
            }
136
137
            // check if the thumbnail exist before removing
138
            $this->assertImageExistsInThumbnailFolders($filename);
139
            $this->thumbnails->delete($this->realBaseFolder, $filename);
140
            $this->assertImageDoesNotExistsInThumbnailFolders($filename);
141
        }
142
    }
143
144
    private function assertImageExistsInThumbnailFolders(string $filename): void
145
    {
146
        foreach (self::IMAGE_FOLDERS as $imageFolder) {
147
            self::assertFileExists($this->realBaseFolder . '/' . $imageFolder . '/' . $filename);
148
        }
149
    }
150
151
    private function assertImageDoesNotExistsInThumbnailFolders(string $filename): void
152
    {
153
        foreach (self::IMAGE_FOLDERS as $imageFolder) {
154
            self::assertFileNotExists($this->realBaseFolder . '/' . $imageFolder . '/' . $filename);
155
        }
156
    }
157
158
    private function getWidthFromFolder(string $folder): ?int
159
    {
160
        $width = (int) (explode('x', $folder)[0] ?? 0);
161
162
        return $width === 0 ? null : $width;
163
    }
164
165
    private function getHeightFromFolder(string $folder): ?int
166
    {
167
        $height = (int) (explode('x', $folder)[1] ?? 0);
168
169
        return $height === 0 ? null : $height;
170
    }
171
172
    protected function setUp(): void
173
    {
174
        parent::setUp();
175
176
        $this->realBaseFolder = realpath(self::BASE_FOLDER);
177
        $this->thumbnails = new Thumbnails($this->realBaseFolder);
178
    }
179
180
    private static function createImages(): void
181
    {
182
        foreach (self::IMAGE_SOURCES as $name => $source) {
183
            file_put_contents(
184
                self::BASE_FOLDER . '/' . self::SOURCE_FOLDER . '/' . $name,
185
                base64_decode(str_replace('data:image/png;base64,', '', $source))
186
            );
187
        }
188
    }
189
190
    private static function createFolders(): void
191
    {
192
        $fileSystem = new Filesystem();
193
        $fileSystem->mkdir(self::BASE_FOLDER . '/' . self::SOURCE_FOLDER);
194
        foreach (self::IMAGE_FOLDERS as $folder) {
195
            $fileSystem->mkdir(self::BASE_FOLDER . '/' . $folder);
196
        }
197
    }
198
199
    private static function deleteFolders(): void
200
    {
201
        $fileSystem = new Filesystem();
202
        $fileSystem->remove(self::BASE_FOLDER);
203
    }
204
}
205