TYPO3 CMS  TYPO3_8-7
LocalizationControllerTest.php
Go to the documentation of this file.
1 <?php
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 
25 
29 class LocalizationControllerTest extends \TYPO3\TestingFramework\Core\Functional\FunctionalTestCase
30 {
34  protected $subject;
35 
39  protected $actionService;
40 
44  protected $backendUser;
45 
49  protected $coreExtensionsToLoad = ['version', 'workspaces'];
50 
54  protected function setUp()
55  {
56  parent::setUp();
57 
58  $this->backendUser = $this->setUpBackendUserFromFixture(1);
59  $this->backendUser->workspace = 0;
60 
61  Bootstrap::getInstance()->initializeLanguageObject();
62  $this->actionService = GeneralUtility::makeInstance(ActionService::class);
63 
64  $this->importDataSet(__DIR__ . '/Fixtures/pages.xml');
65  $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/sys_language.xml');
66  $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/backend/Tests/Functional/Controller/Page/Fixtures/tt_content-default-language.xml');
67 
68  $this->subject = new LocalizationController();
69  }
70 
75  {
76  $params = [
77  'pageId' => 1,
78  'srcLanguageId' => 0,
79  'destLanguageId' => 1,
80  'uidList' => [1, 2, 3],
82  ];
83  $this->callInaccessibleMethod($this->subject, 'process', $params);
84 
85  $expectedResults = [
86  [
87  'pid' => 1,
88  'sys_language_uid' => 1,
89  'l18n_parent' => 1,
90  'header' => '[Translate to Dansk:] Test content 1',
91  ],
92  [
93  'pid' => 1,
94  'sys_language_uid' => 1,
95  'l18n_parent' => 2,
96  'header' => '[Translate to Dansk:] Test content 2',
97  ],
98  [
99  'pid' => 1,
100  'sys_language_uid' => 1,
101  'l18n_parent' => 3,
102  'header' => '[Translate to Dansk:] Test content 3',
103  ],
104  ];
105  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tt_content');
106  $queryBuilder->getRestrictions()->removeAll();
107  $results = $queryBuilder
108  ->select('pid', 'sys_language_uid', 'l18n_parent', 'header')
109  ->from('tt_content')
110  ->where(
111  $queryBuilder->expr()->andX(
112  $queryBuilder->expr()->eq(
113  'pid',
114  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
115  ),
116  $queryBuilder->expr()->eq(
117  'sys_language_uid',
118  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
119  )
120  )
121  )
122  ->orderBy('uid')
123  ->execute()
124  ->fetchAll();
125  $this->assertEquals($expectedResults, $results);
126  }
127 
132  {
133  $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/backend/Tests/Functional/Controller/Page/Fixtures/tt_content-danish-language.xml');
134 
135  $params = [
136  'pageId' => 1,
137  'srcLanguageId' => 1,
138  'destLanguageId' => 2,
139  'uidList' => [4, 5, 6], // uids of tt_content-danish-language
141  ];
142  $this->callInaccessibleMethod($this->subject, 'process', $params);
143 
144  $expectedResults = [
145  [
146  'pid' => 1,
147  'sys_language_uid' => 2,
148  'l18n_parent' => 1,
149  'header' => '[Translate to Deutsch:] Test indhold 1',
150  ],
151  [
152  'pid' => 1,
153  'sys_language_uid' => 2,
154  'l18n_parent' => 2,
155  'header' => '[Translate to Deutsch:] Test indhold 2',
156  ],
157  [
158  'pid' => 1,
159  'sys_language_uid' => 2,
160  'l18n_parent' => 3,
161  'header' => '[Translate to Deutsch:] Test indhold 3',
162  ],
163  ];
164  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tt_content');
165  $queryBuilder->getRestrictions()->removeAll();
166  $results = $queryBuilder
167  ->select('pid', 'sys_language_uid', 'l18n_parent', 'header')
168  ->from('tt_content')
169  ->where(
170  $queryBuilder->expr()->andX(
171  $queryBuilder->expr()->eq(
172  'pid',
173  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
174  ),
175  $queryBuilder->expr()->eq(
176  'sys_language_uid',
177  $queryBuilder->createNamedParameter(2, \PDO::PARAM_INT)
178  )
179  )
180  )
181  ->orderBy('uid')
182  ->execute()
183  ->fetchAll();
184  $this->assertEquals($expectedResults, $results);
185  }
186 
191  {
192  $params = [
193  'pageId' => 1,
194  'srcLanguageId' => 0,
195  'destLanguageId' => 2,
196  'uidList' => [1, 2, 3],
198  ];
199  $this->callInaccessibleMethod($this->subject, 'process', $params);
200 
201  $expectedResults = [
202  [
203  'pid' => 1,
204  'sys_language_uid' => 2,
205  'l18n_parent' => 0,
206  'header' => '[Translate to Deutsch:] Test content 1',
207  ],
208  [
209  'pid' => 1,
210  'sys_language_uid' => 2,
211  'l18n_parent' => 0,
212  'header' => '[Translate to Deutsch:] Test content 2',
213  ],
214  [
215  'pid' => 1,
216  'sys_language_uid' => 2,
217  'l18n_parent' => 0,
218  'header' => '[Translate to Deutsch:] Test content 3',
219  ],
220  ];
221  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tt_content');
222  $queryBuilder->getRestrictions()->removeAll();
223  $results = $queryBuilder
224  ->select('pid', 'sys_language_uid', 'l18n_parent', 'header')
225  ->from('tt_content')
226  ->where(
227  $queryBuilder->expr()->andX(
228  $queryBuilder->expr()->eq(
229  'pid',
230  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
231  ),
232  $queryBuilder->expr()->eq(
233  'sys_language_uid',
234  $queryBuilder->createNamedParameter(2, \PDO::PARAM_INT)
235  )
236  )
237  )
238  ->orderBy('uid')
239  ->execute()
240  ->fetchAll();
241  $this->assertEquals($expectedResults, $results);
242  }
243 
248  {
249  $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/backend/Tests/Functional/Controller/Page/Fixtures/tt_content-danish-language.xml');
250 
251  $params = [
252  'pageId' => 1,
253  'srcLanguageId' => 1,
254  'destLanguageId' => 2,
255  'uidList' => [4, 5, 6], // uids of tt_content-danish-language
257  ];
258  $this->callInaccessibleMethod($this->subject, 'process', $params);
259 
260  $expectedResults = [
261  [
262  'pid' => 1,
263  'sys_language_uid' => 2,
264  'l18n_parent' => 0,
265  'header' => '[Translate to Deutsch:] Test indhold 1',
266  ],
267  [
268  'pid' => 1,
269  'sys_language_uid' => 2,
270  'l18n_parent' => 0,
271  'header' => '[Translate to Deutsch:] Test indhold 2',
272  ],
273  [
274  'pid' => 1,
275  'sys_language_uid' => 2,
276  'l18n_parent' => 0,
277  'header' => '[Translate to Deutsch:] Test indhold 3',
278  ],
279  ];
280  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tt_content');
281  $queryBuilder->getRestrictions()->removeAll();
282  $results = $queryBuilder
283  ->select('pid', 'sys_language_uid', 'l18n_parent', 'header')
284  ->from('tt_content')
285  ->where(
286  $queryBuilder->expr()->andX(
287  $queryBuilder->expr()->eq(
288  'pid',
289  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
290  ),
291  $queryBuilder->expr()->eq(
292  'sys_language_uid',
293  $queryBuilder->createNamedParameter(2, \PDO::PARAM_INT)
294  )
295  )
296  )
297  ->orderBy('uid')
298  ->execute()
299  ->fetchAll();
300  $this->assertEquals($expectedResults, $results);
301  }
302 
307  {
308  $params = [
309  'pageId' => 1,
310  'srcLanguageId' => 0,
311  'destLanguageId' => 1,
312  'uidList' => [1, 2, 3],
314  ];
315  $this->callInaccessibleMethod($this->subject, 'process', $params);
316 
317  // Create another content element in default language
318  $data = [
319  'tt_content' => [
320  'NEW123456' => [
321  'sys_language_uid' => 0,
322  'header' => 'Test content 2.5',
323  'pid' => -2,
324  ],
325  ],
326  ];
327  $dataHandler = new DataHandler();
328  $dataHandler->start($data, []);
329  $dataHandler->process_datamap();
330  $dataHandler->process_cmdmap();
331  $newContentElementUid = $dataHandler->substNEWwithIDs['NEW123456'];
332 
333  // Copy the new content element
334  $params = [
335  'pageId' => 1,
336  'srcLanguageId' => 0,
337  'destLanguageId' => 1,
338  'uidList' => [$newContentElementUid],
340  ];
341  $this->callInaccessibleMethod($this->subject, 'process', $params);
342 
343  $expectedResults = [
344  [
345  'pid' => 1,
346  'sys_language_uid' => 1,
347  'l18n_parent' => 0,
348  'header' => '[Translate to Dansk:] Test content 1',
349  ],
350  [
351  'pid' => 1,
352  'sys_language_uid' => 1,
353  'l18n_parent' => 0,
354  'header' => '[Translate to Dansk:] Test content 2',
355  ],
356  [
357  'pid' => 1,
358  'sys_language_uid' => 1,
359  'l18n_parent' => 0,
360  'header' => '[Translate to Dansk:] Test content 2.5',
361  ],
362  [
363  'pid' => 1,
364  'sys_language_uid' => 1,
365  'l18n_parent' => 0,
366  'header' => '[Translate to Dansk:] Test content 3',
367  ],
368  ];
369  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tt_content');
370  $queryBuilder->getRestrictions()->removeAll();
371  $results = $queryBuilder
372  ->select('pid', 'sys_language_uid', 'l18n_parent', 'header')
373  ->from('tt_content')
374  ->where(
375  $queryBuilder->expr()->andX(
376  $queryBuilder->expr()->eq(
377  'pid',
378  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
379  ),
380  $queryBuilder->expr()->eq(
381  'sys_language_uid',
382  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
383  )
384  )
385  )
386  ->orderBy('sorting', 'ASC')
387  ->execute()
388  ->fetchAll();
389  $this->assertEquals($expectedResults, $results);
390  }
391 
396  {
397  $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/backend/Tests/Functional/Controller/Page/Fixtures/tt_content-danish-language.xml');
398 
399  // Create another content element in default language
400  $data = [
401  'tt_content' => [
402  'NEW123456' => [
403  'sys_language_uid' => 0,
404  'header' => 'New content element',
405  'pid' => 1,
406  'colPos' => 0,
407  ],
408  ],
409  ];
410  $dataHandler = new DataHandler();
411  $dataHandler->start($data, []);
412  $dataHandler->process_datamap();
413  $dataHandler->process_cmdmap();
414 
415  $request = (new ServerRequest())->withQueryParams([
416  'pageId' => 1, // page uid, the records are stored on
417  'colPos' => 0,
418  'languageId' => 1 // current language id
419  ]);
420  $response = new Response();
421 
422  $this->subject->getUsedLanguagesInPageAndColumn($request, $response);
423  $this->assertThat($response->getBody(), $this->stringContains('"uid":0'));
424  }
425 
430  {
431  // Delete record 2 within workspace 1
432  $this->backendUser->workspace = 1;
433  $this->actionService->deleteRecord('tt_content', 2);
434 
435  $expectedRecordUidList = [
436  ['uid' => 1],
437  ['uid' => 3]
438  ];
439 
440  $this->assertEquals($expectedRecordUidList, $this->getReducedRecordLocalizeSummary());
441  }
442 
447  {
448  // Move record 2 to page 2 within workspace 1
449  $this->backendUser->workspace = 1;
450  $this->actionService->moveRecord('tt_content', 2, 2);
451 
452  $expectedRecordUidList = [
453  ['uid' => 1],
454  ['uid' => 3]
455  ];
456 
457  $this->assertEquals($expectedRecordUidList, $this->getReducedRecordLocalizeSummary());
458  }
459 
465  protected function getReducedRecordLocalizeSummary()
466  {
467  $request = (new ServerRequest())->withQueryParams([
468  'pageId' => 1, // page uid, the records are stored on
469  'colPos' => 0, // column position, the records are to be taken from
470  'destLanguageId' => 1, // destination language uid
471  'languageId' => 0 // source language uid
472  ]);
473 
474  $recordLocalizeSummaryResponse = $this->subject->getRecordLocalizeSummary($request, new Response());
475 
476  // Reduce the fetched record summary to list of uids
477  if ($recordLocalizeSummary = json_decode((string)$recordLocalizeSummaryResponse->getBody(), true)) {
478  foreach ($recordLocalizeSummary as &$record) {
479  if (is_array($record)) {
480  $record = array_intersect_key($record, ['uid' => '']);
481  }
482  }
483  }
484 
485  return $recordLocalizeSummary;
486  }
487 }
static makeInstance($className,... $constructorArguments)