SqliteSchemaManagerTest.php 4.86 KB
Newer Older
1 2 3 4 5 6 7
<?php

namespace Doctrine\Tests\DBAL\Functional\Schema;

use Doctrine\DBAL\Schema;

require_once __DIR__ . '/../../../TestInit.php';
8

romanb's avatar
romanb committed
9
class SqliteSchemaManagerTest extends SchemaManagerFunctionalTestCase
10
{
romanb's avatar
romanb committed
11
    /**
12
     * SQLITE does not support databases.
13 14
     *
     * @expectedException \Doctrine\DBAL\DBALException
romanb's avatar
romanb committed
15
     */
16 17
    public function testListDatabases()
    {
romanb's avatar
romanb committed
18
        $this->_sm->listDatabases();
19 20 21 22 23 24
    }

    public function testCreateAndDropDatabase()
    {
        $path = dirname(__FILE__).'/test_create_and_drop_sqlite_database.sqlite';

jwage's avatar
jwage committed
25
        $this->_sm->createDatabase($path);
26
        $this->assertEquals(true, file_exists($path));
jwage's avatar
jwage committed
27
        $this->_sm->dropDatabase($path);
28
        $this->assertEquals(false, file_exists($path));
jwage's avatar
jwage committed
29
    }
30 31 32

    public function testRenameTable()
    {
33
        $this->createTestTable('oldname');
romanb's avatar
romanb committed
34
        $this->_sm->renameTable('oldname', 'newname');
35 36 37 38

        $tables = $this->_sm->listTableNames();
        $this->assertContains('newname', $tables);
        $this->assertNotContains('oldname', $tables);
39
    }
40

41
    public function createListTableColumns()
42
    {
43 44 45 46
        $table = parent::createListTableColumns();
        $table->getColumn('id')->setAutoincrement(true);

        return $table;
47
    }
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

    public function testListForeignKeysFromExistingDatabase()
    {
        $this->_conn->executeQuery(<<<EOS
CREATE TABLE user (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    page INTEGER CONSTRAINT FK_1 REFERENCES page (key) DEFERRABLE INITIALLY DEFERRED,
    parent INTEGER REFERENCES user(id) ON DELETE CASCADE,
    log INTEGER,
    CONSTRAINT FK_3 FOREIGN KEY (log) REFERENCES log ON UPDATE SET NULL NOT DEFERRABLE
)
EOS
        );

        $expected = array(
63
            new Schema\ForeignKeyConstraint(array('log'), 'log', array(null), 'FK_3',
64
                array('onUpdate' => 'SET NULL', 'onDelete' => 'NO ACTION', 'deferrable' => false, 'deferred' => false)),
65
            new Schema\ForeignKeyConstraint(array('parent'), 'user', array('id'), '1',
66
                array('onUpdate' => 'NO ACTION', 'onDelete' => 'CASCADE', 'deferrable' => false, 'deferred' => false)),
67
            new Schema\ForeignKeyConstraint(array('page'), 'page', array('key'), 'FK_1',
68 69 70 71 72
                array('onUpdate' => 'NO ACTION', 'onDelete' => 'NO ACTION', 'deferrable' => true, 'deferred' => true)),
        );

        $this->assertEquals($expected, $this->_sm->listTableForeignKeys('user'));
    }
Steve Müller's avatar
Steve Müller committed
73

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    public function testColumnCollation()
    {
        $table = new Schema\Table('test_collation');
        $table->addColumn('id', 'integer');
        $table->addColumn('text', 'text');
        $table->addColumn('foo', 'text')->setPlatformOption('collation', 'BINARY');
        $table->addColumn('bar', 'text')->setPlatformOption('collation', 'NOCASE');
        $this->_sm->dropAndCreateTable($table);

        $columns = $this->_sm->listTableColumns('test_collation');

        $this->assertArrayNotHasKey('collation', $columns['id']->getPlatformOptions());
        $this->assertEquals('BINARY', $columns['text']->getPlatformOption('collation'));
        $this->assertEquals('BINARY', $columns['foo']->getPlatformOption('collation'));
        $this->assertEquals('NOCASE', $columns['bar']->getPlatformOption('collation'));
    }

Steve Müller's avatar
Steve Müller committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
    public function testListTableWithBinary()
    {
        $tableName = 'test_binary_table';

        $table = new \Doctrine\DBAL\Schema\Table($tableName);
        $table->addColumn('id', 'integer');
        $table->addColumn('column_varbinary', 'binary', array());
        $table->addColumn('column_binary', 'binary', array('fixed' => true));
        $table->setPrimaryKey(array('id'));

        $this->_sm->createTable($table);

        $table = $this->_sm->listTableDetails($tableName);

        $this->assertInstanceOf('Doctrine\DBAL\Types\BlobType', $table->getColumn('column_varbinary')->getType());
        $this->assertFalse($table->getColumn('column_varbinary')->getFixed());

        $this->assertInstanceOf('Doctrine\DBAL\Types\BlobType', $table->getColumn('column_binary')->getType());
        $this->assertFalse($table->getColumn('column_binary')->getFixed());
    }
111 112 113

    public function testNonDefaultPKOrder()
    {
114 115 116 117
        $version = \SQLite3::version();
        if(version_compare($version['versionString'], '3.7.16', '<')) {
            $this->markTestSkipped('This version of sqlite doesn\'t return the order of the Primary Key.');
        }
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
        $this->_conn->executeQuery(<<<EOS
CREATE TABLE non_default_pk_order (
    id INTEGER,
    other_id INTEGER,
    PRIMARY KEY(other_id, id)
)
EOS
        );

        $tableIndexes = $this->_sm->listTableIndexes('non_default_pk_order');

         $this->assertEquals(1, count($tableIndexes));

        $this->assertArrayHasKey('primary', $tableIndexes, 'listTableIndexes() has to return a "primary" array key.');
        $this->assertEquals(array('other_id', 'id'), array_map('strtolower', $tableIndexes['primary']->getColumns()));
    }
134
}