Completed
Pull Request — master (#3339)
by Sergei
61:31
created

OracleSchemaManagerTest::setUpBeforeClass()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 15
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 0
1
<?php
2
3
namespace Doctrine\Tests\DBAL\Functional\Schema;
4
5
use Doctrine\DBAL\Platforms\OraclePlatform;
6
use Doctrine\DBAL\Schema;
7
use Doctrine\DBAL\Schema\Table;
8
use Doctrine\DBAL\Types\BinaryType;
9
use Doctrine\DBAL\Types\Type;
10
use Doctrine\Tests\TestUtil;
11
use function array_map;
12
13
class OracleSchemaManagerTest extends SchemaManagerFunctionalTestCase
14
{
15
    public static function setUpBeforeClass()
16
    {
17
        parent::setUpBeforeClass();
18
19
        $conn = TestUtil::getTempConnection();
20
21
        if (! $conn->getDatabasePlatform() instanceof OraclePlatform) {
22
            return;
23
        }
24
25
        if (! isset($GLOBALS['db_username'])) {
26
            self::markTestSkipped('Username must be explicitly specified in connection parameters for this test');
27
        }
28
29
        $conn->exec('GRANT ALL PRIVILEGES TO ' . $GLOBALS['db_username']);
30
    }
31
32
    public function testRenameTable()
33
    {
34
        $this->schemaManager->tryMethod('DropTable', 'list_tables_test');
35
        $this->schemaManager->tryMethod('DropTable', 'list_tables_test_new_name');
36
37
        $this->createTestTable('list_tables_test');
38
        $this->schemaManager->renameTable('list_tables_test', 'list_tables_test_new_name');
39
40
        $tables = $this->schemaManager->listTables();
41
42
        self::assertHasTable($tables, 'list_tables_test_new_name');
43
    }
44
45
    public function testListTableWithBinary()
46
    {
47
        $tableName = 'test_binary_table';
48
49
        $table = new Table($tableName);
50
        $table->addColumn('id', 'integer');
51
        $table->addColumn('column_varbinary', 'binary', []);
52
        $table->addColumn('column_binary', 'binary', ['fixed' => true]);
53
        $table->setPrimaryKey(['id']);
54
55
        $this->schemaManager->createTable($table);
56
57
        $table = $this->schemaManager->listTableDetails($tableName);
58
59
        self::assertInstanceOf(BinaryType::class, $table->getColumn('column_varbinary')->getType());
60
        self::assertFalse($table->getColumn('column_varbinary')->getFixed());
61
62
        self::assertInstanceOf(BinaryType::class, $table->getColumn('column_binary')->getType());
63
        self::assertFalse($table->getColumn('column_binary')->getFixed());
64
    }
65
66
    /**
67
     * @group DBAL-472
68
     * @group DBAL-1001
69
     */
70
    public function testAlterTableColumnNotNull()
71
    {
72
        $comparator = new Schema\Comparator();
73
        $tableName  = 'list_table_column_notnull';
74
        $table      = new Schema\Table($tableName);
75
76
        $table->addColumn('id', 'integer');
77
        $table->addColumn('foo', 'integer');
78
        $table->addColumn('bar', 'string');
79
        $table->setPrimaryKey(['id']);
80
81
        $this->schemaManager->dropAndCreateTable($table);
82
83
        $columns = $this->schemaManager->listTableColumns($tableName);
84
85
        self::assertTrue($columns['id']->getNotnull());
86
        self::assertTrue($columns['foo']->getNotnull());
87
        self::assertTrue($columns['bar']->getNotnull());
88
89
        $diffTable = clone $table;
90
        $diffTable->changeColumn('foo', ['notnull' => false]);
91
        $diffTable->changeColumn('bar', ['length' => 1024]);
92
93
        $this->schemaManager->alterTable($comparator->diffTable($table, $diffTable));
94
95
        $columns = $this->schemaManager->listTableColumns($tableName);
96
97
        self::assertTrue($columns['id']->getNotnull());
98
        self::assertFalse($columns['foo']->getNotnull());
99
        self::assertTrue($columns['bar']->getNotnull());
100
    }
101
102
    public function testListDatabases()
103
    {
104
        // We need the temp connection that has privileges to create a database.
105
        $sm = TestUtil::getTempConnection()->getSchemaManager();
106
107
        $sm->dropAndCreateDatabase('c##test_create_database');
108
109
        $databases = $this->schemaManager->listDatabases();
110
        $databases = array_map('strtolower', $databases);
111
112
        self::assertContains('c##test_create_database', $databases);
113
    }
114
115
    /**
116
     * @group DBAL-831
117
     */
118
    public function testListTableDetailsWithDifferentIdentifierQuotingRequirements()
119
    {
120
        $primaryTableName    = '"Primary_Table"';
121
        $offlinePrimaryTable = new Schema\Table($primaryTableName);
122
        $offlinePrimaryTable->addColumn(
123
            '"Id"',
124
            'integer',
125
            ['autoincrement' => true, 'comment' => 'Explicit casing.']
126
        );
127
        $offlinePrimaryTable->addColumn('select', 'integer', ['comment' => 'Reserved keyword.']);
128
        $offlinePrimaryTable->addColumn('foo', 'integer', ['comment' => 'Implicit uppercasing.']);
129
        $offlinePrimaryTable->addColumn('BAR', 'integer');
130
        $offlinePrimaryTable->addColumn('"BAZ"', 'integer');
131
        $offlinePrimaryTable->addIndex(['select'], 'from');
132
        $offlinePrimaryTable->addIndex(['foo'], 'foo_index');
133
        $offlinePrimaryTable->addIndex(['BAR'], 'BAR_INDEX');
134
        $offlinePrimaryTable->addIndex(['"BAZ"'], 'BAZ_INDEX');
135
        $offlinePrimaryTable->setPrimaryKey(['"Id"']);
136
137
        $foreignTableName    = 'foreign';
138
        $offlineForeignTable = new Schema\Table($foreignTableName);
139
        $offlineForeignTable->addColumn('id', 'integer', ['autoincrement' => true]);
140
        $offlineForeignTable->addColumn('"Fk"', 'integer');
141
        $offlineForeignTable->addIndex(['"Fk"'], '"Fk_index"');
142
        $offlineForeignTable->addForeignKeyConstraint(
143
            $primaryTableName,
144
            ['"Fk"'],
145
            ['"Id"'],
146
            [],
147
            '"Primary_Table_Fk"'
148
        );
149
        $offlineForeignTable->setPrimaryKey(['id']);
150
151
        $this->schemaManager->tryMethod('dropTable', $foreignTableName);
152
        $this->schemaManager->tryMethod('dropTable', $primaryTableName);
153
154
        $this->schemaManager->createTable($offlinePrimaryTable);
155
        $this->schemaManager->createTable($offlineForeignTable);
156
157
        $onlinePrimaryTable = $this->schemaManager->listTableDetails($primaryTableName);
158
        $onlineForeignTable = $this->schemaManager->listTableDetails($foreignTableName);
159
160
        $platform = $this->schemaManager->getDatabasePlatform();
161
162
        // Primary table assertions
163
        self::assertSame($primaryTableName, $onlinePrimaryTable->getQuotedName($platform));
164
165
        self::assertTrue($onlinePrimaryTable->hasColumn('"Id"'));
166
        self::assertSame('"Id"', $onlinePrimaryTable->getColumn('"Id"')->getQuotedName($platform));
167
        self::assertTrue($onlinePrimaryTable->hasPrimaryKey());
168
        self::assertSame(['"Id"'], $onlinePrimaryTable->getPrimaryKey()->getQuotedColumns($platform));
169
170
        self::assertTrue($onlinePrimaryTable->hasColumn('select'));
171
        self::assertSame('"select"', $onlinePrimaryTable->getColumn('select')->getQuotedName($platform));
172
173
        self::assertTrue($onlinePrimaryTable->hasColumn('foo'));
174
        self::assertSame('FOO', $onlinePrimaryTable->getColumn('foo')->getQuotedName($platform));
175
176
        self::assertTrue($onlinePrimaryTable->hasColumn('BAR'));
177
        self::assertSame('BAR', $onlinePrimaryTable->getColumn('BAR')->getQuotedName($platform));
178
179
        self::assertTrue($onlinePrimaryTable->hasColumn('"BAZ"'));
180
        self::assertSame('BAZ', $onlinePrimaryTable->getColumn('"BAZ"')->getQuotedName($platform));
181
182
        self::assertTrue($onlinePrimaryTable->hasIndex('from'));
183
        self::assertTrue($onlinePrimaryTable->getIndex('from')->hasColumnAtPosition('"select"'));
184
        self::assertSame(['"select"'], $onlinePrimaryTable->getIndex('from')->getQuotedColumns($platform));
185
186
        self::assertTrue($onlinePrimaryTable->hasIndex('foo_index'));
187
        self::assertTrue($onlinePrimaryTable->getIndex('foo_index')->hasColumnAtPosition('foo'));
188
        self::assertSame(['FOO'], $onlinePrimaryTable->getIndex('foo_index')->getQuotedColumns($platform));
189
190
        self::assertTrue($onlinePrimaryTable->hasIndex('BAR_INDEX'));
191
        self::assertTrue($onlinePrimaryTable->getIndex('BAR_INDEX')->hasColumnAtPosition('BAR'));
192
        self::assertSame(['BAR'], $onlinePrimaryTable->getIndex('BAR_INDEX')->getQuotedColumns($platform));
193
194
        self::assertTrue($onlinePrimaryTable->hasIndex('BAZ_INDEX'));
195
        self::assertTrue($onlinePrimaryTable->getIndex('BAZ_INDEX')->hasColumnAtPosition('"BAZ"'));
196
        self::assertSame(['BAZ'], $onlinePrimaryTable->getIndex('BAZ_INDEX')->getQuotedColumns($platform));
197
198
        // Foreign table assertions
199
        self::assertTrue($onlineForeignTable->hasColumn('id'));
200
        self::assertSame('ID', $onlineForeignTable->getColumn('id')->getQuotedName($platform));
201
        self::assertTrue($onlineForeignTable->hasPrimaryKey());
202
        self::assertSame(['ID'], $onlineForeignTable->getPrimaryKey()->getQuotedColumns($platform));
203
204
        self::assertTrue($onlineForeignTable->hasColumn('"Fk"'));
205
        self::assertSame('"Fk"', $onlineForeignTable->getColumn('"Fk"')->getQuotedName($platform));
206
207
        self::assertTrue($onlineForeignTable->hasIndex('"Fk_index"'));
208
        self::assertTrue($onlineForeignTable->getIndex('"Fk_index"')->hasColumnAtPosition('"Fk"'));
209
        self::assertSame(['"Fk"'], $onlineForeignTable->getIndex('"Fk_index"')->getQuotedColumns($platform));
210
211
        self::assertTrue($onlineForeignTable->hasForeignKey('"Primary_Table_Fk"'));
212
        self::assertSame(
213
            $primaryTableName,
214
            $onlineForeignTable->getForeignKey('"Primary_Table_Fk"')->getQuotedForeignTableName($platform)
215
        );
216
        self::assertSame(
217
            ['"Fk"'],
218
            $onlineForeignTable->getForeignKey('"Primary_Table_Fk"')->getQuotedLocalColumns($platform)
219
        );
220
        self::assertSame(
221
            ['"Id"'],
222
            $onlineForeignTable->getForeignKey('"Primary_Table_Fk"')->getQuotedForeignColumns($platform)
223
        );
224
    }
225
226
    public function testListTableColumnsSameTableNamesInDifferentSchemas()
227
    {
228
        $table = $this->createListTableColumns();
229
        $this->schemaManager->dropAndCreateTable($table);
230
231
        $otherTable = new Table($table->getName());
232
        $otherTable->addColumn('id', Type::STRING);
233
        TestUtil::getTempConnection()->getSchemaManager()->dropAndCreateTable($otherTable);
234
235
        $columns = $this->schemaManager->listTableColumns($table->getName(), $this->connection->getUsername());
236
        self::assertCount(7, $columns);
237
    }
238
239
    /**
240
     * @group DBAL-1234
241
     */
242
    public function testListTableIndexesPrimaryKeyConstraintNameDiffersFromIndexName()
243
    {
244
        $table = new Table('list_table_indexes_pk_id_test');
245
        $table->setSchemaConfig($this->schemaManager->createSchemaConfig());
246
        $table->addColumn('id', 'integer', ['notnull' => true]);
247
        $table->addUniqueIndex(['id'], 'id_unique_index');
248
        $this->schemaManager->dropAndCreateTable($table);
249
250
        // Adding a primary key on already indexed columns
251
        // Oracle will reuse the unique index, which cause a constraint name differing from the index name
252
        $this->schemaManager->createConstraint(new Schema\Index('id_pk_id_index', ['id'], true, true), 'list_table_indexes_pk_id_test');
253
254
        $tableIndexes = $this->schemaManager->listTableIndexes('list_table_indexes_pk_id_test');
255
256
        self::assertArrayHasKey('primary', $tableIndexes, 'listTableIndexes() has to return a "primary" array key.');
257
        self::assertEquals(['id'], array_map('strtolower', $tableIndexes['primary']->getColumns()));
258
        self::assertTrue($tableIndexes['primary']->isUnique());
259
        self::assertTrue($tableIndexes['primary']->isPrimary());
260
    }
261
262
    /**
263
     * @group DBAL-2555
264
     */
265
    public function testListTableDateTypeColumns()
266
    {
267
        $table = new Table('tbl_date');
268
        $table->addColumn('col_date', 'date');
269
        $table->addColumn('col_datetime', 'datetime');
270
        $table->addColumn('col_datetimetz', 'datetimetz');
271
272
        $this->schemaManager->dropAndCreateTable($table);
273
274
        $columns = $this->schemaManager->listTableColumns('tbl_date');
275
276
        self::assertSame('date', $columns['col_date']->getType()->getName());
277
        self::assertSame('datetime', $columns['col_datetime']->getType()->getName());
278
        self::assertSame('datetimetz', $columns['col_datetimetz']->getType()->getName());
279
    }
280
281
    public function testCreateAndListSequences() : void
282
    {
283
        self::markTestSkipped("Skipped for uppercase letters are contained in sequences' names. Fix the schema manager in 3.0.");
284
    }
285
}
286