From 85ec328d799198eaec6c7273206ab23de097c4bc Mon Sep 17 00:00:00 2001 From: Bastian Waidelich Date: Mon, 19 Jul 2010 19:40:53 +0000 Subject: [PATCH] [+TASK] Fluid (Tests): Backported FormViewHelperTest from Fluid package [+BUGFIX] Fluid (ViewHelpers): FormViewHelper wraps hidden fields with a div tag to create XHTML valid output. This fixes #5512 (backported from Fluid package) --- .../fluid/Classes/ViewHelpers/FormViewHelper.php | 8 +- .../Tests/Unit/ViewHelpers/FormViewHelperTest.php | 244 +++++++++++++++++++++ 2 files changed, 249 insertions(+), 3 deletions(-) create mode 100644 typo3/sysext/fluid/Tests/Unit/ViewHelpers/FormViewHelperTest.php diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php index 2783818..8bf49fb 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php @@ -138,10 +138,12 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst $formContent = $this->renderChildren(); - $content = $this->renderHiddenIdentityField($this->arguments['object'], $this->arguments['name']); + $content = chr(10) . '
'; + $content .= $this->renderHiddenIdentityField($this->arguments['object'], $this->arguments['name']); $content .= $this->renderAdditionalIdentityFields(); $content .= $this->renderHiddenReferrerFields(); $content .= $this->renderRequestHashField(); // Render hmac after everything else has been rendered + $content .= chr(10) . '
' . chr(10); $content .= $formContent; $this->tag->setContent($content); @@ -173,9 +175,9 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst ->setUseCacheHash(!$this->arguments['noCacheHash']) ->setSection($this->arguments['section']) ->setCreateAbsoluteUri($this->arguments['absolute']) - ->setArguments($this->arguments['additionalParams']) + ->setArguments((array)$this->arguments['additionalParams']) ->setAddQueryString($this->arguments['addQueryString']) - ->setArgumentsToBeExcludedFromQueryString($this->arguments['argumentsToBeExcludedFromQueryString']) + ->setArgumentsToBeExcludedFromQueryString((array)$this->arguments['argumentsToBeExcludedFromQueryString']) ->setFormat($this->arguments['format']) ->uriFor($this->arguments['action'], $this->arguments['arguments'], $this->arguments['controller'], $this->arguments['extensionName'], $this->arguments['pluginName']); $this->formActionUriArguments = $uriBuilder->getArguments(); diff --git a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/FormViewHelperTest.php b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/FormViewHelperTest.php new file mode 100644 index 00000000..4a31043 --- /dev/null +++ b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/FormViewHelperTest.php @@ -0,0 +1,244 @@ + + */ + public function renderAddsObjectToViewHelperVariableContainer() { + $formObject = new stdClass(); + + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren', 'renderHiddenIdentityField', 'renderAdditionalIdentityFields', 'renderHiddenReferrerFields', 'renderRequestHashField', 'addFormNameToViewHelperVariableContainer', 'addFieldNamePrefixToViewHelperVariableContainer', 'removeFormNameFromViewHelperVariableContainer', 'removeFieldNamePrefixFromViewHelperVariableContainer', 'addFormFieldNamesToViewHelperVariableContainer', 'removeFormFieldNamesFromViewHelperVariableContainer'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $viewHelper->setArguments(new Tx_Fluid_Core_ViewHelper_Arguments(array('object' => $formObject))); + $this->viewHelperVariableContainer->expects($this->at(0))->method('add')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObject', $formObject); + $this->viewHelperVariableContainer->expects($this->at(1))->method('add')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'additionalIdentityProperties', array()); + $this->viewHelperVariableContainer->expects($this->at(2))->method('remove')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObject'); + $this->viewHelperVariableContainer->expects($this->at(3))->method('remove')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'additionalIdentityProperties'); + $viewHelper->render(); + } + + /** + * @test + * @author Sebastian Kurfürst + */ + public function renderAddsFormNameToTemplateVariableContainer() { + $formName = 'someFormName'; + + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren', 'renderHiddenIdentityField', 'renderHiddenReferrerFields', 'renderRequestHashField', 'addFormObjectToViewHelperVariableContainer', 'addFieldNamePrefixToViewHelperVariableContainer', 'removeFormObjectFromViewHelperVariableContainer', 'removeFieldNamePrefixFromViewHelperVariableContainer', 'addFormFieldNamesToViewHelperVariableContainer', 'removeFormFieldNamesFromViewHelperVariableContainer'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $viewHelper->setArguments(new Tx_Fluid_Core_ViewHelper_Arguments(array('name' => $formName))); + + $this->viewHelperVariableContainer->expects($this->once())->method('add')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName', $formName); + $this->viewHelperVariableContainer->expects($this->once())->method('remove')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName'); + $viewHelper->render(); + } + + /** + * @test + * @author Christopher Hlubek + */ + public function renderCallsRenderHiddenReferrerFields() { + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren', 'renderRequestHashField', 'renderHiddenReferrerFields'), array(), '', FALSE); + $viewHelper->expects($this->once())->method('renderHiddenReferrerFields'); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $viewHelper->render(); + } + + /** + * @test + * @author Sebastian Kurfürst + */ + public function renderCallsRenderHiddenIdentityField() { + $object = new stdClass(); + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren', 'renderRequestHashField', 'renderHiddenIdentityField'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + $viewHelper->setArguments(new Tx_Fluid_Core_ViewHelper_Arguments(array('object' => $object, 'name' => 'MyName'))); + $viewHelper->expects($this->once())->method('renderHiddenIdentityField')->with($object, 'MyName'); + + $viewHelper->render(); + } + + /** + * @test + * @author Sebastian Kurfürst + */ + public function renderCallsRenderAdditionalIdentityFields() { + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren', 'renderRequestHashField', 'renderAdditionalIdentityFields'), array(), '', FALSE); + $viewHelper->expects($this->once())->method('renderAdditionalIdentityFields'); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $viewHelper->render(); + } + + /** + * @test + * @author Bastian Waidelich + */ + public function renderWrapsHiddenFieldsWithDivForXhtmlCompatibility() { + $viewHelper = $this->getMock($this->buildAccessibleProxy('Tx_Fluid_ViewHelpers_FormViewHelper'), array('renderChildren', 'renderHiddenIdentityField', 'renderAdditionalIdentityFields', 'renderHiddenReferrerFields', 'renderRequestHashField'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + $viewHelper->expects($this->once())->method('renderHiddenIdentityField')->will($this->returnValue('hiddenIdentityField')); + $viewHelper->expects($this->once())->method('renderAdditionalIdentityFields')->will($this->returnValue('additionalIdentityFields')); + $viewHelper->expects($this->once())->method('renderHiddenReferrerFields')->will($this->returnValue('hiddenReferrerFields')); + $viewHelper->expects($this->once())->method('renderRequestHashField')->will($this->returnValue('requestHashField')); + $viewHelper->expects($this->once())->method('renderChildren')->will($this->returnValue('formContent')); + + $expectedResult = chr(10) . '
' . 'hiddenIdentityFieldadditionalIdentityFieldshiddenReferrerFieldsrequestHashField' . chr(10) . '
' . chr(10) . 'formContent'; + $this->tagBuilder->expects($this->once())->method('setContent')->with($expectedResult); + + $viewHelper->render(); + } + + + /** + * @test + * @author Sebastian Kurfürst + */ + public function renderAdditionalIdentityFieldsFetchesTheFieldsFromViewHelperVariableContainerAndBuildsHiddenFieldsForThem() { + $identityProperties = array( + 'object1[object2]' => '', + 'object1[object2][subobject]' => '' + ); + $this->viewHelperVariableContainer->expects($this->once())->method('exists')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'additionalIdentityProperties')->will($this->returnValue(TRUE)); + $this->viewHelperVariableContainer->expects($this->once())->method('get')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'additionalIdentityProperties')->will($this->returnValue($identityProperties)); + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $expected = chr(10) . '' . chr(10) . + ''; + $actual = $viewHelper->_call('renderAdditionalIdentityFields'); + $this->assertEquals($expected, $actual); + } + + /** + * @test + * @author Christopher Hlubek + */ + public function renderHiddenReferrerFieldsAddCurrentControllerAndActionAsHiddenFields() { + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('dummy'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $this->request->expects($this->atLeastOnce())->method('getControllerExtensionName')->will($this->returnValue('extensionName')); + $this->request->expects($this->never())->method('getControllerSubextensionName'); + $this->request->expects($this->atLeastOnce())->method('getControllerName')->will($this->returnValue('controllerName')); + $this->request->expects($this->atLeastOnce())->method('getControllerActionName')->will($this->returnValue('controllerActionName')); + + $hiddenFields = $viewHelper->_call('renderHiddenReferrerFields'); + $expectedResult = chr(10) . '' . chr(10) . + '' . chr(10) . + '' . chr(10); + $this->assertEquals($expectedResult, $hiddenFields); + } + + /** + * @test + * @author Bastian Waidelich + */ + public function renderAddsSpecifiedPrefixToTemplateVariableContainer() { + $prefix = 'somePrefix'; + + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren', 'renderHiddenIdentityField', 'renderHiddenReferrerFields', 'renderRequestHashField', 'addFormFieldNamesToViewHelperVariableContainer', 'removeFormFieldNamesFromViewHelperVariableContainer'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $viewHelper->setArguments(new Tx_Fluid_Core_ViewHelper_Arguments(array('fieldNamePrefix' => $prefix))); + + $this->viewHelperVariableContainer->expects($this->once())->method('add')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'fieldNamePrefix', $prefix); + $this->viewHelperVariableContainer->expects($this->once())->method('remove')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'fieldNamePrefix'); + $viewHelper->render(); + } + + /** + * @test + * @author Bastian Waidelich + */ + public function renderAddsDefaultFieldNamePrefixToTemplateVariableContainerIfNoPrefixIsSpecified() { + $expectedPrefix = 'tx_someextension_someplugin'; + $this->request->expects($this->once())->method('getControllerExtensionName')->will($this->returnValue('SomeExtension')); + $this->request->expects($this->once())->method('getPluginName')->will($this->returnValue('SomePlugin')); + + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('renderChildren', 'renderHiddenIdentityField', 'renderHiddenReferrerFields', 'renderRequestHashField', 'addFormFieldNamesToViewHelperVariableContainer', 'removeFormFieldNamesFromViewHelperVariableContainer'), array(), '', FALSE); + $this->injectDependenciesIntoViewHelper($viewHelper); + + $this->viewHelperVariableContainer->expects($this->once())->method('add')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'fieldNamePrefix', $expectedPrefix); + $this->viewHelperVariableContainer->expects($this->once())->method('remove')->with('Tx_Fluid_ViewHelpers_FormViewHelper', 'fieldNamePrefix'); + $viewHelper->render(); + } + + /** + * Data Provider for postProcessUriArgumentsForRequestHashWorks + */ + public function argumentsForPostProcessUriArgumentsForRequestHash() { + return array( + // simple values + array( + array( + 'bla' => 'X', + 'blubb' => 'Y' + ), + array( + 'bla', + 'blubb' + ) + ), + // Arrays + array( + array( + 'bla' => array( + 'test1' => 'X', + 'test2' => 'Y' + ), + 'blubb' => 'Y' + ), + array( + 'bla[test1]', + 'bla[test2]', + 'blubb' + ) + ) + ); + } + /** + * @test + * @author Sebastian Kurfürst + * @dataProvider argumentsForPostProcessUriArgumentsForRequestHash + */ + public function postProcessUriArgumentsForRequestHashWorks($arguments, $expectedResults) { + $viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_FormViewHelper', array('dummy'), array(), '', FALSE); + $results = array(); + $viewHelper->_callRef('postProcessUriArgumentsForRequestHash', $arguments, $results); + $this->assertEquals($expectedResults, $results); + } +} +?> \ No newline at end of file -- 2.1.4