1 | <?php |
||
2 | |||
3 | namespace Doctrine\Tests\DBAL\Functional\Schema; |
||
4 | |||
5 | use Doctrine\DBAL\Platforms\MySqlPlatform; |
||
6 | use Doctrine\DBAL\Schema\Comparator; |
||
7 | use Doctrine\DBAL\Schema\Schema; |
||
8 | use Doctrine\DBAL\Schema\Table; |
||
9 | use Doctrine\DBAL\Types\Type; |
||
10 | |||
11 | class MySqlSchemaManagerTest extends SchemaManagerFunctionalTestCase |
||
12 | { |
||
13 | protected function setUp() |
||
14 | { |
||
15 | parent::setUp(); |
||
16 | |||
17 | if (!Type::hasType('point')) { |
||
18 | Type::addType('point', 'Doctrine\Tests\Types\MySqlPointType'); |
||
19 | } |
||
20 | } |
||
21 | |||
22 | public function testSwitchPrimaryKeyColumns() |
||
23 | { |
||
24 | $tableOld = new Table("switch_primary_key_columns"); |
||
25 | $tableOld->addColumn('foo_id', 'integer'); |
||
26 | $tableOld->addColumn('bar_id', 'integer'); |
||
27 | |||
28 | $this->_sm->createTable($tableOld); |
||
29 | $tableFetched = $this->_sm->listTableDetails("switch_primary_key_columns"); |
||
30 | $tableNew = clone $tableFetched; |
||
31 | $tableNew->setPrimaryKey(array('bar_id', 'foo_id')); |
||
32 | |||
33 | $comparator = new Comparator; |
||
34 | $this->_sm->alterTable($comparator->diffTable($tableFetched, $tableNew)); |
||
35 | |||
36 | $table = $this->_sm->listTableDetails('switch_primary_key_columns'); |
||
37 | $primaryKey = $table->getPrimaryKeyColumns(); |
||
38 | |||
39 | self::assertCount(2, $primaryKey); |
||
40 | self::assertContains('bar_id', $primaryKey); |
||
41 | self::assertContains('foo_id', $primaryKey); |
||
42 | } |
||
43 | |||
44 | public function testDiffTableBug() |
||
45 | { |
||
46 | $schema = new Schema(); |
||
47 | $table = $schema->createTable('diffbug_routing_translations'); |
||
48 | $table->addColumn('id', 'integer'); |
||
49 | $table->addColumn('route', 'string'); |
||
50 | $table->addColumn('locale', 'string'); |
||
51 | $table->addColumn('attribute', 'string'); |
||
52 | $table->addColumn('localized_value', 'string'); |
||
53 | $table->addColumn('original_value', 'string'); |
||
54 | $table->setPrimaryKey(array('id')); |
||
55 | $table->addUniqueIndex(array('route', 'locale', 'attribute')); |
||
56 | $table->addIndex(array('localized_value')); // this is much more selective than the unique index |
||
57 | |||
58 | $this->_sm->createTable($table); |
||
59 | $tableFetched = $this->_sm->listTableDetails("diffbug_routing_translations"); |
||
60 | |||
61 | $comparator = new Comparator; |
||
62 | $diff = $comparator->diffTable($tableFetched, $table); |
||
63 | |||
64 | self::assertFalse($diff, "no changes expected."); |
||
65 | } |
||
66 | |||
67 | View Code Duplication | public function testFulltextIndex() |
|
68 | { |
||
69 | $table = new Table('fulltext_index'); |
||
70 | $table->addColumn('text', 'text'); |
||
71 | $table->addIndex(array('text'), 'f_index'); |
||
72 | $table->addOption('engine', 'MyISAM'); |
||
73 | |||
74 | $index = $table->getIndex('f_index'); |
||
75 | $index->addFlag('fulltext'); |
||
76 | |||
77 | $this->_sm->dropAndCreateTable($table); |
||
78 | |||
79 | $indexes = $this->_sm->listTableIndexes('fulltext_index'); |
||
80 | self::assertArrayHasKey('f_index', $indexes); |
||
81 | self::assertTrue($indexes['f_index']->hasFlag('fulltext')); |
||
82 | } |
||
83 | |||
84 | View Code Duplication | public function testSpatialIndex() |
|
85 | { |
||
86 | $table = new Table('spatial_index'); |
||
87 | $table->addColumn('point', 'point'); |
||
88 | $table->addIndex(array('point'), 's_index'); |
||
89 | $table->addOption('engine', 'MyISAM'); |
||
90 | |||
91 | $index = $table->getIndex('s_index'); |
||
92 | $index->addFlag('spatial'); |
||
93 | |||
94 | $this->_sm->dropAndCreateTable($table); |
||
95 | |||
96 | $indexes = $this->_sm->listTableIndexes('spatial_index'); |
||
97 | self::assertArrayHasKey('s_index', $indexes); |
||
98 | self::assertTrue($indexes['s_index']->hasFlag('spatial')); |
||
99 | } |
||
100 | |||
101 | /** |
||
102 | * @group DBAL-400 |
||
103 | */ |
||
104 | public function testAlterTableAddPrimaryKey() |
||
105 | { |
||
106 | $table = new Table('alter_table_add_pk'); |
||
107 | $table->addColumn('id', 'integer'); |
||
108 | $table->addColumn('foo', 'integer'); |
||
109 | $table->addIndex(array('id'), 'idx_id'); |
||
110 | |||
111 | $this->_sm->createTable($table); |
||
112 | |||
113 | $comparator = new Comparator(); |
||
114 | $diffTable = clone $table; |
||
115 | |||
116 | $diffTable->dropIndex('idx_id'); |
||
117 | $diffTable->setPrimaryKey(array('id')); |
||
118 | |||
119 | $this->_sm->alterTable($comparator->diffTable($table, $diffTable)); |
||
120 | |||
121 | $table = $this->_sm->listTableDetails("alter_table_add_pk"); |
||
122 | |||
123 | self::assertFalse($table->hasIndex('idx_id')); |
||
124 | self::assertTrue($table->hasPrimaryKey()); |
||
125 | } |
||
126 | |||
127 | /** |
||
128 | * @group DBAL-464 |
||
129 | */ |
||
130 | public function testDropPrimaryKeyWithAutoincrementColumn() |
||
131 | { |
||
132 | $table = new Table("drop_primary_key"); |
||
133 | $table->addColumn('id', 'integer', array('primary' => true, 'autoincrement' => true)); |
||
134 | $table->addColumn('foo', 'integer', array('primary' => true)); |
||
135 | $table->setPrimaryKey(array('id', 'foo')); |
||
136 | |||
137 | $this->_sm->dropAndCreateTable($table); |
||
138 | |||
139 | $diffTable = clone $table; |
||
140 | |||
141 | $diffTable->dropPrimaryKey(); |
||
142 | |||
143 | $comparator = new Comparator(); |
||
144 | |||
145 | $this->_sm->alterTable($comparator->diffTable($table, $diffTable)); |
||
146 | |||
147 | $table = $this->_sm->listTableDetails("drop_primary_key"); |
||
148 | |||
149 | self::assertFalse($table->hasPrimaryKey()); |
||
150 | self::assertFalse($table->getColumn('id')->getAutoincrement()); |
||
151 | } |
||
152 | |||
153 | /** |
||
154 | * @group DBAL-789 |
||
155 | */ |
||
156 | public function testDoesNotPropagateDefaultValuesForUnsupportedColumnTypes() |
||
157 | { |
||
158 | $table = new Table("text_blob_default_value"); |
||
159 | $table->addColumn('def_text', 'text', array('default' => 'def')); |
||
160 | $table->addColumn('def_text_null', 'text', array('notnull' => false, 'default' => 'def')); |
||
161 | $table->addColumn('def_blob', 'blob', array('default' => 'def')); |
||
162 | $table->addColumn('def_blob_null', 'blob', array('notnull' => false, 'default' => 'def')); |
||
163 | |||
164 | $this->_sm->dropAndCreateTable($table); |
||
165 | |||
166 | $onlineTable = $this->_sm->listTableDetails("text_blob_default_value"); |
||
167 | |||
168 | self::assertNull($onlineTable->getColumn('def_text')->getDefault()); |
||
169 | self::assertNull($onlineTable->getColumn('def_text_null')->getDefault()); |
||
170 | self::assertFalse($onlineTable->getColumn('def_text_null')->getNotnull()); |
||
171 | self::assertNull($onlineTable->getColumn('def_blob')->getDefault()); |
||
172 | self::assertNull($onlineTable->getColumn('def_blob_null')->getDefault()); |
||
173 | self::assertFalse($onlineTable->getColumn('def_blob_null')->getNotnull()); |
||
174 | |||
175 | $comparator = new Comparator(); |
||
176 | |||
177 | $this->_sm->alterTable($comparator->diffTable($table, $onlineTable)); |
||
178 | |||
179 | $onlineTable = $this->_sm->listTableDetails("text_blob_default_value"); |
||
180 | |||
181 | self::assertNull($onlineTable->getColumn('def_text')->getDefault()); |
||
182 | self::assertNull($onlineTable->getColumn('def_text_null')->getDefault()); |
||
183 | self::assertFalse($onlineTable->getColumn('def_text_null')->getNotnull()); |
||
184 | self::assertNull($onlineTable->getColumn('def_blob')->getDefault()); |
||
185 | self::assertNull($onlineTable->getColumn('def_blob_null')->getDefault()); |
||
186 | self::assertFalse($onlineTable->getColumn('def_blob_null')->getNotnull()); |
||
187 | } |
||
188 | |||
189 | View Code Duplication | public function testColumnCollation() |
|
190 | { |
||
191 | $table = new Table('test_collation'); |
||
192 | $table->addOption('collate', $collation = 'latin1_swedish_ci'); |
||
193 | $table->addOption('charset', 'latin1'); |
||
194 | $table->addColumn('id', 'integer'); |
||
195 | $table->addColumn('text', 'text'); |
||
196 | $table->addColumn('foo', 'text')->setPlatformOption('collation', 'latin1_swedish_ci'); |
||
197 | $table->addColumn('bar', 'text')->setPlatformOption('collation', 'utf8_general_ci'); |
||
198 | $this->_sm->dropAndCreateTable($table); |
||
199 | |||
200 | $columns = $this->_sm->listTableColumns('test_collation'); |
||
201 | |||
202 | self::assertArrayNotHasKey('collation', $columns['id']->getPlatformOptions()); |
||
203 | self::assertEquals('latin1_swedish_ci', $columns['text']->getPlatformOption('collation')); |
||
204 | self::assertEquals('latin1_swedish_ci', $columns['foo']->getPlatformOption('collation')); |
||
205 | self::assertEquals('utf8_general_ci', $columns['bar']->getPlatformOption('collation')); |
||
206 | } |
||
207 | |||
208 | /** |
||
209 | * @group DBAL-843 |
||
210 | */ |
||
211 | public function testListLobTypeColumns() |
||
212 | { |
||
213 | $tableName = 'lob_type_columns'; |
||
214 | $table = new Table($tableName); |
||
215 | |||
216 | $table->addColumn('col_tinytext', 'text', array('length' => MySqlPlatform::LENGTH_LIMIT_TINYTEXT)); |
||
217 | $table->addColumn('col_text', 'text', array('length' => MySqlPlatform::LENGTH_LIMIT_TEXT)); |
||
218 | $table->addColumn('col_mediumtext', 'text', array('length' => MySqlPlatform::LENGTH_LIMIT_MEDIUMTEXT)); |
||
219 | $table->addColumn('col_longtext', 'text'); |
||
220 | |||
221 | $table->addColumn('col_tinyblob', 'text', array('length' => MySqlPlatform::LENGTH_LIMIT_TINYBLOB)); |
||
222 | $table->addColumn('col_blob', 'blob', array('length' => MySqlPlatform::LENGTH_LIMIT_BLOB)); |
||
223 | $table->addColumn('col_mediumblob', 'blob', array('length' => MySqlPlatform::LENGTH_LIMIT_MEDIUMBLOB)); |
||
224 | $table->addColumn('col_longblob', 'blob'); |
||
225 | |||
226 | $this->_sm->dropAndCreateTable($table); |
||
227 | |||
228 | $platform = $this->_sm->getDatabasePlatform(); |
||
229 | $offlineColumns = $table->getColumns(); |
||
230 | $onlineColumns = $this->_sm->listTableColumns($tableName); |
||
231 | |||
232 | self::assertSame( |
||
233 | $platform->getClobTypeDeclarationSQL($offlineColumns['col_tinytext']->toArray()), |
||
234 | $platform->getClobTypeDeclarationSQL($onlineColumns['col_tinytext']->toArray()) |
||
235 | ); |
||
236 | self::assertSame( |
||
237 | $platform->getClobTypeDeclarationSQL($offlineColumns['col_text']->toArray()), |
||
238 | $platform->getClobTypeDeclarationSQL($onlineColumns['col_text']->toArray()) |
||
239 | ); |
||
240 | self::assertSame( |
||
241 | $platform->getClobTypeDeclarationSQL($offlineColumns['col_mediumtext']->toArray()), |
||
242 | $platform->getClobTypeDeclarationSQL($onlineColumns['col_mediumtext']->toArray()) |
||
243 | ); |
||
244 | self::assertSame( |
||
245 | $platform->getClobTypeDeclarationSQL($offlineColumns['col_longtext']->toArray()), |
||
246 | $platform->getClobTypeDeclarationSQL($onlineColumns['col_longtext']->toArray()) |
||
247 | ); |
||
248 | |||
249 | self::assertSame( |
||
250 | $platform->getBlobTypeDeclarationSQL($offlineColumns['col_tinyblob']->toArray()), |
||
251 | $platform->getBlobTypeDeclarationSQL($onlineColumns['col_tinyblob']->toArray()) |
||
252 | ); |
||
253 | self::assertSame( |
||
254 | $platform->getBlobTypeDeclarationSQL($offlineColumns['col_blob']->toArray()), |
||
255 | $platform->getBlobTypeDeclarationSQL($onlineColumns['col_blob']->toArray()) |
||
256 | ); |
||
257 | self::assertSame( |
||
258 | $platform->getBlobTypeDeclarationSQL($offlineColumns['col_mediumblob']->toArray()), |
||
259 | $platform->getBlobTypeDeclarationSQL($onlineColumns['col_mediumblob']->toArray()) |
||
260 | ); |
||
261 | self::assertSame( |
||
262 | $platform->getBlobTypeDeclarationSQL($offlineColumns['col_longblob']->toArray()), |
||
263 | $platform->getBlobTypeDeclarationSQL($onlineColumns['col_longblob']->toArray()) |
||
264 | ); |
||
265 | } |
||
266 | |||
267 | /** |
||
268 | * @group DBAL-423 |
||
269 | */ |
||
270 | View Code Duplication | public function testDiffListGuidTableColumn() |
|
0 ignored issues
–
show
|
|||
271 | { |
||
272 | $offlineTable = new Table('list_guid_table_column'); |
||
273 | $offlineTable->addColumn('col_guid', 'guid'); |
||
274 | |||
275 | $this->_sm->dropAndCreateTable($offlineTable); |
||
276 | |||
277 | $onlineTable = $this->_sm->listTableDetails('list_guid_table_column'); |
||
278 | |||
279 | $comparator = new Comparator(); |
||
280 | |||
281 | self::assertFalse( |
||
282 | $comparator->diffTable($offlineTable, $onlineTable), |
||
283 | "No differences should be detected with the offline vs online schema." |
||
284 | ); |
||
285 | } |
||
286 | |||
287 | /** |
||
288 | * @group DBAL-1082 |
||
289 | */ |
||
290 | View Code Duplication | public function testListDecimalTypeColumns() |
|
291 | { |
||
292 | $tableName = 'test_list_decimal_columns'; |
||
293 | $table = new Table($tableName); |
||
294 | |||
295 | $table->addColumn('col', 'decimal'); |
||
296 | $table->addColumn('col_unsigned', 'decimal', array('unsigned' => true)); |
||
297 | |||
298 | $this->_sm->dropAndCreateTable($table); |
||
299 | |||
300 | $columns = $this->_sm->listTableColumns($tableName); |
||
301 | |||
302 | self::assertArrayHasKey('col', $columns); |
||
303 | self::assertArrayHasKey('col_unsigned', $columns); |
||
304 | self::assertFalse($columns['col']->getUnsigned()); |
||
305 | self::assertTrue($columns['col_unsigned']->getUnsigned()); |
||
306 | } |
||
307 | |||
308 | /** |
||
309 | * @group DBAL-1082 |
||
310 | */ |
||
311 | View Code Duplication | public function testListFloatTypeColumns() |
|
312 | { |
||
313 | $tableName = 'test_list_float_columns'; |
||
314 | $table = new Table($tableName); |
||
315 | |||
316 | $table->addColumn('col', 'float'); |
||
317 | $table->addColumn('col_unsigned', 'float', array('unsigned' => true)); |
||
318 | |||
319 | $this->_sm->dropAndCreateTable($table); |
||
320 | |||
321 | $columns = $this->_sm->listTableColumns($tableName); |
||
322 | |||
323 | self::assertArrayHasKey('col', $columns); |
||
324 | self::assertArrayHasKey('col_unsigned', $columns); |
||
325 | self::assertFalse($columns['col']->getUnsigned()); |
||
326 | self::assertTrue($columns['col_unsigned']->getUnsigned()); |
||
327 | } |
||
328 | } |
||
329 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.