2 /***************************************************************
5 * (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
8 * This class is a backport of the corresponding class of FLOW3.
9 * All credits go to the v5 team.
11 * This script is part of the TYPO3 project. The TYPO3 project is
12 * free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * The GNU General Public License can be found at
18 * http://www.gnu.org/copyleft/gpl.html.
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
28 require_once(PATH_tslib
. 'class.tslib_content.php');
30 class Tx_Extbase_Persistence_Mapper_DataMap_testcase
extends Tx_Extbase_BaseTestCase
{
32 public function setUp() {
33 require_once(t3lib_extMgm
::extPath('blog_example') . 'Classes/Domain/Model/Blog.php');
35 $GLOBALS['TSFE']->fe_user
= $this->getMock('tslib_feUserAuth');
36 $GLOBALS['TSFE'] = $this->getMock('tslib_fe', array('includeTCA'), array(), '', FALSE);
38 $GLOBALS['TSFE']->expects($this->any())
39 ->method('includeTCA')
40 ->will($this->returnValue(NULL));
43 $GLOBALS['TSFE']->fe_user
->user
['uid'] = 999;
44 $GLOBALS['TSFE']->id
= 42;
47 public function setupTCA() {
50 $TCA['tx_blogexample_domain_model_blog'] = array (
52 'title' => 'LLL:EXT:blog_example/Resources/Language/locallang_db.xml:tx_blogexample_domain_model_blog',
55 'prependAtCopy' => 'LLL:EXT:lang/locallang_general.xml:LGL.prependAtCopy',
56 'delete' => 'deleted',
57 'enablecolumns' => array (
58 'disabled' => 'hidden'
60 'iconfile' => t3lib_extMgm
::extRelPath($_EXTKEY).'Resources/Icons/icon_tx_blogexample_domain_model_blog.gif'
63 'showRecordFieldList' => 'hidden, name, description, logo, posts'
68 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden',
75 'label' => 'LLL:EXT:blog_example/Resources/Language/locallang_db.xml:tx_blogexample_domain_model_blog.name',
79 'eval' => 'trim,required',
83 'description' => array(
85 'label' => 'LLL:EXT:blog_example/Resources/Language/locallang_db.xml:tx_blogexample_domain_model_blog.description',
95 'label' => 'LLL:EXT:blog_example/Resources/Language/locallang_db.xml:tx_blogexample_domain_model_blog.logo',
98 'internal_type' => 'file',
99 'allowed' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'],
101 'uploadfolder' => 'uploads/pics',
110 'label' => 'LLL:EXT:blog_example/Resources/Language/locallang_db.xml:tx_blogexample_domain_model_blog.posts',
113 'foreign_class' => 'Tx_BlogExample_Domain_Model_Post',
114 'foreign_table' => 'tx_blogexample_domain_model_post',
115 'foreign_field' => 'blog',
116 'foreign_table_field' => 'blog_table',
117 'appearance' => array(
118 'newRecordLinkPosition' => 'bottom',
126 'label' => 'LLL:EXT:blog_example/Resources/Language/locallang_db.xml:tx_blogexample_domain_model_blog.author',
129 'foreign_class' => 'Tx_BlogExample_Domain_Model_Author',
130 'foreign_table' => 'tx_blogexample_domain_model_author',
136 '1' => array('showitem' => 'hidden, name, description, logo, posts')
139 '1' => array('showitem' => '')
144 // public function test_DataMapCanBeInitialized() {
145 // $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap('Tx_BlogExample_Domain_Model_Blog');
146 // $columnMaps = $dataMap->getColumnMaps();
147 // $this->assertEquals(10, count($columnMaps), 'The data map was not initialized (wrong number of column maps set).');
150 // public function test_DeletedColumnNameCanBeResolved() {
151 // $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap('Tx_BlogExample_Domain_Model_Blog');
152 // $deletedColumnName = $dataMap->getDeletedColumnName();
153 // $this->assertEquals($deletedColumnName, 'deleted', 'The deleted column name could not be resolved.');
156 // public function test_HiddenColumnNameCanBeResolved() {
157 // $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap('Tx_BlogExample_Domain_Model_Blog');
158 // $hiddenColumnName = $dataMap->getHiddenColumnName();
159 // $this->assertEquals($hiddenColumnName, 'hidden', 'The hidden column name could not be resolved.');
162 // public function test_ColumnCanBeAdded() {
163 // $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap('Tx_BlogExample_Domain_Model_Blog');
164 // $dataMap->addColumn('test_column');
165 // $columnMaps = $dataMap->getColumnMaps();
166 // $columnMap = array_pop($columnMaps);
167 // $this->assertType('Tx_Extbase_Persistence_Mapper_ColumnMap', $columnMap, 'The column could not be added.');
170 // public function test_PersistablePropertyCanBeChecked() {
171 // $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap('Tx_BlogExample_Domain_Model_Blog');
172 // $dataMap->addColumn('configured_property');
173 // $this->assertTrue($dataMap->isPersistableProperty('configuredProperty'), 'The persistable property was marked as unpersistable.');
174 // $this->assertFalse($dataMap->isPersistableProperty('unconfiguredProperty'), 'The unpersistable property was marked asersistable.');
177 // public function test_HasManyColumnIsRegisteredForForeignTable() {
178 // $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap('Tx_BlogExample_Domain_Model_Blog');
179 // $this->assertEquals(Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_MANY, $dataMap->getColumnMap('posts')->getTypeOfRelation(), 'The posts relation was not of type HAS_MANY.');
182 // public function test_HasOneColumnIsRegisteredForForeignTableWithMaxsizeOne() {
183 // $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap('Tx_BlogExample_Domain_Model_Blog');
184 // $this->assertEquals(Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_ONE, $dataMap->getColumnMap('author')->getTypeOfRelation(), 'The author relation was not of type HAS_ONE.');
190 public function setRelationsDetectsOneToOneRelationOfTypeSelect() {
191 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
192 $columnConfiguration = array(
194 'foreign_table' => 'tx_myextension_bar',
195 'foreign_field' => 'parentid',
196 'foreign_table_field' => 'parenttable',
199 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('setOneToOneRelation', 'setOneToManyRelation', 'setManyToManyRelation'), array(), '', FALSE);
200 $mockDataMap->expects($this->once())->method('setOneToOneRelation');
201 $mockDataMap->expects($this->never())->method('setOneToManyRelation');
202 $mockDataMap->expects($this->never())->method('setManyToManyRelation');
203 $mockDataMap->_callRef('setRelations', $mockColumnMap, $columnConfiguration);
209 public function setRelationsDetectsOneToOneRelationOfTypeInline() {
210 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
211 $columnConfiguration = array(
213 'foreign_table' => 'tx_myextension_bar',
214 'foreign_field' => 'parentid',
215 'foreign_table_field' => 'parenttable',
218 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('setOneToOneRelation', 'setOneToManyRelation', 'setManyToManyRelation'), array(), '', FALSE);
219 $mockDataMap->expects($this->once())->method('setOneToOneRelation');
220 $mockDataMap->expects($this->never())->method('setOneToManyRelation');
221 $mockDataMap->expects($this->never())->method('setManyToManyRelation');
222 $mockDataMap->_callRef('setRelations', $mockColumnMap, $columnConfiguration);
228 public function setRelationsDetectsOneToManyRelationOfTypeSelect() {
229 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
230 $columnConfiguration = array(
232 'foreign_table' => 'tx_myextension_bar',
233 'foreign_field' => 'parentid',
234 'foreign_table_field' => 'parenttable'
236 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('setOneToOneRelation', 'setOneToManyRelation', 'setManyToManyRelation'), array(), '', FALSE);
237 $mockDataMap->expects($this->never())->method('setOneToOneRelation');
238 $mockDataMap->expects($this->once())->method('setOneToManyRelation');
239 $mockDataMap->expects($this->never())->method('setManyToManyRelation');
240 $mockDataMap->_callRef('setRelations', $mockColumnMap, $columnConfiguration);
246 public function setRelationsDetectsOneToManyRelationWitTypeInline() {
247 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
248 $columnConfiguration = array(
250 'foreign_table' => 'tx_myextension_bar',
251 'foreign_field' => 'parentid',
252 'foreign_table_field' => 'parenttable'
254 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('setOneToOneRelation', 'setOneToManyRelation', 'setManyToManyRelation'), array(), '', FALSE);
255 $mockDataMap->expects($this->never())->method('setOneToOneRelation');
256 $mockDataMap->expects($this->once())->method('setOneToManyRelation');
257 $mockDataMap->expects($this->never())->method('setManyToManyRelation');
258 $mockDataMap->_callRef('setRelations', $mockColumnMap, $columnConfiguration);
264 public function setRelationsDetectsManyToManyRelationOfTypeSelect() {
265 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
266 $columnConfiguration = array(
268 'foreign_table' => 'tx_myextension_bar',
269 'MM' => 'tx_myextension_mm'
271 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('setOneToOneRelation', 'setOneToManyRelation', 'setManyToManyRelation'), array(), '', FALSE);
272 $mockDataMap->expects($this->never())->method('setOneToOneRelation');
273 $mockDataMap->expects($this->never())->method('setOneToManyRelation');
274 $mockDataMap->expects($this->once())->method('setManyToManyRelation');
275 $mockDataMap->_callRef('setRelations', $mockColumnMap, $columnConfiguration);
281 public function setRelationsDetectsManyToManyRelationOfTypeInline() {
282 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
283 $columnConfiguration = array(
285 'foreign_table' => 'tx_myextension_mm',
286 'foreign_field' => 'uid_local',
287 'foreign_label' => 'uid_foreign'
289 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('setOneToOneRelation', 'setOneToManyRelation', 'setManyToManyRelation'), array(), '', FALSE);
290 $mockDataMap->expects($this->never())->method('setOneToOneRelation');
291 $mockDataMap->expects($this->never())->method('setOneToManyRelation');
292 $mockDataMap->expects($this->once())->method('setManyToManyRelation');
293 $mockDataMap->_callRef('setRelations', $mockColumnMap, $columnConfiguration);
299 public function columnMapIsInitializedWithManyToManyRelationOfTypeSelect() {
300 $leftColumnsDefinition = array(
303 'foreign_class' => 'Tx_MyExtension_RightClass',
304 'foreign_table' => 'tx_myextension_righttable',
305 'foreign_table_where' => 'WHERE 1=1',
306 'MM' => 'tx_myextension_mm',
307 'MM_table_where' => 'WHERE 2=2',
310 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
311 $mockColumnMap->expects($this->once())->method('setTypeOfRelation')->with($this->equalTo(Tx_Extbase_Persistence_Mapper_ColumnMap
::RELATION_HAS_AND_BELONGS_TO_MANY
));
312 $mockColumnMap->expects($this->once())->method('setChildClassName')->with($this->equalTo('Tx_MyExtension_RightClass'));
313 $mockColumnMap->expects($this->once())->method('setChildTableName')->with($this->equalTo('tx_myextension_righttable'));
314 $mockColumnMap->expects($this->once())->method('setChildTableWhereStatement')->with($this->equalTo('WHERE 1=1'));
315 $mockColumnMap->expects($this->once())->method('setChildSortbyFieldName')->with($this->equalTo('sorting'));
316 $mockColumnMap->expects($this->once())->method('setParentKeyFieldName')->with($this->equalTo('uid_local'));
317 $mockColumnMap->expects($this->never())->method('setParentTableFieldName');
318 $mockColumnMap->expects($this->never())->method('setRelationTableMatchFields');
319 $mockColumnMap->expects($this->never())->method('setRelationTableInsertFields');
321 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('dummy'), array(), '', FALSE);
322 $mockDataMap->_callRef('setManyToManyRelation', $mockColumnMap, $leftColumnsDefinition['rights']);
328 public function columnMapIsInitializedWithOppositeManyToManyRelationOfTypeSelect() {
329 $rightColumnsDefinition = array(
332 'foreign_class' => 'Tx_MyExtension_LeftClass',
333 'foreign_table' => 'tx_myextension_lefttable',
334 'MM' => 'tx_myextension_mm',
335 'MM_opposite_field' => 'rights'
338 $leftColumnsDefinition['rights']['MM_opposite_field'] = 'opposite_field';
339 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
340 $mockColumnMap->expects($this->once())->method('setTypeOfRelation')->with($this->equalTo(Tx_Extbase_Persistence_Mapper_ColumnMap
::RELATION_HAS_AND_BELONGS_TO_MANY
));
341 $mockColumnMap->expects($this->once())->method('setChildClassName')->with($this->equalTo('Tx_MyExtension_LeftClass'));
342 $mockColumnMap->expects($this->once())->method('setChildTableName')->with($this->equalTo('tx_myextension_lefttable'));
343 $mockColumnMap->expects($this->once())->method('setChildTableWhereStatement')->with(NULL);
344 $mockColumnMap->expects($this->once())->method('setChildSortbyFieldName')->with($this->equalTo('sorting_foreign'));
345 $mockColumnMap->expects($this->once())->method('setParentKeyFieldName')->with($this->equalTo('uid_foreign'));
346 $mockColumnMap->expects($this->never())->method('setParentTableFieldName');
347 $mockColumnMap->expects($this->never())->method('setRelationTableMatchFields');
348 $mockColumnMap->expects($this->never())->method('setRelationTableInsertFields');
350 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('dummy'), array(), '', FALSE);
351 $mockDataMap->_callRef('setManyToManyRelation', $mockColumnMap, $rightColumnsDefinition['lefts']);
357 public function columnMapIsInitializedWithManyToManyRelationOfTypeInline() {
358 $leftColumnsDefinition = array(
361 'foreign_table' => 'tx_myextension_mm',
362 'foreign_field' => 'uid_local',
363 'foreign_label' => 'uid_foreign',
364 'foreign_sortby' => 'sorting'
367 $relationTableColumnsDefiniton = array(
368 'uid_local' => array(
369 'foreign_class' => 'Tx_MyExtension_LocalClass',
370 'foreign_table' => 'tx_myextension_localtable'
372 'uid_foreign' => array(
373 'foreign_class' => 'Tx_MyExtension_RightClass',
374 'foreign_table' => 'tx_myextension_righttable'
377 $rightColumnsDefinition = array(
380 'foreign_table' => 'tx_myextension_mm',
381 'foreign_field' => 'uid_foreign',
382 'foreign_label' => 'uid_local',
383 'foreign_sortby' => 'sorting_foreign'
386 $mockColumnMap = $this->getMock('Tx_Extbase_Persistence_Mapper_ColumnMap', array(), array(), '', FALSE);
387 $mockColumnMap->expects($this->once())->method('setTypeOfRelation')->with($this->equalTo(Tx_Extbase_Persistence_Mapper_ColumnMap
::RELATION_HAS_AND_BELONGS_TO_MANY
));
388 $mockColumnMap->expects($this->once())->method('setChildClassName')->with($this->equalTo('Tx_MyExtension_RightClass'));
389 $mockColumnMap->expects($this->once())->method('setChildTableName')->with($this->equalTo('tx_myextension_righttable'));
390 $mockColumnMap->expects($this->never())->method('setChildTableWhereStatement');
391 $mockColumnMap->expects($this->once())->method('setChildSortbyFieldName')->with($this->equalTo('sorting'));
392 $mockColumnMap->expects($this->once())->method('setParentKeyFieldName')->with($this->equalTo('uid_local'));
393 $mockColumnMap->expects($this->never())->method('setParentTableFieldName');
394 $mockColumnMap->expects($this->never())->method('setRelationTableMatchFields');
395 $mockColumnMap->expects($this->never())->method('setRelationTableInsertFields');
397 $mockDataMap = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_Persistence_Mapper_DataMap'), array('getColumnsDefinition', 'determineChildClassName'), array(), '', FALSE);
398 $mockDataMap->expects($this->once())->method('getColumnsDefinition')->with($this->equalTo('tx_myextension_mm'))->will($this->returnValue($relationTableColumnsDefiniton));
399 $mockDataMap->expects($this->once())->method('determineChildClassName')->with($this->equalTo($relationTableColumnsDefiniton['uid_foreign']))->will($this->returnValue('Tx_MyExtension_RightClass'));
400 $mockDataMap->_callRef('setManyToManyRelation', $mockColumnMap, $leftColumnsDefinition['rights']);