Issues (3627)

FormBundle/Tests/Model/FormUploaderTest.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   2014 Mautic Contributors. All rights reserved
5
 * @author      Mautic
6
 *
7
 * @link        http://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\FormBundle\Tests\Model;
13
14
use Mautic\CoreBundle\Exception\FileUploadException;
15
use Mautic\CoreBundle\Helper\CoreParametersHelper;
16
use Mautic\CoreBundle\Helper\FileUploader;
17
use Mautic\FormBundle\Crate\UploadFileCrate;
18
use Mautic\FormBundle\Entity\Field;
19
use Mautic\FormBundle\Entity\Form;
20
use Mautic\FormBundle\Entity\Submission;
21
use Mautic\FormBundle\Helper\FormUploader;
22
use Symfony\Component\HttpFoundation\File\UploadedFile;
23
24
class FormUploaderTest extends \PHPUnit\Framework\TestCase
25
{
26
    private $formId1   = 1;
27
    private $formId2   = 2;
28
    private $uploadDir = 'path/to/file';
29
30
    /**
31
     * @testdox Uploader uploads files correctly
32
     *
33
     * @covers \Mautic\FormBundle\Helper\FormUploader::uploadFiles
34
     */
35
    public function testSuccessfulUploadFiles()
36
    {
37
        $fileUploaderMock = $this->getMockBuilder(FileUploader::class)
38
            ->disableOriginalConstructor()
39
            ->getMock();
40
41
        $coreParametersHelperMock = $this->getMockBuilder(CoreParametersHelper::class)
42
            ->disableOriginalConstructor()
43
            ->getMock();
44
        $coreParametersHelperMock->expects($this->exactly(2))
45
            ->method('get')
46
            ->with('form_upload_dir')
47
            ->willReturn($this->uploadDir);
48
49
        $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock);
50
51
        $file1Mock = $this->getMockBuilder(UploadedFile::class)
52
            ->disableOriginalConstructor()
53
            ->getMock();
54
55
        $file2Mock = $this->getMockBuilder(UploadedFile::class)
56
            ->disableOriginalConstructor()
57
            ->getMock();
58
59
        $form1Mock = $this->getMockBuilder(Form::class)
60
            ->disableOriginalConstructor()
61
            ->getMock();
62
63
        $form1Mock->expects($this->once())
64
            ->method('getId')
65
            ->with()
66
            ->willReturn($this->formId1);
67
68
        $field1Mock = $this->getMockBuilder(Field::class)
69
            ->disableOriginalConstructor()
70
            ->getMock();
71
72
        $field1Mock->expects($this->once())
73
            ->method('getId')
74
            ->with()
75
            ->willReturn('fieldId1');
76
77
        $field1Mock->expects($this->once())
78
            ->method('getForm')
79
            ->with()
80
            ->willReturn($form1Mock);
81
82
        $field1Mock->expects($this->once())
83
            ->method('getAlias')
84
            ->with()
85
            ->willReturn('file1');
86
87
        $form2Mock = $this->getMockBuilder(Form::class)
88
            ->disableOriginalConstructor()
89
            ->getMock();
90
91
        $form2Mock->expects($this->once())
92
            ->method('getId')
93
            ->with()
94
            ->willReturn($this->formId2);
95
96
        $field2Mock = $this->getMockBuilder(Field::class)
97
            ->disableOriginalConstructor()
98
            ->getMock();
99
100
        $field2Mock->expects($this->once())
101
            ->method('getId')
102
            ->with()
103
            ->willReturn('fieldId2');
104
105
        $field2Mock->expects($this->once())
106
            ->method('getForm')
107
            ->with()
108
            ->willReturn($form2Mock);
109
110
        $field2Mock->expects($this->once())
111
            ->method('getAlias')
112
            ->with()
113
            ->willReturn('file2');
114
115
        $filesToUpload = new UploadFileCrate();
116
        $filesToUpload->addFile($file1Mock, $field1Mock);
117
        $filesToUpload->addFile($file2Mock, $field2Mock);
118
119
        $submission = new Submission();
120
        $submission->setResults(['key' => 'value']);
121
122
        $path1 = $this->uploadDir.'/1/fieldId1';
123
        $path2 = $this->uploadDir.'/2/fieldId2';
124
125
        $fileUploaderMock->expects($this->at(0))
126
            ->method('upload')
127
            ->with($path1, $file1Mock)
128
            ->willReturn('upload1');
129
130
        $fileUploaderMock->expects($this->at(1))
131
            ->method('upload')
132
            ->with($path2, $file2Mock)
133
            ->willReturn('upload2');
134
135
        $formUploader->uploadFiles($filesToUpload, $submission);
136
137
        $expected = [
138
            'key'   => 'value',
139
            'file1' => 'upload1',
140
            'file2' => 'upload2',
141
        ];
142
143
        $this->assertSame($expected, $submission->getResults());
144
    }
145
146
    /**
147
     * @testdox Uploader delete uploaded file if anz error occures
148
     *
149
     * @covers \Mautic\FormBundle\Helper\FormUploader::uploadFiles
150
     */
151
    public function testUploadFilesWithError()
152
    {
153
        $fileUploaderMock = $this->getMockBuilder(FileUploader::class)
154
            ->disableOriginalConstructor()
155
            ->getMock();
156
157
        $coreParametersHelperMock = $this->getMockBuilder(CoreParametersHelper::class)
158
            ->disableOriginalConstructor()
159
            ->getMock();
160
        $coreParametersHelperMock->expects($this->exactly(2))
161
            ->method('get')
162
            ->with('form_upload_dir')
163
            ->willReturn($this->uploadDir);
164
165
        $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock);
166
167
        $file1Mock = $this->getMockBuilder(UploadedFile::class)
168
            ->disableOriginalConstructor()
169
            ->getMock();
170
171
        $file2Mock = $this->getMockBuilder(UploadedFile::class)
172
            ->disableOriginalConstructor()
173
            ->getMock();
174
175
        $form1Mock = $this->getMockBuilder(Form::class)
176
            ->disableOriginalConstructor()
177
            ->getMock();
178
179
        $form1Mock->expects($this->once())
180
            ->method('getId')
181
            ->with()
182
            ->willReturn($this->formId1);
183
184
        $field1Mock = $this->getMockBuilder(Field::class)
185
            ->disableOriginalConstructor()
186
            ->getMock();
187
188
        $field1Mock->expects($this->once())
189
            ->method('getId')
190
            ->with()
191
            ->willReturn('fieldId1');
192
193
        $field1Mock->expects($this->once())
194
            ->method('getForm')
195
            ->with()
196
            ->willReturn($form1Mock);
197
198
        $field1Mock->expects($this->once())
199
            ->method('getAlias')
200
            ->with()
201
            ->willReturn('file1');
202
203
        $form2Mock = $this->getMockBuilder(Form::class)
204
            ->disableOriginalConstructor()
205
            ->getMock();
206
207
        $form2Mock->expects($this->once())
208
            ->method('getId')
209
            ->with()
210
            ->willReturn($this->formId2);
211
212
        $field2Mock = $this->getMockBuilder(Field::class)
213
            ->disableOriginalConstructor()
214
            ->getMock();
215
216
        $field2Mock->expects($this->once())
217
            ->method('getId')
218
            ->with()
219
            ->willReturn('fieldId2');
220
221
        $field2Mock->expects($this->once())
222
            ->method('getForm')
223
            ->with()
224
            ->willReturn($form2Mock);
225
226
        $field2Mock->expects($this->once())
227
            ->method('getAlias')
228
            ->with()
229
            ->willReturn('file2');
230
231
        $filesToUpload = new UploadFileCrate();
232
        $filesToUpload->addFile($file1Mock, $field1Mock);
233
        $filesToUpload->addFile($file2Mock, $field2Mock);
234
235
        $submission = new Submission();
236
        $submission->setResults(['key' => 'value']);
237
238
        $path1 = $this->uploadDir.'/1/fieldId1';
239
        $path2 = $this->uploadDir.'/2/fieldId2';
240
241
        $fileUploaderMock->expects($this->at(0))
242
            ->method('upload')
243
            ->with($path1, $file1Mock)
244
            ->willReturn('upload1');
245
246
        $fileUploaderMock->expects($this->at(1))
247
            ->method('upload')
248
            ->with($path2, $file2Mock)
249
            ->willThrowException(new FileUploadException());
250
251
        $fileUploaderMock->expects($this->once())
252
            ->method('delete')
253
            ->with('path/to/file/1/fieldId1/upload1');
254
255
        $this->expectException(FileUploadException::class);
256
        $this->expectExceptionMessage('file2');
257
258
        $formUploader->uploadFiles($filesToUpload, $submission);
259
260
        $expected = [
261
            'key'   => 'value',
262
            'file1' => 'upload1',
263
            'file2' => 'upload2',
264
        ];
265
266
        $this->assertSame($expected, $submission->getResults());
267
    }
268
269
    /**
270
     * @testdox Uploader do nothing if no files for upload provided
271
     *
272
     * @covers \Mautic\FormBundle\Helper\FormUploader::uploadFiles
273
     */
274
    public function testNoFilesUploadFiles()
275
    {
276
        $fileUploaderMock = $this->getMockBuilder(FileUploader::class)
277
            ->disableOriginalConstructor()
278
            ->getMock();
279
280
        $fileUploaderMock->expects($this->never())
281
            ->method('upload');
282
283
        $fileUploaderMock->expects($this->never())
284
            ->method('delete');
285
286
        $coreParametersHelperMock = $this->getMockBuilder(CoreParametersHelper::class)
287
            ->disableOriginalConstructor()
288
            ->getMock();
289
290
        $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock);
291
292
        $filesToUpload = new UploadFileCrate();
293
        $submission    = new Submission();
294
295
        $formUploader->uploadFiles($filesToUpload, $submission);
296
    }
297
298
    /**
299
     * @testdox Uploader returs correct path for file
300
     *
301
     * @covers \Mautic\FormBundle\Helper\FormUploader::getCompleteFilePath
302
     */
303
    public function testGetCompleteFilePath()
304
    {
305
        $fileUploaderMock = $this->getMockBuilder(FileUploader::class)
306
            ->disableOriginalConstructor()
307
            ->getMock();
308
309
        $coreParametersHelperMock = $this->getMockBuilder(CoreParametersHelper::class)
310
            ->disableOriginalConstructor()
311
            ->getMock();
312
        $coreParametersHelperMock->expects($this->once())
313
            ->method('get')
314
            ->with('form_upload_dir')
315
            ->willReturn($this->uploadDir);
316
317
        $formMock = $this->getMockBuilder(Form::class)
318
            ->disableOriginalConstructor()
319
            ->getMock();
320
321
        $formMock->expects($this->once())
322
            ->method('getId')
323
            ->with()
324
            ->willReturn($this->formId1);
325
326
        $fieldMock = $this->getMockBuilder(Field::class)
327
            ->disableOriginalConstructor()
328
            ->getMock();
329
330
        $fieldMock->expects($this->once())
331
            ->method('getId')
332
            ->with()
333
            ->willReturn('fieldId1');
334
335
        $fieldMock->expects($this->once())
336
            ->method('getForm')
337
            ->with()
338
            ->willReturn($formMock);
339
340
        $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock);
341
342
        $actual = $formUploader->getCompleteFilePath($fieldMock, 'fileName');
343
344
        $this->assertSame('path/to/file/1/fieldId1/fileName', $actual);
345
    }
346
347
    /**
348
     * @testdox Uploader delete files correctly
349
     *
350
     * @covers \Mautic\FormBundle\Helper\FormUploader::deleteAllFilesOfFormField
351
     */
352
    public function testDeleteAllFilesOfFormField()
353
    {
354
        $fileUploaderMock = $this->getMockBuilder(FileUploader::class)
355
            ->disableOriginalConstructor()
356
            ->getMock();
357
358
        $fileUploaderMock->expects($this->once())
359
            ->method('delete')
360
            ->with('path/to/file/1/fieldId1');
361
362
        $coreParametersHelperMock = $this->getMockBuilder(CoreParametersHelper::class)
363
            ->disableOriginalConstructor()
364
            ->getMock();
365
        $coreParametersHelperMock->expects($this->once())
366
            ->method('get')
367
            ->with('form_upload_dir')
368
            ->willReturn($this->uploadDir);
369
370
        $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock);
371
372
        $formMock = $this->getMockBuilder(Form::class)
373
            ->disableOriginalConstructor()
374
            ->getMock();
375
376
        $formMock->expects($this->once())
377
            ->method('getId')
378
            ->with()
379
            ->willReturn($this->formId1);
380
381
        $fieldMock = $this->getMockBuilder(Field::class)
382
            ->disableOriginalConstructor()
383
            ->getMock();
384
385
        $fieldMock->expects($this->once())
386
            ->method('getId')
387
            ->with()
388
            ->willReturn('fieldId1');
389
390
        $fieldMock->expects($this->once())
391
            ->method('getForm')
392
            ->with()
393
            ->willReturn($formMock);
394
395
        $fieldMock->expects($this->once())
396
            ->method('isFileType')
397
            ->with()
398
            ->willReturn(true);
399
400
        $formUploader->deleteAllFilesOfFormField($fieldMock);
401
    }
402
403
    public function testDeleteFilesOfForm()
404
    {
405
        $fileUploaderMock = $this->getMockBuilder(FileUploader::class)
406
            ->disableOriginalConstructor()
407
            ->getMock();
408
409
        $fileUploaderMock
410
            ->method('delete')
411
            ->with('path/to/file/1');
412
413
        $coreParametersHelperMock = $this->getMockBuilder(CoreParametersHelper::class)
414
            ->disableOriginalConstructor()
415
            ->getMock();
416
        $coreParametersHelperMock->expects($this->exactly(2))
417
            ->method('get')
418
            ->with('form_upload_dir')
419
            ->willReturn($this->uploadDir);
420
421
        $formMock = $this->getMockBuilder(Form::class)
422
            ->disableOriginalConstructor()
423
            ->getMock();
424
425
        $formMock->expects($this->at(0))
426
            ->method('getId')
427
            ->with()
428
            ->willReturn($this->formId1);
429
430
        $formMock->expects($this->at(1))
431
            ->method('getId')
432
            ->with()
433
            ->willReturn(null);
434
435
        $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock);
436
        $formUploader->deleteFilesOfForm($formMock);
437
438
        $formMock->deletedId = $this->formId1;
0 ignored issues
show
Accessing deletedId on the interface PHPUnit\Framework\MockObject\MockObject suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
439
440
        $formUploader->deleteFilesOfForm($formMock);
441
    }
442
}
443