diff options
author | Joas Schilling <nickvergessen@gmx.de> | 2014-05-28 23:33:25 +0200 |
---|---|---|
committer | Joas Schilling <nickvergessen@gmx.de> | 2014-05-28 23:33:25 +0200 |
commit | 033df350d956121388b7b9be8f1b0f1d1439d2e4 (patch) | |
tree | c40644d7d4e8c613a84accf52eeb768528c941b3 | |
parent | 1b2238a6b11ff7ad8f8feae44816268c790f809d (diff) | |
parent | 9f37d414be1cc13377b9af1777220577c7af645c (diff) | |
download | forums-033df350d956121388b7b9be8f1b0f1d1439d2e4.tar forums-033df350d956121388b7b9be8f1b0f1d1439d2e4.tar.gz forums-033df350d956121388b7b9be8f1b0f1d1439d2e4.tar.bz2 forums-033df350d956121388b7b9be8f1b0f1d1439d2e4.tar.xz forums-033df350d956121388b7b9be8f1b0f1d1439d2e4.zip |
Merge pull request #2474 from PayBas/ticket/12561
[ticket/12561] Add "after" check to schema_generator for columns_add
* PayBas/ticket/12561:
[ticket/12561] Reworked tests by nickvergessen
[ticket/12561] Added tests for "after last", "after missing" and "empty"
[ticket/12561] Add check to see if "after" column actually exists
[ticket/12561] Added test for "after"
[ticket/12561] Add "after" check to schema_generator for columns_add
-rw-r--r-- | phpBB/phpbb/db/migration/schema_generator.php | 20 | ||||
-rw-r--r-- | tests/dbal/migration/dummy_order.php | 26 | ||||
-rw-r--r-- | tests/dbal/migration/dummy_order_0.php | 22 | ||||
-rw-r--r-- | tests/dbal/migration/dummy_order_1.php | 22 | ||||
-rw-r--r-- | tests/dbal/migration/dummy_order_2.php | 22 | ||||
-rw-r--r-- | tests/dbal/migration/dummy_order_3.php | 22 | ||||
-rw-r--r-- | tests/dbal/migration/dummy_order_4.php | 22 | ||||
-rw-r--r-- | tests/dbal/migration/dummy_order_5.php | 23 | ||||
-rw-r--r-- | tests/migrator/schema_generator_test.php | 87 |
9 files changed, 264 insertions, 2 deletions
diff --git a/phpBB/phpbb/db/migration/schema_generator.php b/phpBB/phpbb/db/migration/schema_generator.php index 871fd97aca..818e27a362 100644 --- a/phpBB/phpbb/db/migration/schema_generator.php +++ b/phpBB/phpbb/db/migration/schema_generator.php @@ -109,7 +109,25 @@ class schema_generator { foreach ($add_columns as $column => $column_data) { - $this->tables[$table]['COLUMNS'][$column] = $column_data; + if (isset($column_data['after'])) + { + $columns = $this->tables[$table]['COLUMNS']; + $offset = array_search($column_data['after'], array_keys($columns)); + unset($column_data['after']); + + if ($offset === false) + { + $this->tables[$table]['COLUMNS'][$column] = array_values($column_data); + } + else + { + $this->tables[$table]['COLUMNS'] = array_merge(array_slice($columns, 0, $offset + 1, true), array($column => array_values($column_data)), array_slice($columns, $offset)); + } + } + else + { + $this->tables[$table]['COLUMNS'][$column] = $column_data; + } } } } diff --git a/tests/dbal/migration/dummy_order.php b/tests/dbal/migration/dummy_order.php new file mode 100644 index 0000000000..b8590f5074 --- /dev/null +++ b/tests/dbal/migration/dummy_order.php @@ -0,0 +1,26 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +class phpbb_dbal_migration_dummy_order extends \phpbb\db\migration\migration +{ + function update_schema() + { + return array( + 'add_tables' => array( + $this->table_prefix . 'column_order_test1' => array( + 'COLUMNS' => array( + 'foobar1' => array('BOOL', 0), + 'foobar3' => array('BOOL', 0), + ), + 'PRIMARY_KEY' => array('foobar1'), + ), + ), + ); + } +} diff --git a/tests/dbal/migration/dummy_order_0.php b/tests/dbal/migration/dummy_order_0.php new file mode 100644 index 0000000000..e45bb0ad44 --- /dev/null +++ b/tests/dbal/migration/dummy_order_0.php @@ -0,0 +1,22 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +class phpbb_dbal_migration_dummy_order_0 extends \phpbb\db\migration\migration +{ + function update_schema() + { + return array( + 'add_columns' => array( + $this->table_prefix . 'column_order_test1' => array( + 'foobar2' => array('BOOL', 0, 'after' => 'foobar1'), + ), + ), + ); + } +} diff --git a/tests/dbal/migration/dummy_order_1.php b/tests/dbal/migration/dummy_order_1.php new file mode 100644 index 0000000000..73f043af5d --- /dev/null +++ b/tests/dbal/migration/dummy_order_1.php @@ -0,0 +1,22 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +class phpbb_dbal_migration_dummy_order_1 extends \phpbb\db\migration\migration +{ + function update_schema() + { + return array( + 'add_columns' => array( + $this->table_prefix . 'column_order_test1' => array( + 'foobar4' => array('BOOL', 0, 'after' => 'foobar3'), + ), + ), + ); + } +} diff --git a/tests/dbal/migration/dummy_order_2.php b/tests/dbal/migration/dummy_order_2.php new file mode 100644 index 0000000000..1483b98050 --- /dev/null +++ b/tests/dbal/migration/dummy_order_2.php @@ -0,0 +1,22 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +class phpbb_dbal_migration_dummy_order_2 extends \phpbb\db\migration\migration +{ + function update_schema() + { + return array( + 'add_columns' => array( + $this->table_prefix . 'column_order_test1' => array( + 'foobar5' => array('BOOL', 0, 'after' => 'non-existing'), + ), + ), + ); + } +} diff --git a/tests/dbal/migration/dummy_order_3.php b/tests/dbal/migration/dummy_order_3.php new file mode 100644 index 0000000000..79c542e088 --- /dev/null +++ b/tests/dbal/migration/dummy_order_3.php @@ -0,0 +1,22 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +class phpbb_dbal_migration_dummy_order_3 extends \phpbb\db\migration\migration +{ + function update_schema() + { + return array( + 'add_columns' => array( + $this->table_prefix . 'column_order_test1' => array( + 'foobar6' => array('BOOL', 0, 'after' => ''), + ), + ), + ); + } +} diff --git a/tests/dbal/migration/dummy_order_4.php b/tests/dbal/migration/dummy_order_4.php new file mode 100644 index 0000000000..229a120ecf --- /dev/null +++ b/tests/dbal/migration/dummy_order_4.php @@ -0,0 +1,22 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +class phpbb_dbal_migration_dummy_order_4 extends \phpbb\db\migration\migration +{ + function update_schema() + { + return array( + 'add_columns' => array( + $this->table_prefix . 'column_order_test1' => array( + 'foobar7' => array('BOOL', 0), + ), + ), + ); + } +} diff --git a/tests/dbal/migration/dummy_order_5.php b/tests/dbal/migration/dummy_order_5.php new file mode 100644 index 0000000000..04d755009d --- /dev/null +++ b/tests/dbal/migration/dummy_order_5.php @@ -0,0 +1,23 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +class phpbb_dbal_migration_dummy_order_5 extends \phpbb\db\migration\migration +{ + function update_schema() + { + return array( + 'add_columns' => array( + $this->table_prefix . 'column_order_test1' => array( + 'foobar8' => array('BOOL', 0, 'after' => 'foobar3'), + 'foobar9' => array('BOOL', 0, 'after' => 'foobar3'), + ), + ), + ); + } +} diff --git a/tests/migrator/schema_generator_test.php b/tests/migrator/schema_generator_test.php index 976265272a..9adf518a5d 100644 --- a/tests/migrator/schema_generator_test.php +++ b/tests/migrator/schema_generator_test.php @@ -11,8 +11,19 @@ * */ -class schmema_generator_test extends phpbb_test_case +require_once __DIR__ . '/../dbal/migration/dummy_order.php'; +require_once __DIR__ . '/../dbal/migration/dummy_order_0.php'; +require_once __DIR__ . '/../dbal/migration/dummy_order_1.php'; +require_once __DIR__ . '/../dbal/migration/dummy_order_2.php'; +require_once __DIR__ . '/../dbal/migration/dummy_order_3.php'; +require_once __DIR__ . '/../dbal/migration/dummy_order_4.php'; +require_once __DIR__ . '/../dbal/migration/dummy_order_5.php'; + +class schema_generator_test extends phpbb_test_case { + /** @var \phpbb\db\migration\schema_generator */ + protected $generator; + public function setUp() { parent::setUp(); @@ -50,4 +61,78 @@ class schmema_generator_test extends phpbb_test_case $this->assertArrayHasKey('phpbb_users', $this->generator->get_schema()); } + + public function column_add_after_data() + { + return array( + array( + 'phpbb_dbal_migration_dummy_order_0', + array( + 'foobar1', + 'foobar2', + 'foobar3', + ), + ), + array( + 'phpbb_dbal_migration_dummy_order_1', + array( + 'foobar1', + 'foobar3', + 'foobar4', + ), + ), + array( + 'phpbb_dbal_migration_dummy_order_2', + array( + 'foobar1', + 'foobar3', + 'foobar5', + ), + ), + array( + 'phpbb_dbal_migration_dummy_order_3', + array( + 'foobar1', + 'foobar3', + 'foobar6', + ), + ), + array( + 'phpbb_dbal_migration_dummy_order_4', + array( + 'foobar1', + 'foobar3', + 'foobar7', + ), + ), + array( + 'phpbb_dbal_migration_dummy_order_5', + array( + 'foobar1', + 'foobar3', + 'foobar9', + 'foobar8', + ), + ), + ); + } + + /** + * @dataProvider column_add_after_data + */ + public function test_column_add_after($migration, $expected) + { + $this->get_schema_generator(array( + 'phpbb_dbal_migration_dummy_order', + $migration, + )); + + $tables = $this->generator->get_schema(); + + $this->assertEquals( + $expected, + array_keys($tables[$this->table_prefix . 'column_order_test1']['COLUMNS']), + 'The schema generator could not position the column correctly, using the "after" option in the migration script.' + ); + } } |