3 namespace Doctrine\Tests\ORM\Tools;
5 use Doctrine\ORM\Tools\SchemaTool;
6 use Doctrine\ORM\Tools\ToolEvents;
7 use Doctrine\ORM\Tools\Event\GenerateSchemaTableEventArgs;
8 use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
10 require_once __DIR__ . '/../../TestInit.php';
12 class SchemaToolTest extends \Doctrine\Tests\OrmTestCase
14 public function testAddUniqueIndexForUniqueFieldAnnocation()
16 $em = $this->_getTestEntityManager();
17 $schemaTool = new SchemaTool($em);
20 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'),
21 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsArticle'),
22 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsComment'),
23 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsEmployee'),
24 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'),
25 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsPhonenumber'),
26 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'),
29 $schema = $schemaTool->getSchemaFromMetadata($classes);
31 $this->assertTrue($schema->hasTable('cms_users'), "Table cms_users should exist.");
32 $this->assertTrue($schema->getTable('cms_users')->columnsAreIndexed(array('username')), "username column should be indexed.");
35 public function testAnnotationOptionsAttribute()
37 $em = $this->_getTestEntityManager();
38 $schemaTool = new SchemaTool($em);
41 $em->getClassMetadata(__NAMESPACE__ . '\\TestEntityWithAnnotationOptionsAttribute'),
44 $schema = $schemaTool->getSchemaFromMetadata($classes);
46 $expected = array('foo' => 'bar', 'baz' => array('key' => 'val'));
48 $this->assertEquals($expected, $schema->getTable('TestEntityWithAnnotationOptionsAttribute')->getOptions(), "options annotation are passed to the tables optionss");
49 $this->assertEquals($expected, $schema->getTable('TestEntityWithAnnotationOptionsAttribute')->getColumn('test')->getCustomSchemaOptions(), "options annotation are passed to the columns customSchemaOptions");
55 public function testPassColumnDefinitionToJoinColumn()
57 $customColumnDef = "MEDIUMINT(6) UNSIGNED NOT NULL";
59 $em = $this->_getTestEntityManager();
60 $schemaTool = new SchemaTool($em);
62 $avatar = $em->getClassMetadata('Doctrine\Tests\Models\Forum\ForumAvatar');
63 $avatar->fieldMappings['id']['columnDefinition'] = $customColumnDef;
64 $user = $em->getClassMetadata('Doctrine\Tests\Models\Forum\ForumUser');
66 $classes = array($avatar, $user);
68 $schema = $schemaTool->getSchemaFromMetadata($classes);
70 $this->assertTrue($schema->hasTable('forum_users'));
71 $table = $schema->getTable("forum_users");
72 $this->assertTrue($table->hasColumn('avatar_id'));
73 $this->assertEquals($customColumnDef, $table->getColumn('avatar_id')->getColumnDefinition());
79 public function testPostGenerateEvents()
81 $listener = new GenerateSchemaEventListener();
83 $em = $this->_getTestEntityManager();
84 $em->getEventManager()->addEventListener(
85 array(ToolEvents::postGenerateSchemaTable, ToolEvents::postGenerateSchema), $listener
87 $schemaTool = new SchemaTool($em);
90 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'),
91 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsArticle'),
92 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsComment'),
93 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsEmployee'),
94 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'),
95 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsPhonenumber'),
96 $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'),
99 $schema = $schemaTool->getSchemaFromMetadata($classes);
101 $this->assertEquals(count($classes), $listener->tableCalls);
102 $this->assertTrue($listener->schemaCalled);
108 * @Table(options={"foo": "bar", "baz": {"key": "val"}})
110 class TestEntityWithAnnotationOptionsAttribute
116 * @Column(type="string", options={"foo": "bar", "baz": {"key": "val"}})
121 class GenerateSchemaEventListener
123 public $tableCalls = 0;
124 public $schemaCalled = false;
126 public function postGenerateSchemaTable(GenerateSchemaTableEventArgs $eventArgs)
131 public function postGenerateSchema(GenerateSchemaEventArgs $eventArgs)
133 $this->schemaCalled = true;