123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- <?php
-
- namespace Doctrine\Tests\DBAL\Schema;
-
- require_once __DIR__ . '/../../TestInit.php';
-
- use Doctrine\DBAL\Schema\Schema;
- use Doctrine\DBAL\Schema\Table;
- use Doctrine\DBAL\Schema\TableBuilder;
- use Doctrine\DBAL\Schema\Column;
- use Doctrine\DBAL\Schema\Index;
- use Doctrine\DBAL\Schema\ForeignKeyConstraint;
- use Doctrine\DBAL\Types\Type;
-
- class TableTest extends \PHPUnit_Framework_TestCase
- {
- public function testCreateWithInvalidTableName()
- {
- $this->setExpectedException('Doctrine\DBAL\DBALException');
- $table = new \Doctrine\DBAL\Schema\Table('');
- }
-
- public function testGetName()
- {
- $table = new Table("foo", array(), array(), array());
- $this->assertEquals("foo", $table->getName());
- }
-
- public function testColumns()
- {
- $type = Type::getType('integer');
- $columns = array();
- $columns[] = new Column("foo", $type);
- $columns[] = new Column("bar", $type);
- $table = new Table("foo", $columns, array(), array());
-
- $this->assertTrue($table->hasColumn("foo"));
- $this->assertTrue($table->hasColumn("bar"));
- $this->assertFalse($table->hasColumn("baz"));
-
- $this->assertInstanceOf('Doctrine\DBAL\Schema\Column', $table->getColumn("foo"));
- $this->assertInstanceOf('Doctrine\DBAL\Schema\Column', $table->getColumn("bar"));
-
- $this->assertEquals(2, count($table->getColumns()));
- }
-
- public function testColumnsCaseInsensitive()
- {
- $table = new Table("foo");
- $column = $table->addColumn('Foo', 'integer');
-
- $this->assertTrue($table->hasColumn('Foo'));
- $this->assertTrue($table->hasColumn('foo'));
- $this->assertTrue($table->hasColumn('FOO'));
-
- $this->assertSame($column, $table->getColumn('Foo'));
- $this->assertSame($column, $table->getColumn('foo'));
- $this->assertSame($column, $table->getColumn('FOO'));
- }
-
- public function testCreateColumn()
- {
- $type = Type::getType('integer');
-
- $table = new Table("foo");
-
- $this->assertFalse($table->hasColumn("bar"));
- $table->addColumn("bar", 'integer');
- $this->assertTrue($table->hasColumn("bar"));
- $this->assertSame($type, $table->getColumn("bar")->getType());
- }
-
- public function testDropColumn()
- {
- $type = Type::getType('integer');
- $columns = array();
- $columns[] = new Column("foo", $type);
- $columns[] = new Column("bar", $type);
- $table = new Table("foo", $columns, array(), array());
-
- $this->assertTrue($table->hasColumn("foo"));
- $this->assertTrue($table->hasColumn("bar"));
-
- $table->dropColumn("foo")->dropColumn("bar");
-
- $this->assertFalse($table->hasColumn("foo"));
- $this->assertFalse($table->hasColumn("bar"));
- }
-
- public function testGetUnknownColumnThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $table = new Table("foo", array(), array(), array());
- $table->getColumn('unknown');
- }
-
- public function testAddColumnTwiceThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $type = \Doctrine\DBAL\Types\Type::getType('integer');
- $columns = array();
- $columns[] = new Column("foo", $type);
- $columns[] = new Column("foo", $type);
- $table = new Table("foo", $columns, array(), array());
- }
-
- public function testCreateIndex()
- {
- $type = \Doctrine\DBAL\Types\Type::getType('integer');
- $columns = array(new Column("foo", $type), new Column("bar", $type), new Column("baz", $type));
- $table = new Table("foo", $columns);
-
- $table->addIndex(array("foo", "bar"), "foo_foo_bar_idx");
- $table->addUniqueIndex(array("bar", "baz"), "foo_bar_baz_uniq");
-
- $this->assertTrue($table->hasIndex("foo_foo_bar_idx"));
- $this->assertTrue($table->hasIndex("foo_bar_baz_uniq"));
- }
-
- public function testIndexCaseInsensitive()
- {
- $type = \Doctrine\DBAL\Types\Type::getType('integer');
- $columns = array(
- new Column("foo", $type),
- new Column("bar", $type),
- new Column("baz", $type)
- );
- $table = new Table("foo", $columns);
-
- $table->addIndex(array("foo", "bar", "baz"), "Foo_Idx");
-
- $this->assertTrue($table->hasIndex('foo_idx'));
- $this->assertTrue($table->hasIndex('Foo_Idx'));
- $this->assertTrue($table->hasIndex('FOO_IDX'));
- }
-
- public function testAddIndexes()
- {
- $type = \Doctrine\DBAL\Types\Type::getType('integer');
- $columns = array(
- new Column("foo", $type),
- new Column("bar", $type),
- );
- $indexes = array(
- new Index("the_primary", array("foo"), true, true),
- new Index("bar_idx", array("bar"), false, false),
- );
- $table = new Table("foo", $columns, $indexes, array());
-
- $this->assertTrue($table->hasIndex("the_primary"));
- $this->assertTrue($table->hasIndex("bar_idx"));
- $this->assertFalse($table->hasIndex("some_idx"));
-
- $this->assertInstanceOf('Doctrine\DBAL\Schema\Index', $table->getPrimaryKey());
- $this->assertInstanceOf('Doctrine\DBAL\Schema\Index', $table->getIndex('the_primary'));
- $this->assertInstanceOf('Doctrine\DBAL\Schema\Index', $table->getIndex('bar_idx'));
- }
-
- public function testGetUnknownIndexThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $table = new Table("foo", array(), array(), array());
- $table->getIndex("unknownIndex");
- }
-
- public function testAddTwoPrimaryThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $type = \Doctrine\DBAL\Types\Type::getType('integer');
- $columns = array(new Column("foo", $type), new Column("bar", $type));
- $indexes = array(
- new Index("the_primary", array("foo"), true, true),
- new Index("other_primary", array("bar"), true, true),
- );
- $table = new Table("foo", $columns, $indexes, array());
- }
-
- public function testAddTwoIndexesWithSameNameThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $type = \Doctrine\DBAL\Types\Type::getType('integer');
- $columns = array(new Column("foo", $type), new Column("bar", $type));
- $indexes = array(
- new Index("an_idx", array("foo"), false, false),
- new Index("an_idx", array("bar"), false, false),
- );
- $table = new Table("foo", $columns, $indexes, array());
- }
-
- public function testConstraints()
- {
- $constraint = new ForeignKeyConstraint(array(), "foo", array());
-
- $tableA = new Table("foo", array(), array(), array($constraint));
- $constraints = $tableA->getForeignKeys();
-
- $this->assertEquals(1, count($constraints));
- $this->assertSame($constraint, array_shift($constraints));
- }
-
- public function testOptions()
- {
- $table = new Table("foo", array(), array(), array(), false, array("foo" => "bar"));
-
- $this->assertTrue($table->hasOption("foo"));
- $this->assertEquals("bar", $table->getOption("foo"));
- }
-
- public function testBuilderSetPrimaryKey()
- {
- $table = new Table("foo");
-
- $table->addColumn("bar", 'integer');
- $table->setPrimaryKey(array("bar"));
-
- $this->assertTrue($table->hasIndex("primary"));
- $this->assertInstanceOf('Doctrine\DBAL\Schema\Index', $table->getPrimaryKey());
- $this->assertTrue($table->getIndex("primary")->isUnique());
- $this->assertTrue($table->getIndex("primary")->isPrimary());
- }
-
- public function testBuilderAddUniqueIndex()
- {
- $table = new Table("foo");
-
- $table->addColumn("bar", 'integer');
- $table->addUniqueIndex(array("bar"), "my_idx");
-
- $this->assertTrue($table->hasIndex("my_idx"));
- $this->assertTrue($table->getIndex("my_idx")->isUnique());
- $this->assertFalse($table->getIndex("my_idx")->isPrimary());
- }
-
- public function testBuilderAddIndex()
- {
- $table = new Table("foo");
-
- $table->addColumn("bar", 'integer');
- $table->addIndex(array("bar"), "my_idx");
-
- $this->assertTrue($table->hasIndex("my_idx"));
- $this->assertFalse($table->getIndex("my_idx")->isUnique());
- $this->assertFalse($table->getIndex("my_idx")->isPrimary());
- }
-
- public function testBuilderAddIndexWithInvalidNameThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $table = new Table("foo");
- $table->addColumn("bar",'integer');
- $table->addIndex(array("bar"), "invalid name %&/");
- }
-
- public function testBuilderAddIndexWithUnknownColumnThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $table = new Table("foo");
- $table->addIndex(array("bar"), "invalidName");
- }
-
- public function testBuilderOptions()
- {
- $table = new Table("foo");
- $table->addOption("foo", "bar");
- $this->assertTrue($table->hasOption("foo"));
- $this->assertEquals("bar", $table->getOption("foo"));
- }
-
- public function testAddForeignKeyConstraint_UnknownLocalColumn_ThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $table = new Table("foo");
- $table->addColumn("id", 'integer');
-
- $foreignTable = new Table("bar");
- $foreignTable->addColumn("id", 'integer');
-
- $table->addForeignKeyConstraint($foreignTable, array("foo"), array("id"));
- }
-
- public function testAddForeignKeyConstraint_UnknownForeignColumn_ThrowsException()
- {
- $this->setExpectedException("Doctrine\DBAL\Schema\SchemaException");
-
- $table = new Table("foo");
- $table->addColumn("id", 'integer');
-
- $foreignTable = new Table("bar");
- $foreignTable->addColumn("id", 'integer');
-
- $table->addForeignKeyConstraint($foreignTable, array("id"), array("foo"));
- }
-
- public function testAddForeignKeyConstraint()
- {
- $table = new Table("foo");
- $table->addColumn("id", 'integer');
-
- $foreignTable = new Table("bar");
- $foreignTable->addColumn("id", 'integer');
-
- $table->addForeignKeyConstraint($foreignTable, array("id"), array("id"), array("foo" => "bar"));
-
- $constraints = $table->getForeignKeys();
- $this->assertEquals(1, count($constraints));
- $constraint = current($constraints);
-
- $this->assertInstanceOf('Doctrine\DBAL\Schema\ForeignKeyConstraint', $constraint);
-
- $this->assertTrue($constraint->hasOption("foo"));
- $this->assertEquals("bar", $constraint->getOption("foo"));
- }
-
- public function testAddIndexWithCaseSensitiveColumnProblem()
- {
- $table = new Table("foo");
- $table->addColumn("id", 'integer');
-
- $table->addIndex(array("ID"), "my_idx");
-
- $this->assertTrue($table->hasIndex('my_idx'));
- $this->assertEquals(array("ID"), $table->getIndex("my_idx")->getColumns());
- $this->assertTrue($table->getIndex('my_idx')->spansColumns(array('id')));
- }
-
- public function testAddPrimaryKey_ColumnsAreExplicitlySetToNotNull()
- {
- $table = new Table("foo");
- $column = $table->addColumn("id", 'integer', array('notnull' => false));
-
- $this->assertFalse($column->getNotnull());
-
- $table->setPrimaryKey(array('id'));
-
- $this->assertTrue($column->getNotnull());
- }
-
- /**
- * @group DDC-133
- */
- public function testAllowImplicitSchemaTableInAutogeneratedIndexNames()
- {
- $table = new Table("foo.bar");
- $table->addColumn('baz', 'integer', array());
- $table->addIndex(array('baz'));
-
- $this->assertEquals(1, count($table->getIndexes()));
- }
-
- /**
- * @group DBAL-50
- */
- public function testAddIndexTwice_IgnoreSecond()
- {
- $table = new Table("foo.bar");
- $table->addColumn('baz', 'integer', array());
- $table->addIndex(array('baz'));
- $table->addIndex(array('baz'));
-
- $this->assertEquals(1, count($table->getIndexes()));
- }
-
- /**
- * @group DBAL-50
- */
- public function testAddForeignKeyIndexImplicitly()
- {
- $table = new Table("foo");
- $table->addColumn("id", 'integer');
-
- $foreignTable = new Table("bar");
- $foreignTable->addColumn("id", 'integer');
-
- $table->addForeignKeyConstraint($foreignTable, array("id"), array("id"), array("foo" => "bar"));
-
- $indexes = $table->getIndexes();
- $this->assertEquals(1, count($indexes));
- $index = current($indexes);
-
- $this->assertTrue($table->hasIndex($index->getName()));
- $this->assertEquals(array('id'), $index->getColumns());
- }
-
- /**
- * @group DBAL-50
- */
- public function testOverruleIndex()
- {
- $table = new Table("bar");
- $table->addColumn('baz', 'integer', array());
- $table->addIndex(array('baz'));
-
- $indexes = $table->getIndexes();
- $this->assertEquals(1, count($indexes));
- $index = current($indexes);
-
- $table->addUniqueIndex(array('baz'));
- $this->assertEquals(1, count($table->getIndexes()));
- $this->assertFalse($table->hasIndex($index->getName()));
- }
-
- public function testPrimaryKeyOverrulesUniqueIndex()
- {
- $table = new Table("bar");
- $table->addColumn('baz', 'integer', array());
- $table->addUniqueIndex(array('baz'));
-
- $table->setPrimaryKey(array('baz'));
-
- $indexes = $table->getIndexes();
- $this->assertEquals(1, count($indexes), "Table should only contain the primary key table index, not the unique one anymore, because it was overruled.");
-
- $index = current($indexes);
- $this->assertTrue($index->isPrimary());
- }
-
- /**
- * @group DBAL-64
- */
- public function testQuotedTableName()
- {
- $table = new Table("`bar`");
-
- $mysqlPlatform = new \Doctrine\DBAL\Platforms\MySqlPlatform();
- $sqlitePlatform = new \Doctrine\DBAL\Platforms\SqlitePlatform();
-
- $this->assertEquals('bar', $table->getName());
- $this->assertEquals('`bar`', $table->getQuotedName($mysqlPlatform));
- $this->assertEquals('"bar"', $table->getQuotedName($sqlitePlatform));
- }
-
- /**
- * @group DBAL-79
- */
- public function testTableHasPrimaryKey()
- {
- $table = new Table("test");
-
- $this->assertFalse($table->hasPrimaryKey());
-
- $table->addColumn("foo", "integer");
- $table->setPrimaryKey(array("foo"));
-
- $this->assertTrue($table->hasPrimaryKey());
- }
-
- /**
- * @group DBAL-91
- */
- public function testAddIndexWithQuotedColumns()
- {
- $table = new Table("test");
- $table->addColumn('"foo"', 'integer');
- $table->addColumn('bar', 'integer');
- $table->addIndex(array('"foo"', '"bar"'));
- }
-
- /**
- * @group DBAL-91
- */
- public function testAddForeignKeyWithQuotedColumnsAndTable()
- {
- $table = new Table("test");
- $table->addColumn('"foo"', 'integer');
- $table->addColumn('bar', 'integer');
- $table->addForeignKeyConstraint('"boing"', array('"foo"', '"bar"'), array("id"));
- }
- }
|