Exemple #1
0
 def setUp(self):
     self.fake_db_handler = FakeDatabaseHandler()
     self.runner = self.create_script_runner()
     self.runner.is_debug_printing = False
Exemple #2
0
class ScriptRunnerTests_Base(unittest.TestCase):

    longMessage = True

    def setUp(self):
        self.fake_db_handler = FakeDatabaseHandler()
        self.runner = self.create_script_runner()
        self.runner.is_debug_printing = False

    # Helper methods

    def create_script_runner(self):
        conn_hashes = { "1": { "dbname": "1", "conn": "1_c"}, "2": { "dbname": "2", "conn": "2_c" } }
        return ScriptRunner(conn_hashes, self.fake_db_handler)

    def assert_db_exec_equals(self, expected, msg):
        hist = self.fake_db_handler.get_history()
        if (hist != expected):
            print
            print expected
            print hist
        self.assertEqual("\n" + expected, "\n" + self.fake_db_handler.get_history(), msg)

    # Tests

    def test_runner_throws_if_missing_connection_hash(self):
        self.assertRaises(ScriptRunnerException, self.runner.add_script, "a", "missing", "sql")

    def test_migration_table_created_if_runner_is_tracking_scripts(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(True)
        self.assert_db_exec_equals("create_track_tbl in 1_c; check a in 1_c; execute sql in 1_c; record a in 1_c", "hist")

    def test_migration_table_not_created_if_runner_is_NOT_tracking_scripts(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(False)
        self.assert_db_exec_equals("execute sql in 1_c", "hist")

    def test_migration_table_is_only_created_once_on_connection_if_runner_is_tracking_scripts(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(True)
        self.runner.execute_scripts(True)
        self.assert_db_exec_equals("create_track_tbl in 1_c; check a in 1_c; execute sql in 1_c; record a in 1_c; check a in 1_c", "hist")

    def test_migration_table_is_created_in_every_referenced_database(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.add_script("b", "2", "sql2")
        self.runner.execute_scripts(True)
        expected = "create_track_tbl in 1_c; check a in 1_c; execute sql in 1_c; record a in 1_c; " \
                   "create_track_tbl in 2_c; check b in 2_c; execute sql2 in 2_c; record b in 2_c"
        self.assert_db_exec_equals(expected, "hist")

    def test_tracked_script_is_logged_to_table_when_run(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(True)
        self.assertTrue("execute sql in 1_c" in self.fake_db_handler.call_history)

    def test_untracked_script_is_NOT_logged_to_table_when_run(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(False)
        self.assertTrue("record a in 1_c" not in self.fake_db_handler.call_history)

    def test_tracked_script_is_run_once_to_table_when_run_many_times(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(True)
        self.runner.execute_scripts(True)
        self.runner.execute_scripts(True)
        r = [x for x in self.fake_db_handler.call_history if x == "check a in 1_c"]
        self.assertEqual(3, len(r), "checked three times")
        r = [x for x in self.fake_db_handler.call_history if x == "record a in 1_c"]
        self.assertEqual(1, len(r), "only recorded once")

    def test_untracked_script_can_be_run_many_times(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(False)
        self.runner.execute_scripts(False)
        self.runner.execute_scripts(False)
        r = [x for x in self.fake_db_handler.call_history if x == "check a in 1_c"]
        self.assertEqual(0, len(r), "not checked")
        r = [x for x in self.fake_db_handler.call_history if x == "execute sql in 1_c"]
        self.assertEqual(3, len(r), "ran three times")

    def test_tracked_script_is_not_rerun_if_its_content_changed(self):
        self.runner.add_script("a", "1", "sql")
        self.runner.execute_scripts(True)
        self.runner.clear_all_scripts()
        self.runner.add_script("a", "1", "changed_sql")
        r = [x for x in self.fake_db_handler.call_history if x == "execute changed_sql in 1_c"]
        self.assertEqual(0, len(r), "script with same name not re-run")

    def test_can_run_scripts_in_several_databases(self):
        self.runner.add_script("a", "1", "aaa")
        self.runner.add_script("b", "2", "bbb")
        self.runner.execute_scripts(True)
        r = [x for x in self.fake_db_handler.call_history if x in ["execute aaa in 1_c", "execute bbb in 2_c"]]
        self.assertEqual(2, len(r), "both run")


    def test_can_have_many_scripts(self):
        self.runner.add_script("a", "1", "aaa")
        self.runner.add_script("b", "1", "bbb")
        self.runner.add_script("a2", "2", "aaa")
        self.runner.add_script("b2", "2", "bbb")
        self.runner.execute_scripts(True)

        expected = [
            "execute aaa in 1_c",
            "execute bbb in 1_c",
            "execute aaa in 2_c",
            "execute bbb in 2_c"
        ]
        r = [x for x in self.fake_db_handler.call_history if x in expected]
        self.assertEqual(4, len(r), "all run")


    def test_script_can_be_composed_of_several_batches(self):
        sql = "sql; sql"
        self.runner.add_script("a", "1", "sql; sql")
        self.runner.execute_scripts(True)
        r = [x for x in self.fake_db_handler.call_history if x == "execute sql; sql in 1_c"]
        self.assertEqual(1, len(r), "both run")

    def test_bad_migration_file_stops_all_subsequent_migrations(self):
        self.runner.add_script("a", "1", "aaa")
        self.runner.add_script("b", "1", "bbb")
        self.runner.add_script("bad_file", "2", "some_bad_sql")
        self.runner.add_script("b2", "2", "bbb")
        self.fake_db_handler.simulate_exception_on("some_bad_sql")
        self.assertRaises(Exception, self.runner.execute_scripts, True)
        expected = [
            "execute aaa in 1_c",
            "execute bbb in 1_c"
        ]
        r = [x for x in self.fake_db_handler.call_history if x in expected]
        self.assertEqual(len(expected), len(r), "all run")