Completed
Push — master ( 52b06e...08177a )
by
unknown
04:10 queued 10s
created

ImageProviderTest::testMetadata()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Sonata Project package.
7
 *
8
 * (c) Thomas Rabaix <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Sonata\MediaBundle\Tests\Provider;
15
16
use Gaufrette\Adapter;
17
use Gaufrette\File;
18
use Gaufrette\Filesystem;
19
use Imagine\Image\Box;
20
use Imagine\Image\BoxInterface;
21
use Imagine\Image\ImageInterface;
22
use Imagine\Image\ImagineInterface;
23
use Sonata\MediaBundle\CDN\Server;
24
use Sonata\MediaBundle\Generator\DefaultGenerator;
25
use Sonata\MediaBundle\Metadata\MetadataBuilderInterface;
26
use Sonata\MediaBundle\Provider\ImageProvider;
27
use Sonata\MediaBundle\Resizer\ResizerInterface;
28
use Sonata\MediaBundle\Tests\Entity\Media;
29
use Sonata\MediaBundle\Thumbnail\FormatThumbnail;
30
31
class ImageProviderTest extends AbstractProviderTest
32
{
33
    public function getProvider($allowedExtensions = [], $allowedMimeTypes = [], $box = false)
34
    {
35
        $resizer = $this->createMock(ResizerInterface::class);
36
        $resizer->expects($this->any())->method('resize')->will($this->returnValue(true));
37
        if ($box) {
38
            $resizer->expects($this->any())->method('getBox')->will($box);
39
        }
40
41
        $adapter = $this->createMock(Adapter::class);
42
43
        $filesystem = $this->getMockBuilder(Filesystem::class)
44
            ->setMethods(['get'])
45
            ->setConstructorArgs([$adapter])
46
            ->getMock();
47
        $file = $this->getMockBuilder(File::class)
48
            ->setConstructorArgs(['foo', $filesystem])
49
            ->getMock();
50
        $filesystem->expects($this->any())->method('get')->will($this->returnValue($file));
51
52
        $cdn = new Server('/uploads/media');
53
54
        $generator = new DefaultGenerator();
55
56
        $thumbnail = new FormatThumbnail('jpg');
57
58
        $size = $this->createMock(BoxInterface::class);
59
        $size->expects($this->any())->method('getWidth')->will($this->returnValue(100));
60
        $size->expects($this->any())->method('getHeight')->will($this->returnValue(100));
61
62
        $image = $this->createMock(ImageInterface::class);
63
        $image->expects($this->any())->method('getSize')->will($this->returnValue($size));
64
65
        $adapter = $this->createMock(ImagineInterface::class);
66
        $adapter->expects($this->any())->method('open')->will($this->returnValue($image));
67
68
        $metadata = $this->createMock(MetadataBuilderInterface::class);
69
70
        $provider = new ImageProvider('image', $filesystem, $cdn, $generator, $thumbnail, $allowedExtensions, $allowedMimeTypes, $adapter, $metadata);
71
        $provider->setResizer($resizer);
72
73
        return $provider;
74
    }
75
76
    public function testProvider(): void
77
    {
78
        $provider = $this->getProvider();
79
80
        $media = new Media();
81
        $media->setName('test.png');
82
        $media->setProviderReference('ASDASDAS.png');
83
        $media->setId(1023456);
84
        $media->setContext('default');
85
86
        $this->assertSame('default/0011/24/ASDASDAS.png', $provider->getReferenceImage($media));
87
88
        $this->assertSame('default/0011/24', $provider->generatePath($media));
89
        $this->assertSame('/uploads/media/default/0011/24/thumb_1023456_big.png', $provider->generatePublicUrl($media, 'big'));
90
        $this->assertSame('/uploads/media/default/0011/24/ASDASDAS.png', $provider->generatePublicUrl($media, 'reference'));
91
92
        $this->assertSame('default/0011/24/ASDASDAS.png', $provider->generatePrivateUrl($media, 'reference'));
93
        $this->assertSame('default/0011/24/thumb_1023456_big.png', $provider->generatePrivateUrl($media, 'big'));
94
    }
95
96
    public function testHelperProperies(): void
97
    {
98
        $adminBox = new Box(100, 100);
99
        $mediumBox = new Box(500, 250);
100
        $largeBox = new Box(1000, 500);
101
102
        $provider = $this->getProvider(
103
            [],
104
            [],
105
            $this->onConsecutiveCalls(
106
                $largeBox, // first properties call
107
                $mediumBox,
108
                $largeBox,
109
                $mediumBox, // second call
110
                $mediumBox,
111
                $largeBox,
112
                $adminBox // Third call
113
            ));
114
115
        $provider->addFormat('admin', ['width' => 100]);
116
        $provider->addFormat('default_medium', ['width' => 500]);
117
        $provider->addFormat('default_large', ['width' => 1000]);
118
119
        $media = new Media();
120
        $media->setName('test.png');
121
        $media->setProviderReference('ASDASDAS.png');
122
        $media->setId(10);
123
        $media->setHeight(500);
124
        $media->setWidth(1500);
125
        $media->setContext('default');
126
127
        $srcSet = '/uploads/media/default/0001/01/thumb_10_default_medium.png 500w, /uploads/media/default/0001/01/thumb_10_default_large.png 1000w, /uploads/media/default/0001/01/ASDASDAS.png 1500w';
128
129
        $properties = $provider->getHelperProperties($media, 'default_large');
130
131
        $this->assertInternalType('array', $properties);
132
        $this->assertSame('test.png', $properties['title']);
133
        $this->assertSame(1000, $properties['width']);
134
        $this->assertSame($srcSet, $properties['srcset']);
135
        $this->assertSame(
136
            '/uploads/media/default/0001/01/thumb_10_default_large.png',
137
            $properties['src']
138
        );
139
        $this->assertSame('(max-width: 1000px) 100vw, 1000px', $properties['sizes']);
140
141
        $properties = $provider->getHelperProperties($media, 'default_large', ['srcset' => ['default_medium']]);
142
        $this->assertSame($srcSet, $properties['srcset']);
143
        $this->assertSame(
144
            '/uploads/media/default/0001/01/thumb_10_default_large.png',
145
            $properties['src']
146
        );
147
        $this->assertSame('(max-width: 500px) 100vw, 500px', $properties['sizes']);
148
149
        $properties = $provider->getHelperProperties($media, 'admin', [
150
            'width' => 150,
151
        ]);
152
        $this->assertArrayNotHasKey('sizes', $properties);
153
        $this->assertArrayNotHasKey('srcset', $properties);
154
155
        $this->assertSame(150, $properties['width']);
156
    }
157
158
    public function testThumbnail(): void
159
    {
160
        $provider = $this->getProvider();
161
162
        $media = new Media();
163
        $media->setName('test.png');
164
        $media->setProviderReference('ASDASDAS.png');
165
        $media->setId(1023456);
166
        $media->setContext('default');
167
168
        $this->assertTrue($provider->requireThumbnails($media));
0 ignored issues
show
Unused Code introduced by
The call to ImageProvider::requireThumbnails() has too many arguments starting with $media.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
169
170
        $provider->addFormat('big', ['width' => 200, 'height' => 100, 'constraint' => true]);
171
172
        $this->assertNotEmpty($provider->getFormats(), '::getFormats() return an array');
173
174
        $provider->generateThumbnails($media);
175
176
        $this->assertSame('default/0011/24/thumb_1023456_big.png', $provider->generatePrivateUrl($media, 'big'));
177
    }
178
179
    public function testEvent(): void
180
    {
181
        $provider = $this->getProvider();
182
183
        $provider->addFormat('big', ['width' => 200, 'height' => 100, 'constraint' => true]);
184
185
        $file = new \Symfony\Component\HttpFoundation\File\File(realpath(__DIR__.'/../fixtures/logo.png'));
186
187
        $media = new Media();
188
        $media->setContext('default');
189
        $media->setBinaryContent($file);
190
        $media->setId(1023456);
191
192
        // pre persist the media
193
        $provider->transform($media);
194
        $provider->prePersist($media);
195
196
        $this->assertSame('logo.png', $media->getName(), '::getName() return the file name');
197
        $this->assertNotNull($media->getProviderReference(), '::getProviderReference() is set');
198
199
        // post persit the media
200
        $provider->postPersist($media);
201
202
        $provider->postRemove($media);
203
    }
204
205
    public function testTransformFormatNotSupported(): void
206
    {
207
        $provider = $this->getProvider();
208
209
        $file = new \Symfony\Component\HttpFoundation\File\File(realpath(__DIR__.'/../fixtures/logo.png'));
210
211
        $media = new Media();
212
        $media->setBinaryContent($file);
213
214
        $this->assertNull($provider->transform($media));
215
        $this->assertNull($media->getWidth(), 'Width staid null');
216
    }
217
218
    public function testMetadata()
219
    {
220
        $provider = $this->getProvider();
221
222
        $this->assertSame('image', $provider->getProviderMetadata()->getTitle());
223
        $this->assertSame('image.description', $provider->getProviderMetadata()->getDescription());
224
        $this->assertNotNull($provider->getProviderMetadata()->getImage());
225
        $this->assertSame('fa fa-picture-o', $provider->getProviderMetadata()->getOption('class'));
226
        $this->assertSame('SonataMediaBundle', $provider->getProviderMetadata()->getDomain());
227
    }
228
}
229