Completed
Push — master ( 4b87b5...55d77f )
by Sullivan
03:57
created

FileProviderTest::testBinaryContentStreamWrapped()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 40
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 28
nc 1
nop 0
dl 0
loc 40
rs 8.8571
c 1
b 0
f 0
1
<?php
2
3
/*
4
 * This file is part of the Sonata Project package.
5
 *
6
 * (c) Thomas Rabaix <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sonata\MediaBundle\Tests\Provider;
13
14
use Sonata\MediaBundle\Provider\FileProvider;
15
use Sonata\MediaBundle\Tests\Entity\Media;
16
use Sonata\MediaBundle\Thumbnail\FormatThumbnail;
17
use Symfony\Component\HttpFoundation\File\File;
18
use Symfony\Component\HttpFoundation\Request;
19
20
class FileProviderTest extends \PHPUnit_Framework_TestCase
21
{
22
    public function getProvider()
23
    {
24
        $resizer = $this->getMock('Sonata\MediaBundle\Resizer\ResizerInterface');
25
        $resizer->expects($this->any())->method('resize')->will($this->returnValue(true));
26
27
        $adapter = $this->getMockBuilder('Sonata\MediaBundle\Filesystem\Local')->disableOriginalConstructor()->getMock();
28
        $adapter->expects($this->any())->method('getDirectory')->will($this->returnValue(realpath(__DIR__).'/../fixtures'));
29
30
        $filesystem = $this->getMock('Gaufrette\Filesystem', array('get'), array($adapter));
31
        $file = $this->getMock('Gaufrette\File', array(), array('foo', $filesystem));
32
        $filesystem->expects($this->any())->method('get')->will($this->returnValue($file));
33
34
        $cdn = new \Sonata\MediaBundle\CDN\Server('/uploads/media');
35
36
        $generator = new \Sonata\MediaBundle\Generator\DefaultGenerator();
37
38
        $thumbnail = new FormatThumbnail('jpg');
39
40
        $metadata = $this->getMock('Sonata\MediaBundle\Metadata\MetadataBuilderInterface');
41
42
        $provider = new FileProvider('file', $filesystem, $cdn, $generator, $thumbnail, array(), array(), $metadata);
43
        $provider->setResizer($resizer);
44
45
        return $provider;
46
    }
47
48
    public function testProvider()
49
    {
50
        $provider = $this->getProvider();
51
52
        $media = new Media();
53
        $media->setName('test.txt');
54
        $media->setProviderReference('ASDASD.txt');
55
        $media->setContext('default');
56
57
        $media->setId(1023456);
58
        $this->assertSame('default/0011/24/ASDASD.txt', $provider->getReferenceImage($media));
59
60
        $this->assertSame('default/0011/24', $provider->generatePath($media));
61
62
        // default icon image
63
        $this->assertSame('/uploads/media/sonatamedia/files/big/file.png', $provider->generatePublicUrl($media, 'big'));
64
    }
65
66
    public function testHelperProperies()
67
    {
68
        $provider = $this->getProvider();
69
70
        $provider->addFormat('admin', array('width' => 100));
71
        $media = new Media();
72
        $media->setName('test.png');
73
        $media->setProviderReference('ASDASDAS.png');
74
        $media->setId(10);
75
        $media->setHeight(100);
76
77
        $properties = $provider->getHelperProperties($media, 'admin');
78
79
        $this->assertInternalType('array', $properties);
80
        $this->assertSame('test.png', $properties['title']);
81
    }
82
83
    public function testForm()
84
    {
85
        if (!class_exists('Sonata\AdminBundle\Form\FormMapper')) {
86
            $this->markTestSkipped("AdminBundle doesn't seem to be installed");
87
        }
88
89
        $provider = $this->getProvider();
90
91
        $admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
92
        $admin->expects($this->any())
93
            ->method('trans')
94
            ->will($this->returnValue('message'));
95
96
        $formMapper = $this->getMock('Sonata\AdminBundle\Form\FormMapper', array('add', 'getAdmin'), array(), '', false);
97
        $formMapper->expects($this->exactly(8))
98
            ->method('add')
99
            ->will($this->returnValue(null));
100
101
        $provider->buildCreateForm($formMapper);
102
        $provider->buildEditForm($formMapper);
103
    }
104
105
    public function testThumbnail()
106
    {
107
        $provider = $this->getProvider();
108
109
        $media = new Media();
110
        $media->setName('test.png');
111
        $media->setId(1023456);
112
113
        $provider->generateThumbnails($media);
114
    }
115
116
    public function testEvent()
117
    {
118
        $provider = $this->getProvider();
119
120
        $provider->addFormat('big', array('width' => 200, 'height' => 100, 'constraint' => true));
121
122
        $file = __DIR__.'/../fixtures/file.txt';
123
124
        $media = new Media();
125
        $provider->preUpdate($media);
126
        $this->assertNull($media->getProviderReference());
127
128
        $media->setBinaryContent($file);
129
        $provider->transform($media);
130
131
        $this->assertInstanceOf('\DateTime', $media->getUpdatedAt());
132
        $this->assertNotNull($media->getProviderReference());
133
134
        $provider->postUpdate($media);
135
136
        $file = new \Symfony\Component\HttpFoundation\File\File(realpath(__DIR__.'/../fixtures/file.txt'));
137
138
        $media = new Media();
139
        $media->setBinaryContent($file);
140
        $media->setId(1023456);
141
142
        // pre persist the media
143
        $provider->transform($media);
144
145
        $this->assertSame('file.txt', $media->getName(), '::getName() return the file name');
146
        $this->assertNotNull($media->getProviderReference(), '::getProviderReference() is set');
147
148
        $this->assertFalse($provider->generatePrivateUrl($media, 'big'), '::generatePrivateUrl() return false on non reference formate');
149
        $this->assertNotNull($provider->generatePrivateUrl($media, 'reference'), '::generatePrivateUrl() return path for reference formate');
150
    }
151
152
    public function testDownload()
153
    {
154
        $provider = $this->getProvider();
155
156
        $file = new File(realpath(__DIR__.'/../fixtures/FileProviderTest/0011/24/file.txt'));
157
158
        $media = new Media();
159
        $media->setBinaryContent($file);
160
        $media->setProviderReference('file.txt');
161
        $media->setContext('FileProviderTest');
162
        $media->setId(1023456);
163
164
        $response = $provider->getDownloadResponse($media, 'reference', 'X-Accel-Redirect');
165
166
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\BinaryFileResponse', $response);
167
    }
168
169
    /**
170
     * @dataProvider mediaProvider
171
     */
172
    public function testTransform($expected, $media, $overridePhpSapiName = true)
173
    {
174
        $self = $this;
175
176
        $closure = function () use ($self, $expected, $media, $overridePhpSapiName) {
177
            if ($overridePhpSapiName) {
178
                require_once 'phpSapiNameOverride.php';
179
            }
180
181
            $provider = $self->getProvider();
182
183
            try {
184
                $provider->transform($media);
185
186
                $self->assertInstanceOf($expected, $media->getBinaryContent());
187
            } catch (\Exception $e) {
188
                if ($overridePhpSapiName) {
189
                    $self->assertInstanceOf('\RuntimeException', $e);
190
                    $self->assertNull($media->getContentType());
191
                } else {
192
                    $self->assertEquals('The current process cannot be executed in cli environment', $e->getMessage());
193
                }
194
            }
195
        };
196
197
        $closure();
198
    }
199
200
    public function mediaProvider()
201
    {
202
        $file = new \Symfony\Component\HttpFoundation\File\File(realpath(__DIR__.'/../fixtures/file.txt'));
203
        $content = file_get_contents(realpath(__DIR__.'/../fixtures/file.txt'));
204
        $request = new Request(array(), array(), array(), array(), array(), array(), $content);
205
206
        $media1 = new Media();
207
        $media1->setBinaryContent($file);
208
        $media1->setContentType('foo');
209
        $media1->setId(1023456);
210
211
        $media2 = new Media();
212
        $media2->setBinaryContent($request);
213
        $media2->setContentType('text/plain');
214
        $media2->setId(1023456);
215
216
        $media3 = new Media();
217
        $media3->setBinaryContent($request);
218
        $media3->setId(1023456);
219
220
        return array(
221
            array('\Symfony\Component\HttpFoundation\File\File', $media1, false),
222
            array('\Symfony\Component\HttpFoundation\File\File', $media1),
223
            array('\Symfony\Component\HttpFoundation\File\File', $media2),
224
            array(null, $media3),
225
        );
226
    }
227
228
    public function testBinaryContentWithRealPath()
229
    {
230
        $media = $this->getMock('Sonata\MediaBundle\Model\MediaInterface');
231
232
        $media->expects($this->any())
233
            ->method('getProviderReference')
234
            ->willReturn('provider');
235
236
        $media->expects($this->any())
237
            ->method('getId')
238
            ->willReturn(10000);
239
240
        $media->expects($this->any())
241
            ->method('getContext')
242
            ->willReturn('context');
243
244
        $binaryContent = $this->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
245
            ->setMethods(array('getRealPath', 'getPathname'))
246
            ->disableOriginalConstructor()
247
            ->getMock();
248
249
        $binaryContent->expects($this->atLeastOnce())
250
            ->method('getRealPath')
251
            ->willReturn(__DIR__.'/../fixtures/file.txt');
252
253
        $binaryContent->expects($this->never())
254
            ->method('getPathname');
255
256
        $media->expects($this->any())
257
            ->method('getBinaryContent')
258
            ->willReturn($binaryContent);
259
260
        $provider = $this->getProvider();
261
262
        $setFileContents = new \ReflectionMethod('Sonata\MediaBundle\Provider\FileProvider', 'setFileContents');
263
        $setFileContents->setAccessible(true);
264
265
        $setFileContents->invoke($provider, $media);
266
    }
267
268
    public function testBinaryContentStreamWrapped()
269
    {
270
        $media = $this->getMock('Sonata\MediaBundle\Model\MediaInterface');
271
272
        $media->expects($this->any())
273
            ->method('getProviderReference')
274
            ->willReturn('provider');
275
276
        $media->expects($this->any())
277
            ->method('getId')
278
            ->willReturn(10000);
279
280
        $media->expects($this->any())
281
            ->method('getContext')
282
            ->willReturn('context');
283
284
        $binaryContent = $this->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
285
            ->setMethods(array('getRealPath', 'getPathname'))
286
            ->disableOriginalConstructor()
287
            ->getMock();
288
289
        $binaryContent->expects($this->atLeastOnce())
290
            ->method('getRealPath')
291
            ->willReturn(false);
292
293
        $binaryContent->expects($this->atLeastOnce())
294
            ->method('getPathname')
295
            ->willReturn(__DIR__.'/../fixtures/file.txt');
296
297
        $media->expects($this->any())
298
            ->method('getBinaryContent')
299
            ->willReturn($binaryContent);
300
301
        $provider = $this->getProvider();
302
303
        $setFileContents = new \ReflectionMethod('Sonata\MediaBundle\Provider\FileProvider', 'setFileContents');
304
        $setFileContents->setAccessible(true);
305
306
        $setFileContents->invoke($provider, $media);
307
    }
308
}
309