‪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;
22 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
23 
25 {
27  'typo3/sysext/impexp/Tests/Functional/Fixtures/Folders/fileadmin/user_upload' => 'fileadmin/user_upload',
28  ];
29 
30  protected array ‪$testExtensionsToLoad = [
31  'typo3/sysext/impexp/Tests/Functional/Fixtures/Extensions/template_extension',
32  ];
33 
34  protected ‪Export&MockObject&AccessibleObjectInterface ‪$exportMock;
35 
36  protected array ‪$recordTypesIncludeFields =
37  [
38  'pages' => [
39  'title',
40  'deleted',
41  'doktype',
42  'hidden',
43  'perms_everybody',
44  ],
45  'tt_content' => [
46  'CType',
47  'header',
48  'header_link',
49  'deleted',
50  'hidden',
51  't3ver_oid',
52  ],
53  'sys_file' => [
54  'storage',
55  'type',
56  'metadata',
57  'identifier',
58  'identifier_hash',
59  'folder_hash',
60  'mime_type',
61  'name',
62  'sha1',
63  'size',
64  'creation_date',
65  'modification_date',
66  ],
67  ]
68  ;
69 
70  protected function ‪setUp(): void
71  {
72  parent::setUp();
73  $this->exportMock = $this->getAccessibleMock(Export::class, ['setMetaData']);
74  }
75 
80  {
81  $temporaryFolderName = $this->exportMock->getOrCreateTemporaryFolderName();
82  $temporaryFileName = $temporaryFolderName . '/export_file.txt';
83  file_put_contents($temporaryFileName, 'Hello TYPO3 World.');
84  self::assertDirectoryExists($temporaryFolderName);
85  self::assertTrue(is_file($temporaryFileName));
86 
87  $this->exportMock->removeTemporaryFolderName();
88  self::assertDirectoryDoesNotExist($temporaryFolderName);
89  self::assertFalse(is_file($temporaryFileName));
90  }
91 
96  {
97  $exportFolder = $this->exportMock->getOrCreateDefaultImportExportFolder();
98  $exportFileName = 'export_file.txt';
99  $exportFolder->createFile($exportFileName);
100  self::assertDirectoryExists(‪Environment::getPublicPath() . '/' . $exportFolder->getPublicUrl());
101  self::assertTrue(is_file(‪Environment::getPublicPath() . '/' . $exportFolder->getPublicUrl() . $exportFileName));
102 
103  $this->exportMock->removeDefaultImportExportFolder();
104  self::assertDirectoryDoesNotExist(‪Environment::getPublicPath() . '/' . $exportFolder->getPublicUrl());
105  self::assertFalse(is_file(‪Environment::getPublicPath() . '/' . $exportFolder->getPublicUrl() . $exportFileName));
106  }
107 
112  {
113  $this->exportMock->process();
114  $previewData = $this->exportMock->renderPreview();
115  self::assertEquals([
116  'update' => false,
117  'showDiff' => false,
118  'insidePageTree' => [],
119  'outsidePageTree' => [],
120  ], $previewData);
121  }
122 
127  {
128  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/pages.csv');
129  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/tt_content.csv');
130  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file.csv');
131  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file-export-pages-and-tt-content.csv');
132 
133  $renderPreviewExport = include __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportPageAndRecords.php';
134 
135  $this->exportMock->setPid(0);
136  $this->exportMock->setLevels(‪Export::LEVELS_INFINITE);
137  $this->exportMock->setTables(['_ALL']);
138  $this->exportMock->setRecordTypesIncludeFields($this->recordTypesIncludeFields);
139  $this->exportMock->process();
140  $previewData = $this->exportMock->renderPreview();
141  // file_put_contents(
142  // __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportPageAndRecords.php',
143  // str_replace(
144  // ['array (', '),', ');'],
145  // ['[', '],', '];'],
146  // '<?php' . "\n\nreturn " . var_export($previewData, true) . ";\n")
147  // );
148  self::assertEquals($renderPreviewExport, $previewData);
149  }
150 
155  {
156  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/pages.csv');
157  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/tt_content-with-softrefs.csv');
158  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file.csv');
159 
160  $renderPreviewExport = include __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportPageAndRecordsWithSoftRefs.php';
161 
162  $this->exportMock->setPid(0);
163  $this->exportMock->setLevels(‪Export::LEVELS_INFINITE);
164  $this->exportMock->setTables(['_ALL']);
165  $this->exportMock->setRecordTypesIncludeFields($this->recordTypesIncludeFields);
166  $this->exportMock->process();
167  $previewData = $this->exportMock->renderPreview();
168  // file_put_contents(
169  // __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportPageAndRecordsWithSoftRefs.php',
170  // str_replace(
171  // ['array (', '),', ');'],
172  // ['[', '],', '];'],
173  // '<?php' . "\n\nreturn " . var_export($previewData, true) . ";\n")
174  // );
175  self::assertEquals($renderPreviewExport, $previewData);
176  }
177 
181  public function ‪renderPreviewForExportOfTable(): void
182  {
183  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/pages.csv');
184  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/tt_content.csv');
185  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file.csv');
186  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file-export-pages-and-tt-content.csv');
187 
188  $renderPreviewExport = include __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportTable.php';
189 
190  $this->exportMock->setList(['tt_content:1']);
191  $this->exportMock->setRecordTypesIncludeFields($this->recordTypesIncludeFields);
192  $this->exportMock->process();
193  $previewData = $this->exportMock->renderPreview();
194  // file_put_contents(
195  // __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportTable.php',
196  // str_replace(
197  // ['array (', '),', ');'],
198  // ['[', '],', '];'],
199  // '<?php' . "\n\nreturn " . var_export($previewData, true) . ";\n")
200  // );
201  self::assertEquals($renderPreviewExport, $previewData);
202  }
203 
207  public function ‪renderPreviewForExportOfRecords(): void
208  {
209  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/pages.csv');
210  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/tt_content.csv');
211  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file.csv');
212  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file-export-pages-and-tt-content.csv');
213 
214  $renderPreviewExport = include __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportRecords.php';
215 
216  $this->exportMock->setRecord(['tt_content:1', 'tt_content:2']);
217  $this->exportMock->setRecordTypesIncludeFields($this->recordTypesIncludeFields);
218  $this->exportMock->process();
219  $previewData = $this->exportMock->renderPreview();
220  // file_put_contents(
221  // __DIR__ . '/Fixtures/ArrayAssertions/RenderPreviewExportRecords.php',
222  // str_replace(
223  // ['array (', '),', ');'],
224  // ['[', '],', '];'],
225  // '<?php' . "\n\nreturn " . var_export($previewData, true) . ";\n")
226  // );
227  self::assertEquals($renderPreviewExport, $previewData);
228  }
229 
230  public static function ‪addFilesSucceedsDataProvider(): array
231  {
232  return [
233  ['dat' => [
234  'header' => [
235  'files' => [
236  '123456789' => [
237  'filename' => 'filename.jpg',
238  'relFileName' => 'filename.jpg',
239  ],
240  ],
241  ],
242  ], 'relations' => [
243  '123456789',
244  ], 'expected' => [
245  [
246  'ref' => 'FILE',
247  'type' => 'file',
248  'msg' => '',
249  'preCode' => '<span class="indent indent-inline-block" style="--indent-level: 1"></span><span title="FILE" class="t3js-icon icon icon-size-small icon-state-default icon-status-reference-hard" data-identifier="status-reference-hard" aria-hidden="true">
250 ' . "\t" . '<span class="icon-markup">
251 <img src="typo3/sysext/impexp/Resources/Public/Icons/status-reference-hard.png" width="16" height="16" alt="" />
252 ' . "\t" . '</span>' . "\n\t\n" . '</span>',
253  'title' => 'filename.jpg',
254  'showDiffContent' => '',
255  ],
256  ]],
257  ];
258  }
259 
266  public function ‪addFilesSucceeds(array $dat, array $relations, array $expected): void
267  {
268  ‪$exportMock = $this->getAccessibleMock(
269  Export::class,
270  ['addError'],
271  [],
272  '',
273  true
274  );
275 
276  $lines = [];
277  ‪$exportMock->_set('dat', $dat);
278  ‪$exportMock->‪addFiles($relations, $lines, 0);
279  self::assertEquals($expected, $lines);
280  }
281 
285  public function ‪renderSucceedsWithoutArguments(): void
286  {
287  $this->exportMock->process();
288  $actual = $this->exportMock->render();
289 
290  self::assertXmlStringEqualsXmlFile(__DIR__ . '/Fixtures/XmlExports/empty.xml', $actual);
291  }
292 
296  public function ‪saveXmlToFileIsDefaultAndSucceeds(): void
297  {
298  $this->exportMock->setExportFileName('export');
299  $this->exportMock->process();
300  $file = $this->exportMock->saveToFile();
301  $filePath = ‪Environment::getPublicPath() . '/' . $file->getPublicUrl();
302 
303  $this->testFilesToDelete[] = $filePath;
304 
305  self::assertStringEndsWith('export.xml', $filePath);
306  self::assertXmlFileEqualsXmlFile(__DIR__ . '/Fixtures/XmlExports/empty.xml', $filePath);
307  }
308 
312  public function ‪saveT3dToFileSucceeds(): void
313  {
314  $this->exportMock->setExportFileName('export');
315  $this->exportMock->setExportFileType(‪Export::FILETYPE_T3D);
316  $this->exportMock->process();
317  $file = $this->exportMock->saveToFile();
318  $filePath = ‪Environment::getPublicPath() . '/' . $file->getPublicUrl();
319 
320  $this->testFilesToDelete[] = $filePath;
321 
322  // remove final newlines
323  $expected = trim(file_get_contents(__DIR__ . '/Fixtures/T3dExports/empty.t3d'));
324  $actual = trim(file_get_contents($filePath));
325 
326  self::assertStringEndsWith('export.t3d', $filePath);
327  self::assertEquals($expected, $actual);
328  }
329 
333  public function ‪saveT3dCompressedToFileSucceeds(): void
334  {
335  if (!function_exists('gzcompress')) {
336  self::markTestSkipped('The function gzcompress() is not available for compression.');
337  }
338 
339  $this->exportMock->setExportFileName('export');
340  $this->exportMock->setExportFileType(‪Export::FILETYPE_T3DZ);
341  $this->exportMock->process();
342  $file = $this->exportMock->saveToFile();
343  $filePath = ‪Environment::getPublicPath() . '/' . $file->getPublicUrl();
344 
345  $this->testFilesToDelete[] = $filePath;
346 
347  // remove final newlines
348  $expected = trim(file_get_contents(__DIR__ . '/Fixtures/T3dExports/empty-z.t3d'));
349  $actual = trim(file_get_contents($filePath));
350 
351  self::assertStringEndsWith('export-z.t3d', $filePath);
352  self::assertEquals($expected, $actual);
353  }
354 
358  public function ‪saveToFileCleansUpTemporaryFolder(): void
359  {
360  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/pages.csv');
361  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/tt_content.csv');
362  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file.csv');
363  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file-export-pages-and-tt-content.csv');
364 
365  $fileDirectory = ‪Environment::getVarPath() . '/transient';
366  $numTemporaryFilesAndFoldersBeforeImport = iterator_count(new \FilesystemIterator($fileDirectory, \FilesystemIterator::SKIP_DOTS));
367 
368  $this->exportMock->setPid(1);
369  $this->exportMock->setLevels(1);
370  $this->exportMock->setTables(['_ALL']);
371  $this->exportMock->setRelOnlyTables(['sys_file']);
372  $this->exportMock->setRecordTypesIncludeFields($this->recordTypesIncludeFields);
373  $this->exportMock->setSaveFilesOutsideExportFile(true);
374  $this->exportMock->setExportFileName('export');
375  $this->exportMock->process();
376  $file = $this->exportMock->saveToFile();
377 
378  $this->testFilesToDelete[] = ‪Environment::getPublicPath() . '/' . $file->getPublicUrl();
379 
380  self::assertCount($numTemporaryFilesAndFoldersBeforeImport, new \FilesystemIterator($fileDirectory, \FilesystemIterator::SKIP_DOTS));
381  self::assertEmpty($this->exportMock->_get('temporaryFolderName'));
382  }
383 
388  {
389  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/pages.csv');
390  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/tt_content.csv');
391  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file.csv');
392  $this->importCSVDataSet(__DIR__ . '/Fixtures/DatabaseImports/sys_file-export-pages-and-tt-content.csv');
393 
394  $this->exportMock->setPid(1);
395  $this->exportMock->setLevels(1);
396  $this->exportMock->setTables(['_ALL']);
397  $this->exportMock->setRelOnlyTables(['sys_file']);
398  $this->exportMock->setRecordTypesIncludeFields($this->recordTypesIncludeFields);
399  $this->exportMock->setSaveFilesOutsideExportFile(true);
400  $this->exportMock->setExportFileName('export');
401  $this->exportMock->process();
402  $this->exportMock->saveToFile();
403 
405  $importExportFolder = $this->exportMock->_get('defaultImportExportFolder');
406  $filesFolderName = 'export.xml.files';
407  self::assertTrue($importExportFolder->hasFolder($filesFolderName));
408 
409  $this->exportMock->setSaveFilesOutsideExportFile(false);
410  $this->exportMock->process();
411  $file = $this->exportMock->saveToFile();
412 
413  $this->testFilesToDelete[] = ‪Environment::getPublicPath() . '/' . $file->getPublicUrl();
414 
415  self::assertFalse($importExportFolder->hasFolder($filesFolderName));
416  }
417 }
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\renderPreviewWithoutArgumentsReturnsBasicArray
‪renderPreviewWithoutArgumentsReturnsBasicArray()
Definition: ExportTest.php:111
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\renderPreviewForExportOfRecords
‪renderPreviewForExportOfRecords()
Definition: ExportTest.php:207
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\creationAndDeletionOfTemporaryFolderSucceeds
‪creationAndDeletionOfTemporaryFolderSucceeds()
Definition: ExportTest.php:79
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\saveT3dToFileSucceeds
‪saveT3dToFileSucceeds()
Definition: ExportTest.php:312
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\setUp
‪setUp()
Definition: ExportTest.php:70
‪TYPO3\CMS\Impexp\ImportExport\addFiles
‪addFiles(array $relations, array &$lines, int $indent, string $tokenID='')
Definition: ImportExport.php:688
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static getPublicPath()
Definition: Environment.php:187
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\addFilesSucceedsDataProvider
‪static addFilesSucceedsDataProvider()
Definition: ExportTest.php:230
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\saveXmlToFileIsDefaultAndSucceeds
‪saveXmlToFileIsDefaultAndSucceeds()
Definition: ExportTest.php:296
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\renderSucceedsWithoutArguments
‪renderSucceedsWithoutArguments()
Definition: ExportTest.php:285
‪TYPO3\CMS\Impexp\Tests\Functional
Definition: AbstractImportExportTestCase.php:18
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\saveToFileCleansUpTemporaryFolder
‪saveToFileCleansUpTemporaryFolder()
Definition: ExportTest.php:358
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Impexp\Export\LEVELS_INFINITE
‪const LEVELS_INFINITE
Definition: Export.php:56
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest
Definition: ExportTest.php:25
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\addFilesSucceeds
‪addFilesSucceeds(array $dat, array $relations, array $expected)
Definition: ExportTest.php:266
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\$testExtensionsToLoad
‪array $testExtensionsToLoad
Definition: ExportTest.php:30
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\renderPreviewForExportOfTable
‪renderPreviewForExportOfTable()
Definition: ExportTest.php:181
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\saveToFileCleansUpFormerExportsOfSameName
‪saveToFileCleansUpFormerExportsOfSameName()
Definition: ExportTest.php:387
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\renderPreviewForExportOfPageAndRecordsWithSoftRefs
‪renderPreviewForExportOfPageAndRecordsWithSoftRefs()
Definition: ExportTest.php:154
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\creationAndDeletionOfDefaultImportExportFolderSucceeds
‪creationAndDeletionOfDefaultImportExportFolderSucceeds()
Definition: ExportTest.php:95
‪TYPO3\CMS\Impexp\Export\FILETYPE_T3D
‪const FILETYPE_T3D
Definition: Export.php:59
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\renderPreviewForExportOfPageAndRecords
‪renderPreviewForExportOfPageAndRecords()
Definition: ExportTest.php:126
‪TYPO3\CMS\Core\Resource\Folder
Definition: Folder.php:38
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\$recordTypesIncludeFields
‪array $recordTypesIncludeFields
Definition: ExportTest.php:36
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\$exportMock
‪Export &MockObject &AccessibleObjectInterface $exportMock
Definition: ExportTest.php:34
‪TYPO3\CMS\Impexp\Tests\Functional\AbstractImportExportTestCase
Definition: AbstractImportExportTestCase.php:33
‪TYPO3\CMS\Impexp\Export\FILETYPE_T3DZ
‪const FILETYPE_T3DZ
Definition: Export.php:60
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Impexp\Export
Definition: Export.php:53
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\saveT3dCompressedToFileSucceeds
‪saveT3dCompressedToFileSucceeds()
Definition: ExportTest.php:333
‪TYPO3\CMS\Impexp\Tests\Functional\ExportTest\$pathsToProvideInTestInstance
‪array $pathsToProvideInTestInstance
Definition: ExportTest.php:26