Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\FormBundle\Tests\Model; | |
| use Mautic\CoreBundle\Exception\FileUploadException; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\FileUploader; | |
| use Mautic\FormBundle\Crate\UploadFileCrate; | |
| use Mautic\FormBundle\Entity\Field; | |
| use Mautic\FormBundle\Entity\Form; | |
| use Mautic\FormBundle\Entity\Submission; | |
| use Mautic\FormBundle\Helper\FormUploader; | |
| use Symfony\Component\HttpFoundation\File\UploadedFile; | |
| class FormUploaderTest extends \PHPUnit\Framework\TestCase | |
| { | |
| private $formId1 = 1; | |
| private $formId2 = 2; | |
| private $uploadDir = __DIR__.'/DummyFiles'; | |
| /** | |
| * @testdox Uploader uploads files correctly | |
| */ | |
| public function testSuccessfulUploadFiles(): void | |
| { | |
| $fileUploaderMock = $this->createMock(FileUploader::class); | |
| $coreParametersHelperMock = $this->createMock(CoreParametersHelper::class); | |
| $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock); | |
| $file1Mock = $this->createMock(UploadedFile::class); | |
| $file2Mock = $this->createMock(UploadedFile::class); | |
| $form1Mock = $this->createMock(Form::class); | |
| $field1Mock = $this->createMock(Field::class); | |
| $form2Mock = $this->createMock(Form::class); | |
| $field2Mock = $this->createMock(Field::class); | |
| $coreParametersHelperMock->expects($this->exactly(2)) | |
| ->method('get') | |
| ->with('form_upload_dir') | |
| ->willReturn($this->uploadDir); | |
| $form1Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn($this->formId1); | |
| $field1Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn('fieldId1'); | |
| $field1Mock->expects($this->once()) | |
| ->method('getForm') | |
| ->with() | |
| ->willReturn($form1Mock); | |
| $field1Mock->expects($this->once()) | |
| ->method('getAlias') | |
| ->with() | |
| ->willReturn('file1'); | |
| $form2Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn($this->formId2); | |
| $field2Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn('fieldId2'); | |
| $field2Mock->expects($this->once()) | |
| ->method('getForm') | |
| ->with() | |
| ->willReturn($form2Mock); | |
| $field2Mock->expects($this->once()) | |
| ->method('getAlias') | |
| ->with() | |
| ->willReturn('file2'); | |
| $filesToUpload = new UploadFileCrate(); | |
| $filesToUpload->addFile($file1Mock, $field1Mock); | |
| $filesToUpload->addFile($file2Mock, $field2Mock); | |
| $submission = new Submission(); | |
| $submission->setResults(['key' => 'value']); | |
| $path1 = $this->uploadDir.'/1/fieldId1'; | |
| $path2 = $this->uploadDir.'/2/fieldId2'; | |
| $fileUploaderMock->expects($this->exactly(2)) | |
| ->method('upload') | |
| ->withConsecutive([$path1, $file1Mock], [$path2, $file2Mock]) | |
| ->willReturnOnConsecutiveCalls('upload1.jpg', 'upload2.txt'); | |
| $formUploader->uploadFiles($filesToUpload, $submission); | |
| $expected = [ | |
| 'key' => 'value', | |
| 'file1' => 'upload1.jpg', | |
| 'file2' => 'upload2.txt', | |
| ]; | |
| $this->assertSame($expected, $submission->getResults()); | |
| } | |
| /** | |
| * @testdox Uploader delete uploaded file if anz error occures | |
| */ | |
| public function testUploadFilesWithError(): void | |
| { | |
| $fileUploaderMock = $this->createMock(FileUploader::class); | |
| $coreParametersHelperMock = $this->createMock(CoreParametersHelper::class); | |
| $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock); | |
| $file1Mock = $this->createMock(UploadedFile::class); | |
| $file2Mock = $this->createMock(UploadedFile::class); | |
| $form1Mock = $this->createMock(Form::class); | |
| $field1Mock = $this->createMock(Field::class); | |
| $form2Mock = $this->createMock(Form::class); | |
| $field2Mock = $this->createMock(Field::class); | |
| $coreParametersHelperMock->expects($this->exactly(2)) | |
| ->method('get') | |
| ->with('form_upload_dir') | |
| ->willReturn($this->uploadDir); | |
| $form1Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn($this->formId1); | |
| $field1Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn('fieldId1'); | |
| $field1Mock->expects($this->once()) | |
| ->method('getForm') | |
| ->with() | |
| ->willReturn($form1Mock); | |
| $field1Mock->expects($this->once()) | |
| ->method('getAlias') | |
| ->with() | |
| ->willReturn('file1'); | |
| $form2Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn($this->formId2); | |
| $field2Mock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn('fieldId2'); | |
| $field2Mock->expects($this->once()) | |
| ->method('getForm') | |
| ->with() | |
| ->willReturn($form2Mock); | |
| $field2Mock->expects($this->once()) | |
| ->method('getAlias') | |
| ->with() | |
| ->willReturn('file2'); | |
| $filesToUpload = new UploadFileCrate(); | |
| $filesToUpload->addFile($file1Mock, $field1Mock); | |
| $filesToUpload->addFile($file2Mock, $field2Mock); | |
| $submission = new Submission(); | |
| $submission->setResults(['key' => 'value']); | |
| $path1 = $this->uploadDir.'/1/fieldId1'; | |
| $path2 = $this->uploadDir.'/2/fieldId2'; | |
| $fileUploaderMock->expects($this->exactly(2)) | |
| ->method('upload') | |
| ->withConsecutive([$path1, $file1Mock], [$path2, $file2Mock]) | |
| ->willReturnOnConsecutiveCalls('upload1.jpg', $this->throwException(new FileUploadException())); | |
| $fileUploaderMock->expects($this->once()) | |
| ->method('delete') | |
| ->with($this->uploadDir.'/1/fieldId1/upload1.jpg'); | |
| $this->expectException(FileUploadException::class); | |
| $this->expectExceptionMessage('file2'); | |
| $formUploader->uploadFiles($filesToUpload, $submission); | |
| $expected = [ | |
| 'key' => 'value', | |
| 'file1' => 'upload1.jpg', | |
| 'file2' => 'upload2.txt', | |
| ]; | |
| $this->assertSame($expected, $submission->getResults()); | |
| } | |
| /** | |
| * @testdox Uploader do nothing if no files for upload provided | |
| */ | |
| public function testNoFilesUploadFiles(): void | |
| { | |
| $fileUploaderMock = $this->createMock(FileUploader::class); | |
| $fileUploaderMock->expects($this->never()) | |
| ->method('upload'); | |
| $fileUploaderMock->expects($this->never()) | |
| ->method('delete'); | |
| $coreParametersHelperMock = $this->createMock(CoreParametersHelper::class); | |
| $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock); | |
| $filesToUpload = new UploadFileCrate(); | |
| $submission = new Submission(); | |
| $formUploader->uploadFiles($filesToUpload, $submission); | |
| } | |
| /** | |
| * @testdox Uploader returs correct path for file | |
| */ | |
| public function testGetCompleteFilePath(): void | |
| { | |
| $fileUploaderMock = $this->createMock(FileUploader::class); | |
| $coreParametersHelperMock = $this->createMock(CoreParametersHelper::class); | |
| $coreParametersHelperMock->expects($this->once()) | |
| ->method('get') | |
| ->with('form_upload_dir') | |
| ->willReturn($this->uploadDir); | |
| $formMock = $this->createMock(Form::class); | |
| $formMock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn($this->formId1); | |
| $fieldMock = $this->createMock(Field::class); | |
| $fieldMock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn('fieldId1'); | |
| $fieldMock->expects($this->once()) | |
| ->method('getForm') | |
| ->with() | |
| ->willReturn($formMock); | |
| $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock); | |
| $actual = $formUploader->getCompleteFilePath($fieldMock, 'fileName'); | |
| $this->assertSame($this->uploadDir.'/1/fieldId1/fileName', $actual); | |
| } | |
| /** | |
| * @testdox Uploader delete files correctly | |
| */ | |
| public function testDeleteAllFilesOfFormField(): void | |
| { | |
| $fileUploaderMock = $this->createMock(FileUploader::class); | |
| $fileUploaderMock->expects($this->once()) | |
| ->method('delete') | |
| ->with($this->uploadDir.'/1/fieldId1'); | |
| $coreParametersHelperMock = $this->createMock(CoreParametersHelper::class); | |
| $coreParametersHelperMock->expects($this->once()) | |
| ->method('get') | |
| ->with('form_upload_dir') | |
| ->willReturn($this->uploadDir); | |
| $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock); | |
| $formMock = $this->createMock(Form::class); | |
| $formMock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn($this->formId1); | |
| $fieldMock = $this->createMock(Field::class); | |
| $fieldMock->expects($this->once()) | |
| ->method('getId') | |
| ->with() | |
| ->willReturn('fieldId1'); | |
| $fieldMock->expects($this->once()) | |
| ->method('getForm') | |
| ->with() | |
| ->willReturn($formMock); | |
| $fieldMock->expects($this->once()) | |
| ->method('isFileType') | |
| ->with() | |
| ->willReturn(true); | |
| $formUploader->deleteAllFilesOfFormField($fieldMock); | |
| } | |
| public function testDeleteFilesOfForm(): void | |
| { | |
| $fileUploaderMock = $this->createMock(FileUploader::class); | |
| $formMock = $this->createMock(Form::class); | |
| $coreParametersHelperMock = $this->createMock(CoreParametersHelper::class); | |
| $fileUploaderMock | |
| ->method('delete') | |
| ->with($this->uploadDir.'/1'); | |
| $coreParametersHelperMock->expects($this->exactly(2)) | |
| ->method('get') | |
| ->with('form_upload_dir') | |
| ->willReturn($this->uploadDir); | |
| $formMock->expects($this->exactly(2)) | |
| ->method('getId') | |
| ->willReturnOnConsecutiveCalls($this->formId1, null); | |
| $formUploader = new FormUploader($fileUploaderMock, $coreParametersHelperMock); | |
| $formUploader->deleteFilesOfForm($formMock); | |
| $formMock->deletedId = $this->formId1; | |
| $formUploader->deleteFilesOfForm($formMock); | |
| } | |
| } | |