2 declare(strict_types = 1);
19 use Doctrine\DBAL\Schema\AbstractSchemaManager;
20 use Doctrine\DBAL\Schema\Table;
21 use Doctrine\DBAL\Types\BigIntType;
22 use Doctrine\DBAL\Types\TextType;
27 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
62 protected function setUp()
65 $this->subject = GeneralUtility::makeInstance(SchemaMigrator::class);
66 $this->sqlReader = GeneralUtility::makeInstance(SqlReader::class);
67 $this->connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
68 $this->schemaManager = $this->connectionPool->getConnectionForTable($this->tableName)->getSchemaManager();
79 if ($this->schemaManager->tablesExist([$this->tableName])) {
80 $this->schemaManager->dropTable($this->tableName);
82 if ($this->schemaManager->tablesExist([
'zzz_deleted_' . $this->tableName])) {
83 $this->schemaManager->dropTable(
'zzz_deleted_' . $this->tableName);
85 if ($this->schemaManager->tablesExist([
'another_test_table'])) {
86 $this->schemaManager->dropTable(
'another_test_table');
95 if ($this->schemaManager->tablesExist([$this->tableName])) {
96 $this->schemaManager->dropTable($this->tableName);
100 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
102 $this->subject->migrate(
116 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
118 $this->subject->migrate(
123 $this->assertTrue($this->schemaManager->tablesExist([
'another_test_table']));
132 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
134 $this->subject->migrate(
150 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
152 $this->assertEquals(50, $this->
getTableDetails()->getColumn(
'title')->getLength());
153 $this->assertEmpty($this->
getTableDetails()->getColumn(
'title')->getDefault());
155 $this->subject->migrate(
160 $this->assertEquals(100, $this->
getTableDetails()->getColumn(
'title')->getLength());
161 $this->assertEquals(
'Title', $this->
getTableDetails()->getColumn(
'title')->getDefault());
176 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
178 $this->subject->migrate(
183 $this->assertTrue($this->
getTableDetails()->getColumn(
'aTestField')->getNotnull());
192 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
194 $this->subject->migrate(
199 $this->assertFalse($this->
getTableDetails()->getColumn(
'aTestField')->getNotnull());
200 $this->assertNull($this->
getTableDetails()->getColumn(
'aTestField')->getDefault());
212 $updateSuggestions = $this->subject->getUpdateSuggestions($statements,
true);
214 $this->subject->migrate(
220 $this->assertTrue($this->
getTableDetails()->hasColumn(
'zzz_deleted_hidden'));
229 $updateSuggestions = $this->subject->getUpdateSuggestions($statements,
true);
231 $this->subject->migrate(
236 $this->assertNotContains($this->tableName, $this->schemaManager->listTableNames());
237 $this->assertContains(
'zzz_deleted_' . $this->tableName, $this->schemaManager->listTableNames());
249 $connection = $this->connectionPool->getConnectionForTable($this->tableName);
250 $fromSchema = $this->schemaManager->createSchema();
251 $toSchema = clone $fromSchema;
252 $toSchema->getTable($this->tableName)->addColumn(
'zzz_deleted_testfield',
'integer', [
'notnull' =>
false]);
253 $statements = $fromSchema->getMigrateToSql(
255 $connection->getDatabasePlatform()
257 $connection->executeUpdate($statements[0]);
258 $this->assertTrue($this->
getTableDetails()->hasColumn(
'zzz_deleted_testfield'));
261 $updateSuggestions = $this->subject->getUpdateSuggestions($statements,
true);
262 $this->subject->migrate(
267 $this->assertFalse($this->
getTableDetails()->hasColumn(
'zzz_deleted_testfield'));
275 $this->schemaManager->renameTable($this->tableName,
'zzz_deleted_' . $this->tableName);
276 $this->assertNotContains($this->tableName, $this->schemaManager->listTableNames());
277 $this->assertContains(
'zzz_deleted_' . $this->tableName, $this->schemaManager->listTableNames());
280 $updateSuggestions = $this->subject->getUpdateSuggestions($statements,
true);
281 $this->subject->migrate(
286 $this->assertNotContains($this->tableName, $this->schemaManager->listTableNames());
287 $this->assertNotContains(
'zzz_deleted_' . $this->tableName, $this->schemaManager->listTableNames());
298 $this->subject->install($statements,
true);
300 $this->assertContains(
'another_test_table', $this->schemaManager->listTableNames());
303 $this->assertTrue($this->
getTableDetails()->getIndex(
'title')->isUnique());
304 $this->assertNotInstanceOf(BigIntType::class, $this->
getTableDetails()->getColumn(
'pid')->getType());
317 $this->subject->install($statements,
true);
319 $this->assertNotInstanceOf(TextType::class, $this->
getTableDetails()->getColumn(
'title')->getType());
330 if ($this->schemaManager->tablesExist([$this->tableName])) {
331 $this->schemaManager->dropTable($this->tableName);
336 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
338 $this->subject->migrate(
343 $indexesAfterChange = $this->schemaManager->listTableIndexes($this->tableName);
347 $parentIndex = array_values(
349 array_keys($indexesAfterChange),
351 return strpos($key,
'parent') !==
false;
356 $expectedColumnsOfChangedIndex = [
360 $this->assertEquals($expectedColumnsOfChangedIndex, $indexesAfterChange[$parentIndex[0]]->getColumns());
372 $this->subject->install($statements);
374 $this->assertContains(
'another_test_table', $this->schemaManager->listTableNames());
377 $this->assertTrue($this->
getTableDetails()->getIndex(
'title')->isUnique());
378 $this->assertInstanceOf(BigIntType::class, $this->
getTableDetails()->getColumn(
'pid')->getType());
389 $sqlCode = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__,
'..',
'Fixtures',
'importStaticData.sql']));
390 $connection = $this->connectionPool->getConnectionForTable($this->tableName);
391 $statements = $this->sqlReader->getInsertStatementArray($sqlCode);
392 $this->subject->importStaticData($statements);
394 $this->assertEquals(2, $connection->count(
'*', $this->tableName, []));
402 $sqlCode = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__,
'..',
'Fixtures',
'importStaticData.sql']));
403 $statements = $this->sqlReader->getStatementArray($sqlCode);
404 $this->subject->importStaticData($statements);
406 $this->assertNotContains(
'another_test_table', $this->schemaManager->listTableNames());
418 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
421 $this->assertStringEndsWith(
426 $this->subject->migrate(
431 $updateSuggestions = $this->subject->getUpdateSuggestions($statements);
444 $this->subject->install($statements, $createOnly);
454 return $this->schemaManager->listTableDetails($this->tableName);
465 $sqlCode = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__,
'..',
'Fixtures', $fixtureName]) .
'.sql');
467 return $this->sqlReader->getCreateTableStatementArray($sqlCode);