SchemaToolTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace Doctrine\Tests\ORM\Tools;
  3. use Doctrine\ORM\Tools\SchemaTool;
  4. use Doctrine\ORM\Tools\ToolEvents;
  5. use Doctrine\ORM\Tools\Event\GenerateSchemaTableEventArgs;
  6. use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
  7. require_once __DIR__ . '/../../TestInit.php';
  8. class SchemaToolTest extends \Doctrine\Tests\OrmTestCase
  9. {
  10. public function testAddUniqueIndexForUniqueFieldAnnocation()
  11. {
  12. $em = $this->_getTestEntityManager();
  13. $schemaTool = new SchemaTool($em);
  14. $classes = array(
  15. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'),
  16. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsArticle'),
  17. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsComment'),
  18. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsEmployee'),
  19. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'),
  20. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsPhonenumber'),
  21. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'),
  22. );
  23. $schema = $schemaTool->getSchemaFromMetadata($classes);
  24. $this->assertTrue($schema->hasTable('cms_users'), "Table cms_users should exist.");
  25. $this->assertTrue($schema->getTable('cms_users')->columnsAreIndexed(array('username')), "username column should be indexed.");
  26. }
  27. public function testColumnAnnotationOptionsAttribute()
  28. {
  29. $em = $this->_getTestEntityManager();
  30. $schemaTool = new SchemaTool($em);
  31. $classes = array(
  32. $em->getClassMetadata(__NAMESPACE__ . '\\TestEntityWithColumnAnnotationOptionsAttribute'),
  33. );
  34. $schema = $schemaTool->getSchemaFromMetadata($classes);
  35. $expected = array('foo' => 'bar', 'baz' => array('key' => 'val'));
  36. $this->assertEquals($expected, $schema->getTable('TestEntityWithColumnAnnotationOptionsAttribute')->getColumn('test')->getCustomSchemaOptions(), "options annotation are passed to the columns customSchemaOptions");
  37. }
  38. /**
  39. * @group DDC-200
  40. */
  41. public function testPassColumnDefinitionToJoinColumn()
  42. {
  43. $customColumnDef = "MEDIUMINT(6) UNSIGNED NOT NULL";
  44. $em = $this->_getTestEntityManager();
  45. $schemaTool = new SchemaTool($em);
  46. $avatar = $em->getClassMetadata('Doctrine\Tests\Models\Forum\ForumAvatar');
  47. $avatar->fieldMappings['id']['columnDefinition'] = $customColumnDef;
  48. $user = $em->getClassMetadata('Doctrine\Tests\Models\Forum\ForumUser');
  49. $classes = array($avatar, $user);
  50. $schema = $schemaTool->getSchemaFromMetadata($classes);
  51. $this->assertTrue($schema->hasTable('forum_users'));
  52. $table = $schema->getTable("forum_users");
  53. $this->assertTrue($table->hasColumn('avatar_id'));
  54. $this->assertEquals($customColumnDef, $table->getColumn('avatar_id')->getColumnDefinition());
  55. }
  56. /**
  57. * @group DDC-283
  58. */
  59. public function testPostGenerateEvents()
  60. {
  61. $listener = new GenerateSchemaEventListener();
  62. $em = $this->_getTestEntityManager();
  63. $em->getEventManager()->addEventListener(
  64. array(ToolEvents::postGenerateSchemaTable, ToolEvents::postGenerateSchema), $listener
  65. );
  66. $schemaTool = new SchemaTool($em);
  67. $classes = array(
  68. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'),
  69. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsArticle'),
  70. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsComment'),
  71. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsEmployee'),
  72. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'),
  73. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsPhonenumber'),
  74. $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'),
  75. );
  76. $schema = $schemaTool->getSchemaFromMetadata($classes);
  77. $this->assertEquals(count($classes), $listener->tableCalls);
  78. $this->assertTrue($listener->schemaCalled);
  79. }
  80. }
  81. /**
  82. * @Entity
  83. */
  84. class TestEntityWithColumnAnnotationOptionsAttribute
  85. {
  86. /** @Id @Column */
  87. private $id;
  88. /**
  89. * @Column(type="string", options={"foo": "bar", "baz": {"key": "val"}})
  90. */
  91. private $test;
  92. }
  93. class GenerateSchemaEventListener
  94. {
  95. public $tableCalls = 0;
  96. public $schemaCalled = false;
  97. public function postGenerateSchemaTable(GenerateSchemaTableEventArgs $eventArgs)
  98. {
  99. $this->tableCalls++;
  100. }
  101. public function postGenerateSchema(GenerateSchemaEventArgs $eventArgs)
  102. {
  103. $this->schemaCalled = true;
  104. }
  105. }