‪TYPO3CMS  ‪main
FormManagerControllerTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\Test;
31 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
32 
33 final class ‪FormManagerControllerTest extends UnitTestCase
34 {
35  protected bool ‪$resetSingletonInstances = true;
36 
37  #[Test]
39  {
40  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
41 
42  $formPersistenceManagerMock = $this->createMock(FormPersistenceManager::class);
43 
44  $mockController->_set('formPersistenceManager', $formPersistenceManagerMock);
45  $mockController->_set('formSettings', [
46  'persistenceManager' => [
47  'allowSaveToExtensionPaths' => true,
48  ],
49  ]);
50 
51  $storageMock1 = $this->createMock(ResourceStorage::class);
52  $storageMock2 = $this->createMock(ResourceStorage::class);
53 
54  $storageMock1->method('isPublic')->willReturn(true);
55  $storageMock2->method('isPublic')->willReturn(false);
56 
57  $folder1Mock = $this->createMock(Folder::class);
58  $folder1Mock->method('getPublicUrl')->willReturn('/fileadmin/user_upload/');
59  $folder1Mock->method('getStorage')->willReturn($storageMock1);
60 
61  $folder2Mock = $this->createMock(Folder::class);
62  $folder2Mock->method('getStorage')->willReturn($storageMock2);
63 
64  $formPersistenceManagerMock->method('getAccessibleFormStorageFolders')->willReturn([
65  '1:/user_upload/' => $folder1Mock,
66  '2:/forms/' => $folder2Mock,
67  ]);
68 
69  $formPersistenceManagerMock->method('getAccessibleExtensionFolders')->willReturn([
70  'EXT:form/Resources/Forms/' => '/some/path/form/Resources/Forms/',
71  'EXT:form_additions/Resources/Forms/' => '/some/path/form_additions/Resources/Forms/',
72  ]);
73 
74  $expected = [
75  0 => [
76  'label' => '/fileadmin/user_upload/',
77  'value' => '1:/user_upload/',
78  ],
79  1 => [
80  'label' => '2:/forms/',
81  'value' => '2:/forms/',
82  ],
83  2 => [
84  'label' => 'EXT:form/Resources/Forms/',
85  'value' => 'EXT:form/Resources/Forms/',
86  ],
87  3 => [
88  'label' => 'EXT:form_additions/Resources/Forms/',
89  'value' => 'EXT:form_additions/Resources/Forms/',
90  ],
91  ];
92 
93  self::assertSame($expected, $mockController->_call('getAccessibleFormStorageFolders'));
94  }
95 
96  #[Test]
98  {
99  $mockTranslationService = $this->getAccessibleMock(TranslationService::class, ['translateValuesRecursive'], [], '', false);
100  GeneralUtility::setSingletonInstance(TranslationService::class, $mockTranslationService);
101  $mockTranslationService
102  ->method('translateValuesRecursive')
103  ->willReturnArgument(0);
104 
105  $subject = $this->getAccessibleMock(FormManagerController::class, ['getAccessibleFormStorageFolders'], [], '', false);
106 
107  $mockUriBuilder = $this->createMock(UriBuilder::class);
108 
109  $subject->_set('uriBuilder', $mockUriBuilder);
110  $subject->_set('formSettings', [
111  'formManager' => [
112  'selectablePrototypesConfiguration' => [],
113  ],
114  ]);
115 
116  $mockUriBuilder->method('uriFor')->willReturn(
117  '/typo3/index.php?some=param'
118  );
119 
120  $subject
121  ->method('getAccessibleFormStorageFolders')
122  ->willReturn([
123  0 => [
124  'label' => 'user_upload',
125  'value' => '1:/user_upload/',
126  ],
127  ]);
128 
129  $expected = [
130  'selectablePrototypesConfiguration' => [],
131  'accessibleFormStorageFolders' => [
132  0 => [
133  'label' => 'user_upload',
134  'value' => '1:/user_upload/',
135  ],
136  ],
137  'endpoints' => [
138  'create' => '/typo3/index.php?some=param',
139  'duplicate' => '/typo3/index.php?some=param',
140  'delete' => '/typo3/index.php?some=param',
141  'references' => '/typo3/index.php?some=param',
142  ],
143  ];
144 
145  self::assertSame($expected, $subject->_call('getFormManagerAppInitialData'));
146  }
147 
148  #[Test]
150  {
151  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
152 
153  $formPersistenceManagerMock = $this->createMock(FormPersistenceManager::class);
154  $mockController->_set('formPersistenceManager', $formPersistenceManagerMock);
155 
156  $databaseService = $this->createMock(DatabaseService::class);
157  $mockController->_set('databaseService', $databaseService);
158 
159  $formPersistenceManagerMock->method('listForms')->willReturn([
160  0 => [
161  'identifier' => 'ext-form-identifier',
162  'name' => 'some name',
163  'persistenceIdentifier' => '1:/user_uploads/someFormName.yaml',
164  'readOnly' => false,
165  'removable' => true,
166  'location' => 'storage',
167  'duplicateIdentifier' => false,
168  ],
169  ]);
170 
171  $databaseService->method('getAllReferencesForFileUid')->willReturn([
172  0 => 0,
173  ]);
174 
175  $databaseService->method('getAllReferencesForPersistenceIdentifier')->willReturn([
176  '1:/user_uploads/someFormName.yaml' => 2,
177  ]);
178 
179  $expected = [
180  0 => [
181  'identifier' => 'ext-form-identifier',
182  'name' => 'some name',
183  'persistenceIdentifier' => '1:/user_uploads/someFormName.yaml',
184  'readOnly' => false,
185  'removable' => true,
186  'location' => 'storage',
187  'duplicateIdentifier' => false,
188  'referenceCount' => 2,
189  ],
190  ];
191 
192  self::assertSame($expected, $mockController->_call('getAvailableFormDefinitions'));
193  }
194 
195  #[Test]
197  {
198  $this->expectException(\InvalidArgumentException::class);
199  $this->expectExceptionCode(1477071939);
200 
201  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
202 
203  $mockController->_call('getProcessedReferencesRows', '');
204  }
205 
206  #[Test]
208  {
209  $iconFactoryMock = $this->createMock(IconFactory::class);
210  $iconMock = $this->createMock(Icon::class);
211  $iconMock->expects(self::atLeastOnce())->method('render')->willReturn('');
212  $iconFactoryMock->method('getIconForRecord')->withAnyParameters()->willReturn($iconMock);
213  GeneralUtility::addInstance(IconFactory::class, $iconFactoryMock);
214 
215  $mockController = $this->getAccessibleMock(FormManagerController::class, [
216  'getModuleUrl',
217  'getRecord',
218  'getRecordTitle',
219  ], [], '', false);
220 
221  $databaseService = $this->createMock(DatabaseService::class);
222  $mockController->_set('databaseService', $databaseService);
223 
224  $databaseService->method('getReferencesByPersistenceIdentifier')->with(self::anything())->willReturn([
225  0 => [
226  'tablename' => 'tt_content',
227  'recuid' => -1,
228  ],
229  ]);
230 
231  $mockController
232  ->method('getModuleUrl')
233  ->willReturn('/typo3/index.php?some=param');
234 
235  $mockController
236  ->method('getRecord')
237  ->willReturn([ 'uid' => 1, 'pid' => 0 ]);
238 
239  $mockController
240  ->method('getRecordTitle')
241  ->willReturn('record title');
242 
243  $expected = [
244  0 => [
245  'recordPageTitle' => 'record title',
246  'recordTitle' => 'record title',
247  'recordIcon' => '',
248  'recordUid' => -1,
249  'recordEditUrl' => '/typo3/index.php?some=param',
250  ],
251  ];
252 
253  self::assertSame($expected, $mockController->_call('getProcessedReferencesRows', 'fake'));
254  }
255 
256  #[Test]
258  {
259  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
260 
261  $mockController->_set('formSettings', [
262  'formManager' => [
263  'selectablePrototypesConfiguration' => [
264  0 => [
265  'identifier' => 'standard',
266  'label' => 'some label',
267  'newFormTemplates' => [
268  0 => [
269  'templatePath' => 'EXT:form/Tests/Unit/Controller/Fixtures/BlankForm.yaml',
270  'label' => 'some label',
271  ],
272  1 => [
273  'templatePath' => 'EXT:form/Tests/Unit/Controller/Fixtures/SimpleContactForm.yaml',
274  'label' => 'some other label',
275  ],
276  ],
277  ],
278  ],
279  ],
280  ]);
281 
282  self::assertTrue($mockController->_call('isValidTemplatePath', 'standard', 'EXT:form/Tests/Unit/Controller/Fixtures/SimpleContactForm.yaml'));
283  }
284 
285  #[Test]
287  {
288  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
289 
290  $mockController->_set('formSettings', [
291  'formManager' => [
292  'selectablePrototypesConfiguration' => [
293  0 => [
294  'identifier' => 'standard',
295  'label' => 'some label',
296  'newFormTemplates' => [
297  0 => [
298  'templatePath' => 'EXT:form/Tests/Unit/Controller/Fixtures/BlankForm.yaml',
299  'label' => 'some label',
300  ],
301  1 => [
302  'templatePath' => 'EXT:form/Tests/Unit/Controller/Fixtures/SimpleContactForm.yaml',
303  'label' => 'some other label',
304  ],
305  ],
306  ],
307  ],
308  ],
309  ]);
310 
311  self::assertFalse($mockController->_call('isValidTemplatePath', 'standard', 'EXT:form/Tests/Unit/Controller/Fixtures/NonExistingForm.yaml'));
312  }
313 
314  #[Test]
316  {
317  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
318 
319  $mockController->_set('formSettings', [
320  'formManager' => [
321  'selectablePrototypesConfiguration' => [
322  0 => [
323  'identifier' => 'standard',
324  'label' => 'some label',
325  'newFormTemplates' => [
326  0 => [
327  'templatePath' => 'EXT:form/Tests/Unit/Controller/Fixtures/BlankForm.yaml',
328  'label' => 'some label',
329  ],
330  1 => [
331  'templatePath' => 'EXT:form/Tests/Unit/Controller/Fixtures/SimpleContactForm.yaml',
332  'label' => 'some other label',
333  ],
334  ],
335  ],
336  1 => [
337  'identifier' => 'other',
338  'label' => 'some label',
339  'newFormTemplates' => [
340  0 => [
341  'templatePath' => 'EXT:form/Tests/Unit/Controller/Fixtures/BlankForm.yaml',
342  'label' => 'some label',
343  ],
344  ],
345  ],
346  ],
347  ],
348  ]);
349 
350  self::assertFalse($mockController->_call('isValidTemplatePath', 'other', 'EXT:form/Tests/Unit/Controller/Fixtures/SimpleContactForm.yaml'));
351  }
352 
353  #[Test]
355  {
356  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
357 
358  $input = 'test form';
359  $expected = 'testform';
360  self::assertSame($expected, $mockController->_call('convertFormNameToIdentifier', $input));
361  }
362 
363  #[Test]
365  {
366  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
367 
368  $input = 'téstform';
369  $expected = 'testform';
370  self::assertSame($expected, $mockController->_call('convertFormNameToIdentifier', $input));
371  }
372 
373  #[Test]
375  {
376  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
377 
378  $input = 'test form ' . hex2bin('667275cc88686e65757a6569746c696368656e');
379  $expected = 'testformfruehneuzeitlichen';
380  self::assertSame($expected, $mockController->_call('convertFormNameToIdentifier', $input));
381  }
382 
383  #[Test]
385  {
386  $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
387 
388  $input = 'test form ä#!_-01';
389  $expected = 'testformae_-01';
390  self::assertSame($expected, $mockController->_call('convertFormNameToIdentifier', $input));
391  }
392 }
‪TYPO3\CMS\Form\Service\DatabaseService
Definition: DatabaseService.php:33
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\isValidTemplatePathReturnsFalseIfTemplateIsNotDefinedAndExists
‪isValidTemplatePathReturnsFalseIfTemplateIsNotDefinedAndExists()
Definition: FormManagerControllerTest.php:315
‪TYPO3\CMS\Form\Service\TranslationService
Definition: TranslationService.php:45
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:27
‪TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder
Definition: UriBuilder.php:38
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\getAccessibleFormStorageFoldersReturnsProcessedArray
‪getAccessibleFormStorageFoldersReturnsProcessedArray()
Definition: FormManagerControllerTest.php:38
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\isValidTemplatePathReturnsTrueIfTemplateIsDefinedAndExists
‪isValidTemplatePathReturnsTrueIfTemplateIsDefinedAndExists()
Definition: FormManagerControllerTest.php:257
‪TYPO3\CMS\Form\Controller\FormManagerController
Definition: FormManagerController.php:53
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\convertFormNameToIdentifierRemoveSpecialChars
‪convertFormNameToIdentifierRemoveSpecialChars()
Definition: FormManagerControllerTest.php:384
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\getFormManagerAppInitialDataReturnsProcessedArray
‪getFormManagerAppInitialDataReturnsProcessedArray()
Definition: FormManagerControllerTest.php:97
‪TYPO3\CMS\Form\Mvc\Persistence\FormPersistenceManager
Definition: FormPersistenceManager.php:62
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\getAvailableFormDefinitionsReturnsProcessedArray
‪getAvailableFormDefinitionsReturnsProcessedArray()
Definition: FormManagerControllerTest.php:149
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\isValidTemplatePathReturnsFalseIfTemplateIsDefinedButNotExists
‪isValidTemplatePathReturnsFalseIfTemplateIsDefinedButNotExists()
Definition: FormManagerControllerTest.php:286
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\getProcessedReferencesRowsThrowsExceptionIfPersistenceIdentifierIsEmpty
‪getProcessedReferencesRowsThrowsExceptionIfPersistenceIdentifierIsEmpty()
Definition: FormManagerControllerTest.php:196
‪TYPO3\CMS\Core\Resource\Folder
Definition: Folder.php:38
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\convertFormNameToIdentifierConvertAccentedCharactersNotInNFC
‪convertFormNameToIdentifierConvertAccentedCharactersNotInNFC()
Definition: FormManagerControllerTest.php:374
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\getProcessedReferencesRowsReturnsProcessedArray
‪getProcessedReferencesRowsReturnsProcessedArray()
Definition: FormManagerControllerTest.php:207
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\convertFormNameToIdentifierRemoveSpaces
‪convertFormNameToIdentifierRemoveSpaces()
Definition: FormManagerControllerTest.php:354
‪TYPO3\CMS\Form\Tests\Unit\Controller
Definition: FormEditorControllerTest.php:18
‪TYPO3\CMS\Core\Resource\ResourceStorage
Definition: ResourceStorage.php:129
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\convertFormNameToIdentifierConvertAccentedCharacters
‪convertFormNameToIdentifierConvertAccentedCharacters()
Definition: FormManagerControllerTest.php:364
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest
Definition: FormManagerControllerTest.php:34
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Form\Tests\Unit\Controller\FormManagerControllerTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: FormManagerControllerTest.php:35