From 9c2b9b33e978af25ae18747db949e24c884b1f3d Mon Sep 17 00:00:00 2001 From: Nicole Cordes <typo3@cordes.co> Date: Tue, 19 Sep 2017 15:15:47 +0200 Subject: [PATCH] [FOLLOWUP][BUGFIX] IRRE: Check if TCA['ctrl']['languageField'] is set This patch adds missing functional tests for \TYPO3\CMS\Backend\Controller\FormInlineAjaxController::createAction Related: #82330 Releases: master, 8.7, 7.6 Change-Id: I61c8c07dd0d2c6a92bb445d7f2b6baee23251f5d Reviewed-on: https://review.typo3.org/54171 Tested-by: TYPO3com <no-reply@typo3.com> Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch> Tested-by: Christian Kuhn <lolli@schwarzbu.ch> Reviewed-by: Frank Naegler <frank.naegler@typo3.org> Tested-by: Frank Naegler <frank.naegler@typo3.org> --- .../FormInlineAjaxControllerTest.php | 204 ++++++++++++++++++ .../Fixtures/tx_irretutorial_1ncsv_hotel.xml | 28 +++ 2 files changed, 232 insertions(+) create mode 100644 typo3/sysext/backend/Tests/Functional/Controller/FormInlineAjaxControllerTest.php create mode 100644 typo3/sysext/backend/Tests/Functional/Fixtures/tx_irretutorial_1ncsv_hotel.xml diff --git a/typo3/sysext/backend/Tests/Functional/Controller/FormInlineAjaxControllerTest.php b/typo3/sysext/backend/Tests/Functional/Controller/FormInlineAjaxControllerTest.php new file mode 100644 index 000000000000..5eaa829232a0 --- /dev/null +++ b/typo3/sysext/backend/Tests/Functional/Controller/FormInlineAjaxControllerTest.php @@ -0,0 +1,204 @@ +<?php +namespace TYPO3\CMS\Backend\Tests\Functional\Controller; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Backend\Controller\FormInlineAjaxController; +use TYPO3\CMS\Core\Core\Bootstrap; +use TYPO3\CMS\Core\Http\Response; +use TYPO3\CMS\Core\Http\ServerRequest; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase; + +/** + * Test case for TYPO3\CMS\Backend\Controller\FormInlineAjaxController + */ +class FormInlineAjaxControllerTest extends FunctionalTestCase +{ + /** + * @var FormInlineAjaxController + */ + protected $subject; + + /** + * @var array + */ + protected $testExtensionsToLoad = [ + 'typo3/sysext/core/Tests/Functional/Fixtures/Extensions/irre_tutorial', + ]; + + /** + * Sets up this test case. + */ + protected function setUp() + { + parent::setUp(); + + $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/pages.xml'); + $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/sys_language.xml'); + $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/core/Tests/Functional/Fixtures/pages_language_overlay.xml'); + $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/backend/Tests/Functional/Fixtures/tx_irretutorial_1ncsv_hotel.xml'); + + $this->setUpBackendUserFromFixture(1); + Bootstrap::getInstance()->initializeLanguageObject(); + + $this->subject = new FormInlineAjaxController(); + } + + /** + * @test + */ + public function createActionWithNewParentReturnsResponseForInlineChildData() + { + $parsedBody = [ + 'ajax' => [ + 0 => 'data-1-tx_irretutorial_1ncsv_hotel-NEW59c1062549e56282348897-offers-tx_irretutorial_1ncsv_offer', + 'context' => json_encode($this->getContextForSysLanguageUid(0)), + ], + ]; + + $request = new ServerRequest(); + $request = $request->withParsedBody($parsedBody); + $response = new Response(); + + $response = $this->subject->createAction($request, $response); + $body = (string)$response->getBody(); + $jsonArray = json_decode($body, true); + + $this->assertNotEmpty($jsonArray['data']); + } + + /** + * @test + */ + public function createActionWithExistingParentReturnsResponseForInlineChildData() + { + $parsedBody = [ + 'ajax' => [ + 0 => 'data-1-tx_irretutorial_1ncsv_hotel-NEW59c1062549e56282348897-offers-tx_irretutorial_1ncsv_offer', + 'context' => json_encode($this->getContextForSysLanguageUid(0)), + ], + ]; + + $request = new ServerRequest(); + $request = $request->withParsedBody($parsedBody); + + $response = new Response(); + + $response = $this->subject->createAction($request, $response); + $body = (string)$response->getBody(); + $jsonArray = json_decode($body, true); + + $this->assertNotEmpty($jsonArray['data']); + } + + /** + * @test + */ + public function createActionWithExistingLocalizedParentReturnsResponseWithLocalizedChildData() + { + $parsedBody = [ + 'ajax' => [ + 0 => 'data-1-tx_irretutorial_1ncsv_hotel-NEW59c1062549e56282348897-offers-tx_irretutorial_1ncsv_offer', + 'context' => json_encode($this->getContextForSysLanguageUid(1)), + ], + ]; + + $request = new ServerRequest(); + $request = $request->withParsedBody($parsedBody); + $response = new Response(); + + $response = $this->subject->createAction($request, $response); + $body = (string)$response->getBody(); + $jsonArray = json_decode($body, true); + + $this->assertRegExp('/<option value="1"[^>]* selected="selected">Dansk<\/option>/', $jsonArray['data']); + } + + /** + * @test + */ + public function createActionWithExistingLocalizedParentAndNotLocalizableChildReturnsResponseWithChildData() + { + unset($GLOBALS['TCA']['tx_irretutorial_1ncsv_offer']['ctrl']['languageField']); + unset($GLOBALS['TCA']['tx_irretutorial_1ncsv_offer']['ctrl']['transOrigPointerField']); + unset($GLOBALS['TCA']['tx_irretutorial_1ncsv_offer']['ctrl']['transOrigDiffSourceField']); + + $parsedBody = [ + 'ajax' => [ + 0 => 'data-1-tx_irretutorial_1ncsv_hotel-NEW59c1062549e56282348897-offers-tx_irretutorial_1ncsv_offer', + 'context' => json_encode($this->getContextForSysLanguageUid(1)), + ], + ]; + + $request = new ServerRequest(); + $request = $request->withParsedBody($parsedBody); + $response = new Response(); + + $response = $this->subject->createAction($request, $response); + $body = (string)$response->getBody(); + $jsonArray = json_decode($body, true); + + $this->assertNotRegExp('/<select[^>]* name="data\[tx_irretutorial_1ncsv_offer\]\[NEW[1-9]+\]\[sys_language_uid\]"[^>]*>/', $jsonArray['data']); + } + + /** + * @param int $sysLanguageUid + * @return array + */ + protected function getContextForSysLanguageUid(int $sysLanguageUid): array + { + $context = [ + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_irretutorial_1ncsv_offer', + 'maxitems' => 10, + 'appearance' => [ + 'showSynchronizationLink' => 1, + 'showAllLocalizationLink' => 1, + 'showPossibleLocalizationRecords' => true, + 'showRemovedLocalizationRecords' => true, + 'levelLinksPosition' => 'top', + 'enabledControls' => [ + 'info' => true, + 'new' => true, + 'dragdrop' => true, + 'sort' => true, + 'hide' => true, + 'delete' => true, + 'localize' => true, + ], + ], + 'behaviour' => [ + 'localizationMode' => 'none', + 'localizeChildrenAtParentLocalization' => true, + ], + 'default' => '', + 'minitems' => 0, + 'inline' => [ + 'parentSysLanguageUid' => $sysLanguageUid, + 'first' => false, + 'last' => false, + ], + ], + ]; + + return array_merge( + $context, + [ + 'hmac' => GeneralUtility::hmac(json_encode($context['config']), 'InlineContext'), + ] + ); + } +} diff --git a/typo3/sysext/backend/Tests/Functional/Fixtures/tx_irretutorial_1ncsv_hotel.xml b/typo3/sysext/backend/Tests/Functional/Fixtures/tx_irretutorial_1ncsv_hotel.xml new file mode 100644 index 000000000000..44a1d324004a --- /dev/null +++ b/typo3/sysext/backend/Tests/Functional/Fixtures/tx_irretutorial_1ncsv_hotel.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<dataset> + <tx_irretutorial_1ncsv_hotel> + <uid>1</uid> + <pid>1</pid> + <title>1:n CSV: Hotel</title> + <offers /> + <l18n_diffsource /> + </tx_irretutorial_1ncsv_hotel> + <tx_irretutorial_1ncsv_hotel> + <uid>2</uid> + <pid>1</pid> + <title>1:n CSV: Hotel [Dansk]</title> + <sys_language_uid>1</sys_language_uid> + <l18n_parent>1</l18n_parent> + <offers /> + <l18n_diffsource /> + </tx_irretutorial_1ncsv_hotel> + <tx_irretutorial_1ncsv_hotel> + <uid>3</uid> + <pid>1</pid> + <title>1:n CSV: Hotel [Deutsch]</title> + <sys_language_uid>2</sys_language_uid> + <l18n_parent>1</l18n_parent> + <offers /> + <l18n_diffsource /> + </tx_irretutorial_1ncsv_hotel> +</dataset> -- GitLab