ClassMetadataFactoryTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. namespace Doctrine\Tests\ORM\Mapping;
  3. use Doctrine\Tests\Mocks\MetadataDriverMock;
  4. use Doctrine\Tests\Mocks\DatabasePlatformMock;
  5. use Doctrine\Tests\Mocks\EntityManagerMock;
  6. use Doctrine\Tests\Mocks\ConnectionMock;
  7. use Doctrine\Tests\Mocks\DriverMock;
  8. use Doctrine\ORM\Mapping\ClassMetadata;
  9. use Doctrine\Common\EventManager;
  10. use Doctrine\ORM\Mapping\ClassMetadataFactory;
  11. require_once __DIR__ . '/../../TestInit.php';
  12. class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase
  13. {
  14. public function testGetMetadataForSingleClass()
  15. {
  16. $mockDriver = new MetadataDriverMock();
  17. $entityManager = $this->_createEntityManager($mockDriver);
  18. $conn = $entityManager->getConnection();
  19. $mockPlatform = $conn->getDatabasePlatform();
  20. $mockPlatform->setPrefersSequences(true);
  21. $mockPlatform->setPrefersIdentityColumns(false);
  22. // Self-made metadata
  23. $cm1 = new ClassMetadata('Doctrine\Tests\ORM\Mapping\TestEntity1');
  24. $cm1->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
  25. $cm1->setPrimaryTable(array('name' => '`group`'));
  26. // Add a mapped field
  27. $cm1->mapField(array('fieldName' => 'name', 'type' => 'varchar'));
  28. // Add a mapped field
  29. $cm1->mapField(array('fieldName' => 'id', 'type' => 'integer', 'id' => true));
  30. // and a mapped association
  31. $cm1->mapOneToOne(array('fieldName' => 'other', 'targetEntity' => 'TestEntity1', 'mappedBy' => 'this'));
  32. // and an association on the owning side
  33. $joinColumns = array(
  34. array('name' => 'other_id', 'referencedColumnName' => 'id')
  35. );
  36. $cm1->mapOneToOne(array('fieldName' => 'association', 'targetEntity' => 'TestEntity1', 'joinColumns' => $joinColumns));
  37. // and an id generator type
  38. $cm1->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO);
  39. // SUT
  40. $cmf = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
  41. $cmf->setEntityManager($entityManager);
  42. $cmf->setMetadataFor('Doctrine\Tests\ORM\Mapping\TestEntity1', $cm1);
  43. // Prechecks
  44. $this->assertEquals(array(), $cm1->parentClasses);
  45. $this->assertEquals(ClassMetadata::INHERITANCE_TYPE_NONE, $cm1->inheritanceType);
  46. $this->assertTrue($cm1->hasField('name'));
  47. $this->assertEquals(2, count($cm1->associationMappings));
  48. $this->assertEquals(ClassMetadata::GENERATOR_TYPE_AUTO, $cm1->generatorType);
  49. $this->assertEquals('group', $cm1->table['name']);
  50. // Go
  51. $cmMap1 = $cmf->getMetadataFor('Doctrine\Tests\ORM\Mapping\TestEntity1');
  52. $this->assertSame($cm1, $cmMap1);
  53. $this->assertEquals('group', $cmMap1->table['name']);
  54. $this->assertTrue($cmMap1->table['quoted']);
  55. $this->assertEquals(array(), $cmMap1->parentClasses);
  56. $this->assertTrue($cmMap1->hasField('name'));
  57. }
  58. public function testHasGetMetadata_NamespaceSeperatorIsNotNormalized()
  59. {
  60. require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php";
  61. $metadataDriver = $this->createAnnotationDriver(array(__DIR__ . '/../../Models/Global/'));
  62. $entityManager = $this->_createEntityManager($metadataDriver);
  63. $mf = $entityManager->getMetadataFactory();
  64. $m1 = $mf->getMetadataFor("DoctrineGlobal_Article");
  65. $h1 = $mf->hasMetadataFor("DoctrineGlobal_Article");
  66. $h2 = $mf->hasMetadataFor("\DoctrineGlobal_Article");
  67. $m2 = $mf->getMetadataFor("\DoctrineGlobal_Article");
  68. $this->assertNotSame($m1, $m2);
  69. $this->assertFalse($h2);
  70. $this->assertTrue($h1);
  71. }
  72. /**
  73. * @group DDC-1512
  74. */
  75. public function testIsTransient()
  76. {
  77. $cmf = new ClassMetadataFactory();
  78. $driver = $this->getMock('Doctrine\ORM\Mapping\Driver\Driver');
  79. $driver->expects($this->at(0))
  80. ->method('isTransient')
  81. ->with($this->equalTo('Doctrine\Tests\Models\CMS\CmsUser'))
  82. ->will($this->returnValue(true));
  83. $driver->expects($this->at(1))
  84. ->method('isTransient')
  85. ->with($this->equalTo('Doctrine\Tests\Models\CMS\CmsArticle'))
  86. ->will($this->returnValue(false));
  87. $em = $this->_createEntityManager($driver);
  88. $this->assertTrue($em->getMetadataFactory()->isTransient('Doctrine\Tests\Models\CMS\CmsUser'));
  89. $this->assertFalse($em->getMetadataFactory()->isTransient('Doctrine\Tests\Models\CMS\CmsArticle'));
  90. }
  91. /**
  92. * @group DDC-1512
  93. */
  94. public function testIsTransientEntityNamespace()
  95. {
  96. $cmf = new ClassMetadataFactory();
  97. $driver = $this->getMock('Doctrine\ORM\Mapping\Driver\Driver');
  98. $driver->expects($this->at(0))
  99. ->method('isTransient')
  100. ->with($this->equalTo('Doctrine\Tests\Models\CMS\CmsUser'))
  101. ->will($this->returnValue(true));
  102. $driver->expects($this->at(1))
  103. ->method('isTransient')
  104. ->with($this->equalTo('Doctrine\Tests\Models\CMS\CmsArticle'))
  105. ->will($this->returnValue(false));
  106. $em = $this->_createEntityManager($driver);
  107. $em->getConfiguration()->addEntityNamespace('CMS', 'Doctrine\Tests\Models\CMS');
  108. $this->assertTrue($em->getMetadataFactory()->isTransient('CMS:CmsUser'));
  109. $this->assertFalse($em->getMetadataFactory()->isTransient('CMS:CmsArticle'));
  110. }
  111. protected function _createEntityManager($metadataDriver)
  112. {
  113. $driverMock = new DriverMock();
  114. $config = new \Doctrine\ORM\Configuration();
  115. $config->setProxyDir(__DIR__ . '/../../Proxies');
  116. $config->setProxyNamespace('Doctrine\Tests\Proxies');
  117. $eventManager = new EventManager();
  118. $conn = new ConnectionMock(array(), $driverMock, $config, $eventManager);
  119. $mockDriver = new MetadataDriverMock();
  120. $config->setMetadataDriverImpl($metadataDriver);
  121. return EntityManagerMock::create($conn, $config, $eventManager);
  122. }
  123. }
  124. /* Test subject class with overriden factory method for mocking purposes */
  125. class ClassMetadataFactoryTestSubject extends \Doctrine\ORM\Mapping\ClassMetadataFactory
  126. {
  127. private $mockMetadata = array();
  128. private $requestedClasses = array();
  129. /** @override */
  130. protected function newClassMetadataInstance($className)
  131. {
  132. $this->requestedClasses[] = $className;
  133. if ( ! isset($this->mockMetadata[$className])) {
  134. throw new InvalidArgumentException("No mock metadata found for class $className.");
  135. }
  136. return $this->mockMetadata[$className];
  137. }
  138. public function setMetadataForClass($className, $metadata)
  139. {
  140. $this->mockMetadata[$className] = $metadata;
  141. }
  142. public function getRequestedClasses()
  143. {
  144. return $this->requestedClasses;
  145. }
  146. }
  147. class TestEntity1
  148. {
  149. private $id;
  150. private $name;
  151. private $other;
  152. private $association;
  153. }