75d8fcc4e8f7653f3ae2bd53daab34bd358bb982
[Packages/TYPO3.CMS.git] / typo3 / sysext / impexp / Tests / Functional / Import / PagesAndTtContentWithImagesInFilledDatabaseTest.php
1 <?php
2 namespace TYPO3\CMS\Impexp\Tests\Functional\Import;
3
4 /*
5 * This file is part of the TYPO3 CMS project.
6 *
7 * It is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License, either version 2
9 * of the License, or any later version.
10 *
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
13 *
14 * The TYPO3 project - inspiring people to share!
15 */
16
17 use TYPO3\CMS\Core\Utility\GeneralUtility;
18 use TYPO3\CMS\Impexp\Import;
19 use TYPO3\CMS\Impexp\Tests\Functional\AbstractImportExportTestCase;
20
21 /**
22 * Test case
23 */
24 class PagesAndTtContentWithImagesInFilledDatabaseTest extends AbstractImportExportTestCase
25 {
26 /**
27 * @var array
28 */
29 protected $additionalFoldersToCreate = [
30 '/fileadmin/user_upload'
31 ];
32
33 /**
34 * @var array
35 */
36 protected $pathsToProvideInTestInstance = [
37 'typo3/sysext/impexp/Tests/Functional/Fixtures/Folders/fileadmin/user_upload/typo3_image2.jpg' => 'fileadmin/user_upload/typo3_image2.jpg',
38 ];
39
40 /**
41 * @test
42 */
43 public function importPagesAndRelatedTtContentWithDifferentImageToExistingData()
44 {
45 $subject = GeneralUtility::makeInstance(Import::class);
46 $subject->init();
47
48 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/pages.xml');
49 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/tt_content-with-image.xml');
50 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_language.xml');
51 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file.xml');
52 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_metadata.xml');
53 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_reference.xml');
54 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_storage.xml');
55
56 $subject->loadFile(
57 __DIR__ . '/../Fixtures/XmlImports/pages-and-ttcontent-with-existing-different-image.xml',
58 1
59 );
60 $subject->importData(0);
61
62 $this->testFilesToDelete[] = PATH_site . 'fileadmin/user_upload/typo3_image2.jpg';
63 $this->testFilesToDelete[] = PATH_site . 'fileadmin/user_upload/typo3_image2_01.jpg';
64
65 $this->assertCSVDataSet('EXT:impexp/Tests/Functional/Fixtures/DatabaseAssertions/importPagesAndRelatedTtContentWithDifferentImageToExistingData.csv');
66
67 $this->assertFileEquals(__DIR__ . '/../Fixtures/Folders/fileadmin/user_upload/typo3_image2.jpg', PATH_site . 'fileadmin/user_upload/typo3_image2.jpg');
68 $this->assertFileEquals(__DIR__ . '/../Fixtures/FileAssertions/typo3_image2_01.jpg', PATH_site . 'fileadmin/user_upload/typo3_image2_01.jpg');
69 }
70
71 /**
72 * @test
73 */
74 public function importPagesAndRelatedTtContentWithSameImageToExistingData()
75 {
76 $subject = GeneralUtility::makeInstance(Import::class);
77 $subject->init();
78
79 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/pages.xml');
80 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/tt_content-with-image.xml');
81 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_language.xml');
82 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file.xml');
83 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_metadata.xml');
84 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_reference.xml');
85 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_storage.xml');
86
87 $subject->loadFile(
88 __DIR__ . '/../Fixtures/XmlImports/pages-and-ttcontent-with-existing-same-image.xml',
89 1
90 );
91 $subject->importData(0);
92
93 $this->testFilesToDelete[] = PATH_site . 'fileadmin/user_upload/typo3_image2.jpg';
94
95 $this->assertCSVDataSet('EXT:impexp/Tests/Functional/Fixtures/DatabaseAssertions/importPagesAndRelatedTtContentWithSameImageToExistingData.csv');
96
97 $this->assertFileEquals(__DIR__ . '/../Fixtures/Folders/fileadmin/user_upload/typo3_image2.jpg', PATH_site . 'fileadmin/user_upload/typo3_image2.jpg');
98 }
99
100 /**
101 * This test checks multiple remapping does not occur - issue #67188
102 * Scenario:
103 * - Have a local sys_file:1 entry to some image
104 * - Have an import file with 3 tt_content, first element pointing to sys_file:1
105 * image "used-1.jpg" (different from locally existing one), and the other two pointing to
106 * sys_file:2 "used-2.jpg" (also not existing locally)
107 * Upon import, the following is expected:
108 * - sys_file:1 from import file becomes sys_file:2 locally
109 * - sys_file:2 from import file becomes sys_file:3 locally
110 * - content element:1 should reference sys_file:2
111 * - content element:2 & 3 should reference sys_file:3
112 * The issue from #67188 is that tt_content:1 was first mapped to sys_file:2
113 * and when tt_content:2 and tt_content:3 were processed, tt_content:1 image
114 * reference was mapped a second time to the not correct relation sys_file:3,
115 * ending up in mixed sys_file_reference entries.
116 * This test verifies first content element still points to the image used-1.jpg
117 * while the other two point to point to image used-2.jpg
118 * Note the internal handler mixes up insert orders resulting in former tt_content:1
119 * ending up as tt_content:3 and 2/3 ending up as 2/1 uid-wise ... making this issue
120 * even harder to grasp.
121 *
122 * @test
123 */
124 public function importPagesAndTtContentWithRemappingNewSysFileEntries()
125 {
126 $subject = GeneralUtility::makeInstance(Import::class);
127 $subject->init();
128
129 // Have a single sys_file entry with uid 1
130 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_single_image.xml');
131 $this->importDataSet(__DIR__ . '/../Fixtures/DatabaseImports/sys_file_storage.xml');
132
133 // Import file with sys_file:1 and sys_file:2, where sys_file:1 has one connected
134 // content element, and sys_file:2 has two connected content elements.
135 $subject->loadFile(
136 __DIR__ . '/../Fixtures/XmlImports/pages-and-ttcontent-with-two-images.xml',
137 1
138 );
139 $subject->importData(0);
140
141 $this->testFilesToDelete[] = PATH_site . 'fileadmin/user_upload/typo3_image2.jpg';
142 $this->testFilesToDelete[] = PATH_site . 'fileadmin/user_upload/used-1.jpg';
143 $this->testFilesToDelete[] = PATH_site . 'fileadmin/user_upload/used-2.jpg';
144
145 // Expect mapping is updated: one content element should still reference new sys_file:2,
146 // two others should reference new sys_file:3
147 $this->assertCSVDataSet('EXT:impexp/Tests/Functional/Fixtures/DatabaseAssertions/importPagesAndTtContentWithRemappingNewSysFileEntries.csv');
148 }
149 }