21 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
22 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
35 [
'Tx_Myext_Domain_Model_Foo'],
36 [\TYPO3\CMS\Extbase\Domain\Model\FrontendUser::class]
46 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
47 $columnConfiguration = [
49 'foreign_table' =>
'tx_myextension_bar',
50 'foreign_field' =>
'parentid'
56 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'setOneToOneRelation',
'setOneToManyRelation',
'setManyToManyRelation'], [],
'',
false);
57 $mockDataMapFactory->expects($this->once())->method(
'setOneToOneRelation')->will($this->returnValue($mockColumnMap));
58 $mockDataMapFactory->expects($this->never())->method(
'setOneToManyRelation');
59 $mockDataMapFactory->expects($this->never())->method(
'setManyToManyRelation');
60 $mockDataMapFactory->_callRef(
'setRelations', $mockColumnMap, $columnConfiguration, $propertyMetaData);
68 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
70 'fieldname' =>
'foo_model'
72 $columnConfiguration = [
74 'foreign_table' =>
'tx_myextension_bar',
75 'foreign_field' =>
'parentid',
76 'foreign_match_fields' => $matchFields
79 $mockColumnMap->expects($this->once())
80 ->method(
'setRelationTableMatchFields')
82 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'dummy'], [],
'',
false);
83 $mockDataMapFactory->_call(
'setOneToOneRelation', $mockColumnMap, $columnConfiguration);
91 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
93 'fieldname' =>
'foo_model'
95 $columnConfiguration = [
97 'foreign_table' =>
'tx_myextension_bar',
98 'foreign_field' =>
'parentid',
99 'foreign_match_fields' => $matchFields
102 $mockColumnMap->expects($this->once())
103 ->method(
'setRelationTableMatchFields')
104 ->with($matchFields);
105 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'dummy'], [],
'',
false);
106 $mockDataMapFactory->_call(
'setOneToManyRelation', $mockColumnMap, $columnConfiguration);
114 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
115 $columnConfiguration = [
117 'foreign_table' =>
'tx_myextension_bar',
118 'MM' =>
'tx_myextension_mm'
120 $propertyMetaData = [
121 'type' =>
'Tx_Myext_Domain_Model_Foo',
122 'elementType' => null
124 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'setOneToOneRelation',
'setOneToManyRelation',
'setManyToManyRelation'], [],
'',
false);
125 $mockDataMapFactory->expects($this->never())->method(
'setOneToOneRelation');
126 $mockDataMapFactory->expects($this->never())->method(
'setOneToManyRelation');
127 $mockDataMapFactory->expects($this->once())->method(
'setManyToManyRelation')->will($this->returnValue($mockColumnMap));
128 $mockDataMapFactory->_callRef(
'setRelations', $mockColumnMap, $columnConfiguration, $propertyMetaData);
136 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
137 $columnConfiguration = [
139 'foreign_table' =>
'tx_myextension_bar',
140 'foreign_field' =>
'parentid',
141 'foreign_table_field' =>
'parenttable'
143 $propertyMetaData = [
144 'type' => \TYPO3\CMS\Extbase\Persistence\ObjectStorage::class,
145 'elementType' =>
'Tx_Myext_Domain_Model_Foo'
147 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'setOneToOneRelation',
'setOneToManyRelation',
'setManyToManyRelation'], [],
'',
false);
148 $mockDataMapFactory->expects($this->never())->method(
'setOneToOneRelation');
149 $mockDataMapFactory->expects($this->once())->method(
'setOneToManyRelation')->will($this->returnValue($mockColumnMap));
150 $mockDataMapFactory->expects($this->never())->method(
'setManyToManyRelation');
151 $mockDataMapFactory->_callRef(
'setRelations', $mockColumnMap, $columnConfiguration, $propertyMetaData);
159 $columnMap = new \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\ColumnMap(
'foo',
'foo');
160 $columnConfiguration = [
162 'renderType' =>
'selectSingle',
169 $propertyMetaData = [];
170 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'setOneToOneRelation',
'setOneToManyRelation',
'setManyToManyRelation'], [],
'',
false);
171 $mockDataMapFactory->expects($this->never())->method(
'setOneToOneRelation');
172 $mockDataMapFactory->expects($this->never())->method(
'setOneToManyRelation');
173 $mockDataMapFactory->expects($this->never())->method(
'setManyToManyRelation');
174 $actualColumnMap = $mockDataMapFactory->_callRef(
'setRelations', $columnMap, $columnConfiguration, $propertyMetaData);
175 $this->assertSame($columnMap::RELATION_NONE, $actualColumnMap->getTypeOfRelation());
184 'maxitems not set' => [
'',
'RELATION_HAS_MANY'],
185 'maxitems equals 1' => [
'1',
'RELATION_NONE'],
186 'maxitems higher than 1' => [
'10',
'RELATION_HAS_MANY']
197 $columnMap = new \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\ColumnMap(
'foo',
'foo');
198 if (empty($maxitems)) {
199 $columnConfiguration = [
203 $columnConfiguration = [
205 'maxitems' => $maxitems
208 $propertyMetaData = [];
209 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'setOneToOneRelation',
'setOneToManyRelation',
'setManyToManyRelation'], [],
'',
false);
210 $mockDataMapFactory->expects($this->never())->method(
'setOneToOneRelation');
211 $mockDataMapFactory->expects($this->never())->method(
'setOneToManyRelation');
212 $mockDataMapFactory->expects($this->never())->method(
'setManyToManyRelation');
213 $actualColumnMap = $mockDataMapFactory->_callRef(
'setRelations', $columnMap, $columnConfiguration, $propertyMetaData);
214 $this->assertSame($relation, $actualColumnMap->getTypeOfRelation());
222 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
223 $columnConfiguration = [
225 'foreign_table' =>
'tx_myextension_bar',
226 'MM' =>
'tx_myextension_mm'
228 $propertyMetaData = [
229 'type' => \TYPO3\CMS\Extbase\Persistence\ObjectStorage::class,
230 'elementType' =>
'Tx_Myext_Domain_Model_Foo'
232 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'setOneToOneRelation',
'setOneToManyRelation',
'setManyToManyRelation'], [],
'',
false);
233 $mockDataMapFactory->expects($this->never())->method(
'setOneToOneRelation');
234 $mockDataMapFactory->expects($this->never())->method(
'setOneToManyRelation');
235 $mockDataMapFactory->expects($this->once())->method(
'setManyToManyRelation')->will($this->returnValue($mockColumnMap));
236 $mockDataMapFactory->_callRef(
'setRelations', $mockColumnMap, $columnConfiguration, $propertyMetaData);
244 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
245 $columnConfiguration = [
247 'foreign_table' =>
'tx_myextension_righttable',
248 'MM' =>
'tx_myextension_mm'
250 $propertyMetaData = [
251 'type' => \TYPO3\CMS\Extbase\Persistence\ObjectStorage::class,
252 'elementType' =>
'Tx_Myext_Domain_Model_Foo'
254 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'setOneToOneRelation',
'setOneToManyRelation',
'setManyToManyRelation'], [],
'',
false);
255 $mockDataMapFactory->expects($this->never())->method(
'setOneToOneRelation');
256 $mockDataMapFactory->expects($this->never())->method(
'setOneToManyRelation');
257 $mockDataMapFactory->expects($this->once())->method(
'setManyToManyRelation')->will($this->returnValue($mockColumnMap));
258 $mockDataMapFactory->_callRef(
'setRelations', $mockColumnMap, $columnConfiguration, $propertyMetaData);
266 $leftColumnsDefinition = [
269 'foreign_table' =>
'tx_myextension_righttable',
270 'foreign_table_where' =>
'WHERE 1=1',
271 'MM' =>
'tx_myextension_mm',
272 'MM_table_where' =>
'WHERE 2=2'
275 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
277 $mockColumnMap->expects($this->once())->method(
'setRelationTableName')->with($this->equalTo(
'tx_myextension_mm'));
278 $mockColumnMap->expects($this->once())->method(
'setChildTableName')->with($this->equalTo(
'tx_myextension_righttable'));
279 $mockColumnMap->expects($this->once())->method(
'setChildTableWhereStatement')->with($this->equalTo(
'WHERE 1=1'));
280 $mockColumnMap->expects($this->once())->method(
'setChildSortByFieldName')->with($this->equalTo(
'sorting'));
281 $mockColumnMap->expects($this->once())->method(
'setParentKeyFieldName')->with($this->equalTo(
'uid_local'));
282 $mockColumnMap->expects($this->never())->method(
'setParentTableFieldName');
283 $mockColumnMap->expects($this->never())->method(
'setRelationTableMatchFields');
284 $mockColumnMap->expects($this->never())->method(
'setRelationTableInsertFields');
285 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'dummy'], [],
'',
false);
286 $mockDataMapFactory->_callRef(
'setManyToManyRelation', $mockColumnMap, $leftColumnsDefinition[
'rights']);
294 $rightColumnsDefinition = [
297 'foreign_table' =>
'tx_myextension_lefttable',
298 'MM' =>
'tx_myextension_mm',
299 'MM_opposite_field' =>
'rights'
302 $leftColumnsDefinition[
'rights'][
'MM_opposite_field'] =
'opposite_field';
303 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
305 $mockColumnMap->expects($this->once())->method(
'setRelationTableName')->with($this->equalTo(
'tx_myextension_mm'));
306 $mockColumnMap->expects($this->once())->method(
'setChildTableName')->with($this->equalTo(
'tx_myextension_lefttable'));
307 $mockColumnMap->expects($this->once())->method(
'setChildTableWhereStatement')->with(
null);
308 $mockColumnMap->expects($this->once())->method(
'setChildSortByFieldName')->with($this->equalTo(
'sorting_foreign'));
309 $mockColumnMap->expects($this->once())->method(
'setParentKeyFieldName')->with($this->equalTo(
'uid_foreign'));
310 $mockColumnMap->expects($this->never())->method(
'setParentTableFieldName');
311 $mockColumnMap->expects($this->never())->method(
'setRelationTableMatchFields');
312 $mockColumnMap->expects($this->never())->method(
'setRelationTableInsertFields');
313 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'dummy'], [],
'',
false);
314 $mockDataMapFactory->_callRef(
'setManyToManyRelation', $mockColumnMap, $rightColumnsDefinition[
'lefts']);
322 $leftColumnsDefinition = [
325 'foreign_table' =>
'tx_myextension_righttable',
326 'MM' =>
'tx_myextension_mm',
327 'foreign_sortby' =>
'sorting'
330 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
332 $mockColumnMap->expects($this->once())->method(
'setRelationTableName')->with($this->equalTo(
'tx_myextension_mm'));
333 $mockColumnMap->expects($this->once())->method(
'setChildTableName')->with($this->equalTo(
'tx_myextension_righttable'));
334 $mockColumnMap->expects($this->once())->method(
'setChildTableWhereStatement');
335 $mockColumnMap->expects($this->once())->method(
'setChildSortByFieldName')->with($this->equalTo(
'sorting'));
336 $mockColumnMap->expects($this->once())->method(
'setParentKeyFieldName')->with($this->equalTo(
'uid_local'));
337 $mockColumnMap->expects($this->never())->method(
'setParentTableFieldName');
338 $mockColumnMap->expects($this->never())->method(
'setRelationTableMatchFields');
339 $mockColumnMap->expects($this->never())->method(
'setRelationTableInsertFields');
340 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'getColumnsDefinition'], [],
'',
false);
341 $mockDataMapFactory->expects($this->never())->method(
'getColumnsDefinition');
342 $mockDataMapFactory->_callRef(
'setManyToManyRelation', $mockColumnMap, $leftColumnsDefinition[
'rights']);
350 $leftColumnsDefinition = [
353 'foreign_table' =>
'tx_myextension_righttable',
354 'foreign_table_where' =>
'WHERE 1=1',
355 'MM' =>
'tx_myextension_mm'
358 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
359 $mockColumnMap->expects($this->once())->method(
'setRelationTableName')->with($this->equalTo(
'tx_myextension_mm'));
360 $mockColumnMap->expects($this->once())->method(
'getRelationTableName')->will($this->returnValue(
'tx_myextension_mm'));
361 $mockColumnMap->expects($this->never())->method(
'setrelationTablePageIdColumnName');
362 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'getControlSection'], [],
'',
false);
363 $mockDataMapFactory->expects($this->once())->method(
'getControlSection')->with($this->equalTo(
'tx_myextension_mm'))->will($this->returnValue(
null));
364 $mockDataMapFactory->_callRef(
'setManyToManyRelation', $mockColumnMap, $leftColumnsDefinition[
'rights']);
372 $leftColumnsDefinition = [
375 'foreign_table' =>
'tx_myextension_righttable',
376 'foreign_table_where' =>
'WHERE 1=1',
377 'MM' =>
'tx_myextension_mm'
380 $mockColumnMap = $this->createMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class);
381 $mockColumnMap->expects($this->once())->method(
'setRelationTableName')->with($this->equalTo(
'tx_myextension_mm'));
382 $mockColumnMap->expects($this->once())->method(
'getRelationTableName')->will($this->returnValue(
'tx_myextension_mm'));
383 $mockColumnMap->expects($this->once())->method(
'setrelationTablePageIdColumnName')->with($this->equalTo(
'pid'));
384 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'getControlSection'], [],
'',
false);
385 $mockDataMapFactory->expects($this->once())->method(
'getControlSection')->with($this->equalTo(
'tx_myextension_mm'))->will($this->returnValue([
'ctrl' => [
'foo' =>
'bar']]));
386 $mockDataMapFactory->_callRef(
'setManyToManyRelation', $mockColumnMap, $leftColumnsDefinition[
'rights']);
395 'date field' => [
'date',
'date'],
396 'datetime field' => [
'datetime',
'datetime'],
397 'time field' => [
'time',
'time'],
398 'no date/datetime/time field' => [
'',
null],
410 $columnDefinition = [
416 $mockColumnMap = $this->getMockBuilder(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class)
417 ->setMethods([
'setDateTimeStorageFormat'])
418 ->disableOriginalConstructor()
421 if ($expectedValue !==
null) {
422 $mockColumnMap->expects($this->once())->method(
'setDateTimeStorageFormat')->with($this->equalTo($type));
424 $mockColumnMap->expects($this->never())->method(
'setDateTimeStorageFormat');
427 $accessibleClassName = $this->buildAccessibleProxy(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class);
428 $accessibleDataMapFactory =
new $accessibleClassName();
429 $accessibleDataMapFactory->_callRef(
'setFieldEvaluations', $mockColumnMap, $columnDefinition);
437 $this->expectException(InvalidClassException::class);
439 $mockDataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'getControlSection'], [],
'',
false);
440 $cacheMock = $this->getMockBuilder(\
TYPO3\CMS\Core\Cache\Frontend\VariableFrontend::class)
441 ->setMethods([
'get'])
442 ->disableOriginalConstructor()
444 $cacheMock->expects($this->any())->method(
'get')->will($this->returnValue(
false));
445 $mockDataMapFactory->_set(
'dataMapCache', $cacheMock);
446 $mockDataMapFactory->buildDataMap(
'UnknownObject');
454 $this->markTestSkipped(
'Incomplete mocking in a complex scenario. This should be a functional test');
458 \TYPO3\CMS\Extbase\Domain\Model\FrontendUser::class => [
460 'Tx_SampleExt_Domain_Model_LevelOne1' =>
'Tx_SampleExt_Domain_Model_LevelOne1',
461 'Tx_SampleExt_Domain_Model_LevelOne2' =>
'Tx_SampleExt_Domain_Model_LevelOne2'
464 'Tx_SampleExt_Domain_Model_LevelOne1' => [
466 'Tx_SampleExt_Domain_Model_LevelTwo1' =>
'Tx_SampleExt_Domain_Model_LevelTwo1',
467 'Tx_SampleExt_Domain_Model_LevelTwo2' =>
'Tx_SampleExt_Domain_Model_LevelTwo2'
470 'Tx_SampleExt_Domain_Model_LevelOne2' => [
476 $expectedSubclasses = [
477 'Tx_SampleExt_Domain_Model_LevelOne1',
478 'Tx_SampleExt_Domain_Model_LevelTwo1',
479 'Tx_SampleExt_Domain_Model_LevelTwo2',
480 'Tx_SampleExt_Domain_Model_LevelOne2'
484 $objectManager = $this->getMockBuilder(\
TYPO3\CMS\
Extbase\Object\ObjectManager::class)
485 ->setMethods([
'dummy'])
486 ->disableOriginalConstructor()
490 $configurationManager = $this->createMock(\
TYPO3\CMS\
Extbase\Configuration\ConfigurationManager::class);
491 $configurationManager->expects($this->once())->method(
'getConfiguration')->with(
'Framework')->will($this->returnValue($configuration));
493 $dataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'test']);
494 $dataMapFactory->_set(
'reflectionService',
new \
TYPO3\CMS\
Extbase\Reflection\ReflectionService());
495 $dataMapFactory->_set(
'objectManager', $objectManager);
496 $dataMapFactory->_set(
'configurationManager', $configurationManager);
497 $cacheMock = $this->createMock(\
TYPO3\CMS\Core\Cache\Frontend\VariableFrontend::class);
498 $cacheMock->expects($this->any())->method(
'get')->will($this->returnValue(
false));
499 $dataMapFactory->_set(
'dataMapCache', $cacheMock);
500 $dataMap = $dataMapFactory->buildDataMap(\
TYPO3\CMS\
Extbase\Domain\Model\FrontendUser::class);
501 $this->assertSame($expectedSubclasses, $dataMap->getSubclasses());
510 'Core classes' => [\TYPO3\CMS\Belog\Domain\Model\LogEntry::class,
'tx_belog_domain_model_logentry'],
511 'Core classes with namespaces and leading backslash' => [\TYPO3\CMS\Belog\Domain\Model\LogEntry::class,
'tx_belog_domain_model_logentry'],
512 'Extension classes' => [
'ExtbaseTeam\\BlogExample\\Domain\\Model\\Blog',
'tx_blogexample_domain_model_blog'],
513 'Extension classes with namespaces and leading backslash' => [
'\\ExtbaseTeam\\BlogExample\\Domain\\Model\\Blog',
'tx_blogexample_domain_model_blog'],
523 $dataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'dummy']);
524 $this->assertSame($expected, $dataMapFactory->_call(
'resolveTableName', $className));
533 $dataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'dummy']);
536 $objectManager = $this->createMock(\
TYPO3\CMS\
Extbase\Object\ObjectManager::class);
537 $columnMap = $this->getMockBuilder(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class)
538 ->setConstructorArgs([
'column',
'property'])
540 $objectManager->expects($this->once())->method(
'get')->will($this->returnValue($columnMap));
542 $dataMapFactory->_set(
'objectManager', $objectManager);
546 $dataMapFactory->_call(
'createColumnMap',
'column',
'property')
585 $dataMapFactory = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\DataMapFactory::class, [
'dummy']);
588 $columnMap = $this->getAccessibleMock(\
TYPO3\CMS\
Extbase\Persistence\Generic\Mapper\ColumnMap::class, [
'dummy'], [],
'',
false);
590 $dataMapFactory->_call(
'setType', $columnMap, $columnConfiguration);
592 $this->assertEquals($type, (
string)$columnMap->getType());
593 $this->assertEquals($internalType, (
string)$columnMap->getInternalType());