def setUp(self): self.fake_db_handler = FakeDatabaseHandler() self.runner = self.create_script_runner() self.runner.is_debug_printing = False
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")