getDoctrineDriver()->loadMetadataForClass($refClass); } public function testMetadataForEmbedded() { $refClass = new \ReflectionClass(BlogPostWithEmbedded::class); $meta = $this->getDoctrineDriver()->loadMetadataForClass($refClass); self::assertNotNull($meta); } public function testTypelessPropertyIsGivenTypeFromDoctrineMetadata() { $metadata = $this->getMetadata(); self::assertEquals( ['name' => 'DateTime', 'params' => []], $metadata->propertyMetadata['createdAt']->type ); } public function testSingleValuedAssociationIsProperlyHinted() { $metadata = $this->getMetadata(); self::assertEquals( ['name' => 'JMS\Serializer\Tests\Fixtures\Doctrine\Author', 'params' => []], $metadata->propertyMetadata['author']->type ); } public function testMultiValuedAssociationIsProperlyHinted() { $metadata = $this->getMetadata(); self::assertEquals( [ 'name' => 'ArrayCollection', 'params' => [ ['name' => 'JMS\Serializer\Tests\Fixtures\Doctrine\Comment', 'params' => []], ], ], $metadata->propertyMetadata['comments']->type ); } public function testTypeGuessByDoctrineIsOverwrittenByDelegateDriver() { $metadata = $this->getMetadata(); // This would be guessed as boolean but we've overriden it to integer self::assertEquals( ['name' => 'integer', 'params' => []], $metadata->propertyMetadata['published']->type ); } public function testUnknownDoctrineTypeDoesNotResultInAGuess() { $metadata = $this->getMetadata(); self::assertNull($metadata->propertyMetadata['slug']->type); } public function testNonDoctrineEntityClassIsNotModified() { // Note: Using regular BlogPost fixture here instead of Doctrine fixture // because it has no Doctrine metadata. $refClass = new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost'); $plainMetadata = $this->getAnnotationDriver()->loadMetadataForClass($refClass); $doctrineMetadata = $this->getDoctrineDriver()->loadMetadataForClass($refClass); // Do not compare timestamps if (abs($doctrineMetadata->createdAt - $plainMetadata->createdAt) < 2) { $plainMetadata->createdAt = $doctrineMetadata->createdAt; } self::assertEquals($plainMetadata, $doctrineMetadata); } public function testExcludePropertyNoPublicAccessorException() { $first = $this->getAnnotationDriver() ->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\ExcludePublicAccessor')); self::assertArrayHasKey('id', $first->propertyMetadata); self::assertArrayNotHasKey('iShallNotBeAccessed', $first->propertyMetadata); } public function testVirtualPropertiesAreNotModified() { $doctrineMetadata = $this->getMetadata(); self::assertNull($doctrineMetadata->propertyMetadata['ref']->type); } public function testGuidPropertyIsGivenStringType() { $metadata = $this->getMetadata(); self::assertEquals( ['name' => 'string', 'params' => []], $metadata->propertyMetadata['id']->type ); } protected function getEntityManager() { $config = new Configuration(); $config->setProxyDir(sys_get_temp_dir() . '/JMSDoctrineTestProxies'); $config->setProxyNamespace('JMS\Tests\Proxies'); $config->setMetadataDriverImpl( new DoctrineDriver(new AnnotationReader(), __DIR__ . '/../../Fixtures/Doctrine') ); $conn = [ 'driver' => 'pdo_sqlite', 'memory' => true, ]; return EntityManager::create($conn, $config); } public function getAnnotationDriver() { return new AnnotationDriver(new AnnotationReader(), new IdenticalPropertyNamingStrategy()); } protected function getDoctrineDriver() { $registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry')->getMock(); $registry->expects($this->atLeastOnce()) ->method('getManagerForClass') ->will($this->returnValue($this->getEntityManager())); return new DoctrineTypeDriver( $this->getAnnotationDriver(), $registry ); } }