‪TYPO3CMS  ‪main
ExportTest.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
18 use PHPUnit\Framework\MockObject\MockObject;
24 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
25 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
26 
27 final class ‪ExportTest extends UnitTestCase
28 {
29  protected bool ‪$resetSingletonInstances = true;
30 
31  protected ‪Export&MockObject&AccessibleObjectInterface ‪$exportMock;
32 
33  protected function ‪setUp(): void
34  {
35  parent::setUp();
36  $this->exportMock = $this->getAccessibleMock(Export::class, null, [], '', false);
37  $this->exportMock->_set('compressionAvailable', true);
38  }
39 
44  public function ‪setExportFileNameSanitizesFileName(string $fileName, string $expected): void
45  {
46  $this->exportMock->setExportFileName($fileName);
47  $actual = $this->exportMock->getExportFileName();
48 
49  self::assertEquals($expected, $actual);
50  }
51 
52  public static function ‪setExportFileNameSanitizesFileNameProvider(): array
53  {
54  return [
55  [
56  'fileName' => 'my-export-file_20201012 äöüß!"§$%&/()²³¼½¬{[]};,:µ<>|.1',
57  'expected' => 'my-export-file_20201012.1',
58  ],
59  ];
60  }
61 
66  {
67  $this->exportMock->setPid(1);
68  $this->exportMock->setLevels(2);
69  $patternDateTime = '[0-9-_]{16}';
70  self::assertMatchesRegularExpression("/T3D_tree_PID1_L2_$patternDateTime.xml/", $this->exportMock->getOrGenerateExportFileNameWithFileExtension());
71  }
72 
77  {
78  $this->exportMock->setRecord(['page:1', 'tt_content:1']);
79  $patternDateTime = '[0-9-_]{16}';
80  self::assertMatchesRegularExpression("/T3D_recs_page_1-tt_conte_$patternDateTime.xml/", $this->exportMock->getOrGenerateExportFileNameWithFileExtension());
81  }
82 
87  {
88  $this->exportMock->setList(['sys_news:0', 'news:12']);
89  $patternDateTime = '[0-9-_]{16}';
90  self::assertMatchesRegularExpression("/T3D_list_sys_news_0-news_$patternDateTime.xml/", $this->exportMock->getOrGenerateExportFileNameWithFileExtension());
91  }
92 
94  {
95  return [
96  ['fileType' => ‪Export::FILETYPE_XML],
97  ['fileType' => ‪Export::FILETYPE_T3D],
98  ['fileType' => ‪Export::FILETYPE_T3DZ],
99  ];
100  }
101 
106  public function ‪setExportFileTypeSucceedsWithSupportedFileType(string $fileType): void
107  {
108  $this->exportMock->setExportFileType($fileType);
109  self::assertEquals($fileType, $this->exportMock->getExportFileType());
110  }
111 
116  {
117  $this->expectException(\Exception::class);
118  $this->exportMock->setExportFileType('json');
119  }
120 
125  {
126  $relations = [
127  ['type' => 'file', 'newValueFiles' => [[
128  'ID_absFile' => ‪Environment::getPublicPath() . '/fileRelation.png',
129  ]]],
130  ['type' => 'flex', 'flexFormRels' => ['file' => [[[
131  'ID_absFile' => ‪Environment::getPublicPath() . '/fileRelationInFlexForm.png',
132  ]]]]],
133  ];
134 
135  $expected = [
136  ['type' => 'file', 'newValueFiles' => [[
137  'ID_absFile' => ‪Environment::getPublicPath() . '/fileRelation.png',
138  'ID' => '987eaa6ab0a50497101d373cfc983400',
139  ]]],
140  ['type' => 'flex', 'flexFormRels' => ['file' => [[[
141  'ID_absFile' => ‪Environment::getPublicPath() . '/fileRelationInFlexForm.png',
142  'ID' => '4cd9d9637e042ebff3568ad4e0266e77',
143  ]]]]],
144  ];
145 
146  $this->exportMock->fixFileIdInRelations($relations);
147  self::assertEquals($expected, $relations);
148  }
149 
151  {
152  return [
153  'Remove one typolink entry from relation' => [
154  'relations' => [
155  ['type' => 'db', 'itemArray' => [[
156  'id' => hexdec(substr(md5('fileRelation.png'), 0, 6)),
157  'table' => 'sys_file',
158  ]], 'softrefs' => ['keys' => ['typolink' => [
159  0 => ['subst' => ['type' => 'file', 'relFileName' => 'fileRelation.png']],
160  1 => ['subst' => ['type' => 'file', 'relFileName' => 'fileRelation2.png']],
161  ]]]],
162  ],
163  'expected' => [
164  ['type' => 'db', 'itemArray' => [[
165  'id' => hexdec(substr(md5('fileRelation.png'), 0, 6)),
166  'table' => 'sys_file',
167  ]], 'softrefs' => ['keys' => ['typolink' => [
168  1 => ['subst' => ['type' => 'file', 'relFileName' => 'fileRelation2.png']],
169  ]]]],
170  ],
171  ],
172  'Remove whole softrefs array from relation' => [
173  'relations' => [
174  ['type' => 'db', 'itemArray' => [[
175  'id' => hexdec(substr(md5('fileRelation2.png'), 0, 6)),
176  'table' => 'sys_file',
177  ]], 'softrefs' => ['keys' => ['typolink' => [
178  0 => ['subst' => ['type' => 'file', 'relFileName' => 'fileRelation2.png']],
179  ]]]],
180  ],
181  'expected' => [
182  ['type' => 'db', 'itemArray' => [[
183  'id' => hexdec(substr(md5('fileRelation2.png'), 0, 6)),
184  'table' => 'sys_file',
185  ]]],
186  ],
187  ],
188  ];
189  }
190 
195  public function ‪removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArray(array $relations, array $expected): void
196  {
197  $resourceFactoryMock = $this->getAccessibleMock(
198  ResourceFactory::class,
199  ['retrieveFileOrFolderObject'],
200  [],
201  '',
202  false
203  );
204  $resourceFactoryMock->method('retrieveFileOrFolderObject')
205  ->willReturnCallback(function (string $input): ‪File {
206  $fakeFileUidDerivedFromFileName = hexdec(substr(md5($input), 0, 6));
207  $fileMock = $this->getAccessibleMock(
208  File::class,
209  null,
210  [],
211  '',
212  false
213  );
214  $fileMock->_set('properties', ['uid' => $fakeFileUidDerivedFromFileName]);
215  return $fileMock;
216  });
217  GeneralUtility::setSingletonInstance(ResourceFactory::class, $resourceFactoryMock);
218 
219  $this->exportMock->removeRedundantSoftRefsInRelations($relations);
220  self::assertEquals($expected, $relations);
221  }
222 
224  {
225  $oneDat = [
226  'files' => [
227  'e580c5887dcea669332e96e25900b20b' => [],
228  ],
229  'records' => [
230  'tt_content:8' => [
231  'data' => [],
232  'rels' => [
233  'pi_flexform' => [
234  'type' => 'flex',
235  'flexFormRels' => [
236  'file' => [
237  [
238  [
239  'filename' => 'filenameFlex',
240  'ID_absFile' => 'ID_absFileFlex',
241  'ID' => 'IDFlex',
242  'relFileName' => 'relFileNameFlex',
243  ],
244  ],
245  ],
246  ],
247  ],
248  ],
249  ],
250  ],
251  ];
252  $oneExpected = $oneDat;
253  unset($oneExpected['records']['tt_content:8']['rels']['pi_flexform']['flexFormRels']['file'][0][0]['ID_absFile']);
254 
255  $fullDat = [
256  'files' => [
257  'e580c5887dcea669332e96e25900b20b' => [],
258  ],
259  'records' => [
260  'tt_content:8' => [
261  'data' => [],
262  'rels' => [
263  'pi_flexform' => [
264  'type' => 'flex',
265  'flexFormRels' => [
266  'file' => [
267  [
268  [
269  'filename' => 'filenameFlex',
270  'ID_absFile' => 'ID_absFileFlex',
271  'ID' => 'IDFlex',
272  'relFileName' => 'relFileNameFlex',
273  ],
274  ],
275  ],
276  'softrefs' => [
277  [
278  'keys' => [
279  [
280  [
281  'subst' => [
282  'type' => 'file',
283  'tokenID' => 'tokenID',
284  'relFileName' => 'relFileNameSoftrefs',
285  ],
286  ],
287  ],
288  ],
289  ],
290  ],
291  ],
292  'softrefs' => [
293  'keys' => [
294  [
295  [
296  'subst' => [
297  'type' => 'fileSoftrefs',
298  'tokenID' => 'tokenIDSoftrefs',
299  'relFileName' => 'relFileNameSoftrefsSoftrefs',
300  ],
301  ],
302  ],
303  ],
304  ],
305  ],
306  'tx_bootstrappackage_carousel_item' => [
307  'type' => 'db',
308  'itemArray' => [
309  0 => [
310  'id' => 2,
311  'table' => 'tx_bootstrappackage_carousel_item',
312  ],
313  ],
314  ],
315  'background_image_options' => [
316  'type' => 'file',
317  'newValueFiles' => [
318  [
319  'filename' => 'filenameFile',
320  'ID_absFile' => 'ID_absFileFile',
321  'ID' => 'IDFile',
322  'relFileName' => 'relFileNameFile',
323  ],
324  ],
325  ],
326  ],
327  ],
328  ],
329  ];
330  $fullExpected = $fullDat;
331  $fullExpected['records']['tt_content:8']['rels']['pi_flexform']['flexFormRels']['softrefs'][0]['keys'][0][0]['file_ID'] = 'e580c5887dcea669332e96e25900b20b';
332  unset(
333  $fullExpected['records']['tt_content:8']['rels']['pi_flexform']['flexFormRels']['file'][0][0]['ID_absFile'],
334  $fullExpected['records']['tt_content:8']['rels']['background_image_options']['newValueFiles'][0]['ID_absFile']
335  );
336 
337  return [
338  'Empty $this->dat' => ['dat' => [], 'expected' => []],
339  'Empty $this->dat[\'records\']' => ['dat' => ['records' => []], 'expected' => ['records' => []]],
340  'One record example' => ['dat' => $oneDat, 'expected' => $oneExpected],
341  'Full example' => ['dat' => $fullDat, 'expected' => $fullExpected],
342  ];
343  }
344 
351  public function ‪exportAddFilesFromRelationsSucceeds(array $dat, array $expected): void
352  {
353  ‪$exportMock = $this->getAccessibleMock(
354  Export::class,
355  ['addError', 'exportAddFile', 'isSoftRefIncluded'],
356  [],
357  '',
358  false
359  );
360  ‪$exportMock->method('isSoftRefIncluded')->willReturn(true);
361 
362  ‪$exportMock->_set('dat', $dat);
363  ‪$exportMock->_call('exportAddFilesFromRelations');
364  self::assertEquals($expected, ‪$exportMock->_get('dat'));
365  }
366 }
‪TYPO3\CMS\Impexp\Tests\Unit
Definition: ExportTest.php:16
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\setUp
‪setUp()
Definition: ExportTest.php:33
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\fixFileIdInRelationsProcessesOriginalRelationsArray
‪fixFileIdInRelationsProcessesOriginalRelationsArray()
Definition: ExportTest.php:124
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\exportAddFilesFromRelationsSucceeds
‪exportAddFilesFromRelationsSucceeds(array $dat, array $expected)
Definition: ExportTest.php:351
‪TYPO3\CMS\Impexp\Export\FILETYPE_XML
‪const FILETYPE_XML
Definition: Export.php:56
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\exportAddFilesFromRelationsSucceedsDataProvider
‪static exportAddFilesFromRelationsSucceedsDataProvider()
Definition: ExportTest.php:223
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\setExportFileTypeFailsWithUnsupportedFileType
‪setExportFileTypeFailsWithUnsupportedFileType()
Definition: ExportTest.php:115
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static getPublicPath()
Definition: Environment.php:187
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\$exportMock
‪Export &MockObject &AccessibleObjectInterface $exportMock
Definition: ExportTest.php:31
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: ExportTest.php:29
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\setExportFileNameSanitizesFileName
‪setExportFileNameSanitizesFileName(string $fileName, string $expected)
Definition: ExportTest.php:44
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\getOrGenerateExportFileNameWithFileExtensionConsidersLists
‪getOrGenerateExportFileNameWithFileExtensionConsidersLists()
Definition: ExportTest.php:86
‪TYPO3\CMS\Impexp\Export\FILETYPE_T3D
‪const FILETYPE_T3D
Definition: Export.php:57
‪TYPO3\CMS\Core\Resource\ResourceFactory
Definition: ResourceFactory.php:41
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArray
‪removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArray(array $relations, array $expected)
Definition: ExportTest.php:195
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\setExportFileTypeSucceedsWithSupportedFileType
‪setExportFileTypeSucceedsWithSupportedFileType(string $fileType)
Definition: ExportTest.php:106
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\getOrGenerateExportFileNameWithFileExtensionConsidersPidAndLevels
‪getOrGenerateExportFileNameWithFileExtensionConsidersPidAndLevels()
Definition: ExportTest.php:65
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest
Definition: ExportTest.php:28
‪TYPO3\CMS\Impexp\Export\FILETYPE_T3DZ
‪const FILETYPE_T3DZ
Definition: Export.php:58
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\getOrGenerateExportFileNameWithFileExtensionConsidersRecords
‪getOrGenerateExportFileNameWithFileExtensionConsidersRecords()
Definition: ExportTest.php:76
‪TYPO3\CMS\Impexp\Export
Definition: Export.php:51
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\setExportFileNameSanitizesFileNameProvider
‪static setExportFileNameSanitizesFileNameProvider()
Definition: ExportTest.php:52
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArrayDataProvider
‪static removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArrayDataProvider()
Definition: ExportTest.php:150
‪TYPO3\CMS\Impexp\Tests\Unit\ExportTest\setExportFileTypeSucceedsWithSupportedFileTypeProvider
‪static setExportFileTypeSucceedsWithSupportedFileTypeProvider()
Definition: ExportTest.php:93