From 5fd227becd194d6f1f799112574e2ff9cedef928 Mon Sep 17 00:00:00 2001 From: Matt Button Date: Tue, 28 Dec 2010 15:40:54 +0000 Subject: [PATCH] Added unit tests for migration model and fixed some bugs found with the tests :) --- classes/model/minion/migration.php | 12 +- tests/minion/migration/model.php | 164 +++++++++++++++++++++ tests/test_data/minion/migration/model.xml | 11 ++ 3 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 tests/minion/migration/model.php create mode 100644 tests/test_data/minion/migration/model.xml diff --git a/classes/model/minion/migration.php b/classes/model/minion/migration.php index d5d0c7b..f56367f 100644 --- a/classes/model/minion/migration.php +++ b/classes/model/minion/migration.php @@ -61,10 +61,16 @@ class Model_Minion_Migration extends Model */ public function fetch_current_versions() { - return $this->_select() - ->where('applied', '>', 0) + // Little hack needed to do an order by before a group by + return DB::select() + ->from(array( + $this->_select() + ->where('applied', '>', 0) + ->order_by('timestamp', 'DESC'), + 'temp_table' + )) ->group_by('location') - ->execute(); + ->execute($this->_db); } /** diff --git a/tests/minion/migration/model.php b/tests/minion/migration/model.php new file mode 100644 index 0000000..7bbbc31 --- /dev/null +++ b/tests/minion/migration/model.php @@ -0,0 +1,164 @@ +createFlatXMLDataSet( + Kohana::find_file('tests/test_data', 'minion/migration/model', 'xml') + ); + } + + /** + * Get an instance of the migration model, pre-loaded with a connection to + * the test database + * + * @return Model_Minion_Migration + */ + public function getModel() + { + $db = Database::instance(Kohana::config('unittest')->db_connection); + + return new Model_Minion_Migration($db); + } + + /** + * Tests that the model can fetch all rows from the database + * + * @test + * @covers Model_Minion_Migration::fetch_all + */ + public function test_fetch_all() + { + $migrations = $this->getModel()->fetch_all(); + + $this->assertSame(7, count($migrations)); + } + + /** + * Test that the model accurately fetches the latest versions from the database + * + * @test + * @covers Model_Minion_Migration::fetch_current_versions + */ + public function test_fetch_current_versions() + { + $versions = $this->getModel() + ->fetch_current_versions() + ->as_array('location', 'id'); + + $this->assertSame( + array ( + 'app' => '1293543858_remove-password-salt-column', + 'dblogger' => '1293544858_remove-unique-index', + ), + $versions + ); + } + + /** + * Provides test data for test_fetch_required_migrations + * + * @return array Test data + */ + public function provider_fetch_required_migrations() + { + return array( + // Test a call with no params (i.e. upgrade everything to latest) + array( + array ( + 'app' => array( + 'direction' => true, + 'migrations' => array( + array ( + 'timestamp' => '1293543800', + 'description' => 'add-name-column-to-members', + 'location' => 'app', + 'applied' => '0', + 'id' => '1293543800_add-name-column-to-members', + ), + array ( + 'timestamp' => '1293543828', + 'description' => 'add-index-on-name', + 'location' => 'app', + 'applied' => '0', + 'id' => '1293543828_add-index-on-name', + ), + ), + ), + 'dblogger' => array( + 'direction' => true, + 'migrations' => array( + array ( + 'timestamp' => '1293544908', + 'description' => 'add-pk', + 'location' => 'dblogger', + 'applied' => '0', + 'id' => '1293544908_add-pk', + ), + ), + ), + ), + NULL, + TRUE, + TRUE + ), + array( + array( + 'app' => array( + 'direction' => FALSE, + 'migrations' => array( + array( + 'timestamp' => '1293543858', + 'description' => 'remove-password-salt-column', + 'location' => 'app', + 'applied' => '1', + 'id' => '1293543858_remove-password-salt-column' + ), + array( + 'timestamp' => '1293543728', + 'description' => 'create-tables', + 'location' => 'app', + 'applied' => '1', + 'id' => '1293543728_create-tables', + ), + ) + ), + ), + 'app', + FALSE, + TRUE + ), + ); + } + + /** + * Tests that fetch_required_migrations() produces an accurate list of + * migrations that need applying. + * + * @test + * @covers Model_Minion_Migration::fetch_required_migrations + * @dataProvider provider_fetch_required_migrations + * @param array Expected output + * @param NULL|string|array Input Locations + * @param bool|string|array Input Target + * @param bool Input default direction + */ + public function test_fetch_required_migrations($expected, $locations, $target, $default_direction) + { + $results = $this->getModel() + ->fetch_required_migrations($locations, $target, $default_direction); + + $this->assertSame($expected, $results); + } +} diff --git a/tests/test_data/minion/migration/model.xml b/tests/test_data/minion/migration/model.xml new file mode 100644 index 0000000..3e34dde --- /dev/null +++ b/tests/test_data/minion/migration/model.xml @@ -0,0 +1,11 @@ + + + + + + + + + + +