1
0
mirror of synced 2025-02-03 13:59:27 +03:00
doctrine2/tests/Doctrine/Tests/ORM/Tools/SchemaToolTest.php

213 lines
7.2 KiB
PHP
Raw Normal View History

<?php
namespace Doctrine\Tests\ORM\Tools;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use Doctrine\ORM\Tools\Event\GenerateSchemaTableEventArgs;
use Doctrine\ORM\Tools\SchemaTool;
use Doctrine\ORM\Tools\ToolEvents;
use Doctrine\ORM\Tools\Event\GenerateSchemaTableEventArgs;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
class SchemaToolTest extends \Doctrine\Tests\OrmTestCase
{
2013-03-11 00:08:58 +00:00
public function testAddUniqueIndexForUniqueFieldAnnotation()
{
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$classes = array(
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsArticle'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsComment'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsEmployee'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsPhonenumber'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'),
);
$schema = $schemaTool->getSchemaFromMetadata($classes);
$this->assertTrue($schema->hasTable('cms_users'), "Table cms_users should exist.");
$this->assertTrue($schema->getTable('cms_users')->columnsAreIndexed(array('username')), "username column should be indexed.");
}
public function testAnnotationOptionsAttribute()
{
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$classes = array(
$em->getClassMetadata(__NAMESPACE__ . '\\TestEntityWithAnnotationOptionsAttribute'),
);
$schema = $schemaTool->getSchemaFromMetadata($classes);
$expected = array('foo' => 'bar', 'baz' => array('key' => 'val'));
2012-12-01 19:41:51 +01:00
$this->assertEquals($expected, $schema->getTable('TestEntityWithAnnotationOptionsAttribute')->getOptions(), "options annotation are passed to the tables options");
$this->assertEquals($expected, $schema->getTable('TestEntityWithAnnotationOptionsAttribute')->getColumn('test')->getCustomSchemaOptions(), "options annotation are passed to the columns customSchemaOptions");
}
/**
* @group DDC-200
*/
public function testPassColumnDefinitionToJoinColumn()
{
$customColumnDef = "MEDIUMINT(6) UNSIGNED NOT NULL";
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$avatar = $em->getClassMetadata('Doctrine\Tests\Models\Forum\ForumAvatar');
$avatar->fieldMappings['id']['columnDefinition'] = $customColumnDef;
$user = $em->getClassMetadata('Doctrine\Tests\Models\Forum\ForumUser');
$classes = array($avatar, $user);
$schema = $schemaTool->getSchemaFromMetadata($classes);
$this->assertTrue($schema->hasTable('forum_users'));
$table = $schema->getTable("forum_users");
$this->assertTrue($table->hasColumn('avatar_id'));
$this->assertEquals($customColumnDef, $table->getColumn('avatar_id')->getColumnDefinition());
}
/**
* @group DDC-283
*/
public function testPostGenerateEvents()
{
$listener = new GenerateSchemaEventListener();
$em = $this->_getTestEntityManager();
$em->getEventManager()->addEventListener(
array(ToolEvents::postGenerateSchemaTable, ToolEvents::postGenerateSchema), $listener
);
$schemaTool = new SchemaTool($em);
$classes = array(
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsArticle'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsComment'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsEmployee'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsPhonenumber'),
$em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'),
);
$schema = $schemaTool->getSchemaFromMetadata($classes);
$this->assertEquals(count($classes), $listener->tableCalls);
$this->assertTrue($listener->schemaCalled);
}
public function testNullDefaultNotAddedToCustomSchemaOptions()
{
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$classes = array(
$em->getClassMetadata('Doctrine\Tests\Models\NullDefault\NullDefaultColumn'),
);
$customSchemaOptions = $schemaTool->getSchemaFromMetadata($classes)
2014-12-08 01:34:30 +01:00
->getTable('NullDefaultColumn')
->getColumn('nullDefault')
->getCustomSchemaOptions();
$this->assertSame(array(), $customSchemaOptions);
}
2015-04-08 10:49:21 +01:00
/**
* @group DDC-3671
*/
public function testSchemaHasProperIndexesFromUniqueConstraintAnnotation()
{
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$classes = [
$em->getClassMetadata(__NAMESPACE__ . '\\UniqueConstraintAnnotationModel'),
];
$schema = $schemaTool->getSchemaFromMetadata($classes);
$this->assertTrue($schema->hasTable('unique_constraint_annotation_table'));
$table = $schema->getTable('unique_constraint_annotation_table');
$this->assertEquals(2, count($table->getIndexes()));
$this->assertTrue($table->hasIndex('primary'));
$this->assertTrue($table->hasIndex('uniq_hash'));
}
public function testSetDiscriminatorColumnWithoutLength()
{
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$metadata = $em->getClassMetadata(__NAMESPACE__ . '\\FirstEntity');
$metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE);
$metadata->setDiscriminatorColumn(['name' => 'discriminator', 'type' => 'string']);
$schema = $schemaTool->getSchemaFromMetadata([$metadata]);
$this->assertTrue($schema->hasTable('first_entity'));
$table = $schema->getTable('first_entity');
$this->assertTrue($table->hasColumn('discriminator'));
$column = $table->getColumn('discriminator');
$this->assertEquals(255, $column->getLength());
}
}
/**
* @Entity
* @Table(options={"foo": "bar", "baz": {"key": "val"}})
*/
class TestEntityWithAnnotationOptionsAttribute
{
/** @Id @Column */
private $id;
/**
* @Column(type="string", options={"foo": "bar", "baz": {"key": "val"}})
*/
private $test;
}
class GenerateSchemaEventListener
{
public $tableCalls = 0;
public $schemaCalled = false;
public function postGenerateSchemaTable(GenerateSchemaTableEventArgs $eventArgs)
{
$this->tableCalls++;
}
public function postGenerateSchema(GenerateSchemaEventArgs $eventArgs)
{
$this->schemaCalled = true;
}
}
2015-04-08 10:49:21 +01:00
/**
* @Entity
* @Table(name="unique_constraint_annotation_table", uniqueConstraints={
* @UniqueConstraint(name="uniq_hash", columns={"hash"})
* })
*/
class UniqueConstraintAnnotationModel
{
/** @Id @Column */
private $id;
/**
* @Column(name="hash", type="string", length=8, nullable=false, unique=true)
*/
private $hash;
}