/** * @test * @author Karsten Dambekalns <*****@*****.**> */ public function mapConvertsArraysInSourceToObjectsIfTargetPropertyIsObject() { $this->mockObjectManager->expects($this->once())->method('getObject')->with('F3\\FLOW3\\Property\\MappingResults')->will($this->returnValue($this->mappingResults)); $target = new \F3\FLOW3\Fixtures\ClassWithSetters(); $source = array('property1' => array('foo' => 'bar')); $classSchema = new \F3\FLOW3\Reflection\ClassSchema('F3\\FLOW3\\Fixture\\Validation\\ClassWithSetters'); $classSchema->addProperty('property1', '\\F3\\Foo\\Bar'); $this->mockReflectionService->expects($this->once())->method('getClassSchema')->will($this->returnValue($classSchema)); $mapper = $this->getMock('F3\\FLOW3\\Property\\PropertyMapper', array('transformToObject')); $mapper->expects($this->once())->method('transformToObject')->with($source['property1'], 'F3\\Foo\\Bar', 'property1'); $mapper->injectReflectionService($this->mockReflectionService); $mapper->injectObjectManager($this->mockObjectManager); $mapper->map(array('property1'), $source, $target); }
/** * Builds class schemata from classes annotated as entities or value objects * * @param array $classNames * @return void * @author Robert Lemke <*****@*****.**> * @author Karsten Dambekalns <*****@*****.**> */ protected function buildClassSchemata(array $classNames) { foreach ($classNames as $className) { $classSchema = new \F3\FLOW3\Reflection\ClassSchema($className); if ($this->isClassTaggedWith($className, 'entity')) { $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY); $possibleRepositoryClassName = str_replace('\\Model\\', '\\Repository\\', $className) . 'Repository'; if ($this->isClassReflected($possibleRepositoryClassName)) { $classSchema->setAggregateRoot(TRUE); } } elseif ($this->isClassTaggedWith($className, 'valueobject')) { $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_VALUEOBJECT); } foreach ($this->getClassPropertyNames($className) as $propertyName) { if (!$this->isPropertyTaggedWith($className, $propertyName, 'transient') && $this->isPropertyTaggedWith($className, $propertyName, 'var')) { $classSchema->addProperty($propertyName, implode(' ', $this->getPropertyTagValues($className, $propertyName, 'var')), $this->isPropertyTaggedWith($className, $propertyName, 'lazy')); } if ($this->isPropertyTaggedWith($className, $propertyName, 'uuid')) { $classSchema->setUuidPropertyName($propertyName); } if ($this->isPropertyTaggedWith($className, $propertyName, 'identity')) { $classSchema->markAsIdentityProperty($propertyName); } } $this->classSchemata[$className] = $classSchema; } }
/** * @test * @author Karsten Dambekalns <*****@*****.**> */ public function setModelTypeResetsUuidPropertyNameAndIdentityPropertiesForValueObjects() { $classSchema = new \F3\FLOW3\Reflection\ClassSchema('SomeClass'); $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY); $classSchema->addProperty('foo', 'string'); $classSchema->addProperty('bar', 'string'); $classSchema->setUuidPropertyName('foo'); $classSchema->markAsIdentityProperty('bar'); $this->assertSame('foo', $classSchema->getUuidPropertyName()); $this->assertSame(array('bar' => 'string'), $classSchema->getIdentityProperties()); $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_VALUEOBJECT); $this->assertNull($classSchema->getUuidPropertyName()); $this->assertSame(array(), $classSchema->getIdentityProperties()); }
/** * @test * @author Karsten Dambekalns <*****@*****.**> */ public function mapSplObjectStorageCreatesSplObjectStorage() { $objectData = array(array('value' => array('mappedObject1')), array('value' => array('mappedObject2'))); $classSchema = new \F3\FLOW3\Reflection\ClassSchema('F3\\Post'); $classSchema->addProperty('firstProperty', 'SplObjectStorage'); $dataMapper = $this->getMock($this->buildAccessibleProxy('F3\\FLOW3\\Persistence\\Backend\\GenericPdo\\DataMapper'), array('mapToObject')); $dataMapper->expects($this->at(0))->method('mapToObject')->with($objectData[0]['value'])->will($this->returnValue(new \stdClass())); $dataMapper->expects($this->at(1))->method('mapToObject')->with($objectData[1]['value'])->will($this->returnValue(new \stdClass())); $dataMapper->_call('mapSplObjectStorage', $objectData); }
/** * @test * @author Karsten Dambekalns <*****@*****.**> */ public function objectsFoundInCleanPropertiesAreTraversed() { $otherClassName = 'OtherClass' . uniqid(); $fullOtherClassName = 'F3\\FLOW3\\Persistence\\Tests\\' . $otherClassName; eval('namespace F3\\FLOW3\\Persistence\\Tests; class ' . $otherClassName . ' implements \\F3\\FLOW3\\AOP\\ProxyInterface { public function FLOW3_AOP_Proxy_getProxyTargetClassName() { return \'' . $fullOtherClassName . '\';} public function FLOW3_AOP_Proxy_construct() {} public function FLOW3_AOP_Proxy_invokeJoinPoint(\\F3\\FLOW3\\AOP\\JoinPointInterface $joinPoint) {} public function FLOW3_AOP_Proxy_hasProperty($propertyName) { return TRUE; } public function FLOW3_AOP_Proxy_getProperty($propertyName) { return NULL; } public function FLOW3_AOP_Proxy_setProperty($propertyName, $value) {} public function FLOW3_Persistence_isNew() { return TRUE; } public function FLOW3_Persistence_isDirty($propertyName) { return TRUE; } public function FLOW3_Persistence_memorizeCleanState($propertyName = NULL) {} }'); $someClassName = 'SomeClass' . uniqid(); $fullSomeClassName = 'F3\\FLOW3\\Persistence\\Tests\\' . $someClassName; eval('namespace F3\\FLOW3\\Persistence\\Tests; class ' . $someClassName . ' implements \\F3\\FLOW3\\AOP\\ProxyInterface { public function FLOW3_AOP_Proxy_getProxyTargetClassName() { return \'' . $fullSomeClassName . '\';} public function FLOW3_AOP_Proxy_construct() {} public function FLOW3_AOP_Proxy_invokeJoinPoint(\\F3\\FLOW3\\AOP\\JoinPointInterface $joinPoint) {} public function FLOW3_AOP_Proxy_hasProperty($propertyName) { return TRUE; } public function FLOW3_AOP_Proxy_getProperty($propertyName) { return $this->$propertyName; } public function FLOW3_AOP_Proxy_setProperty($propertyName, $value) {} public function FLOW3_Persistence_isNew() { return TRUE; } public function FLOW3_Persistence_isDirty($propertyName) { return FALSE; } public function FLOW3_Persistence_memorizeCleanState($propertyName = NULL) {} }'); $otherAggregateRootObject = new $fullOtherClassName(); $someAggregateRootObject = new $fullSomeClassName(); $someAggregateRootObject->property = $otherAggregateRootObject; $otherClassSchema = new \F3\FLOW3\Reflection\ClassSchema($otherClassName); $otherClassSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY); $otherClassSchema->setAggregateRoot(TRUE); $someClassSchema = new \F3\FLOW3\Reflection\ClassSchema($someClassName); $someClassSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY); $someClassSchema->setAggregateRoot(TRUE); $someClassSchema->addProperty('property', $fullOtherClassName); $aggregateRootObjects = new \SplObjectStorage(); $aggregateRootObjects->attach($someAggregateRootObject); $persistenceSession = new \F3\FLOW3\Persistence\Session(); $persistenceSession->registerObject($someAggregateRootObject, ''); $backend = $this->getMock($this->buildAccessibleProxy('F3\\FLOW3\\Persistence\\Backend\\GenericPdo\\Backend'), array('createObjectRecord', 'emitPersistedNewObject', 'emitPersistedUpdatedObject')); $backend->expects($this->once())->method('createObjectRecord')->with($otherAggregateRootObject); $backend->injectPersistenceSession($persistenceSession); $backend->setAggregateRootObjects($aggregateRootObjects); $backend->_set('visitedDuringPersistence', new \SplObjectStorage()); $backend->_set('classSchemata', array($fullOtherClassName => $otherClassSchema, $fullSomeClassName => $someClassSchema)); $backend->_call('persistObjects'); }