def setUp(self): self.fake_db_handler = FakeDatabaseHandler() self.fake_db_source = FakeDatabaseSource() # In real life, these would be read from an .ini file, # or from the file system. self.fake_db_source.connections = { "1": { "dbname": "db_1", "conn": "db_1" }, "2": { "dbname": "db_2", "conn": "db_2" } } self.fake_db_source.baseline_schema = { "1": [("a.txt", "a_sql"), ("b.txt", "b_sql")], "2": [("c.txt", "c_sql"), ("d.txt", "d_sql")] } self.fake_db_source.migrations = { "1": [("mig1.txt", "mig1_sql"), ("mig2.txt", "mig2_sql")], "2": [("mig3.txt", "mig3_sql"), ("mig4.txt", "mig4_sql")] } self.fake_db_source.code = { "1": [("code1.txt", "code1_sql"), ("code2.txt", "code2_sql")], "2": [("code3.txt", "code3_sql"), ("code4.txt", "code4_sql")] } self.fake_db_source.reference_data = { "1": [("ref1.txt", "ref1_sql"), ("ref2.txt", "ref2_sql")], "2": [("ref3.txt", "ref3_sql"), ("ref4.txt", "ref4_sql")] } self.migrator = Migrator(self.fake_db_source, self.fake_db_handler)
class MigratorTests(unittest.TestCase): """High-level functional tests.""" longMessage = True def setUp(self): self.fake_db_handler = FakeDatabaseHandler() self.fake_db_source = FakeDatabaseSource() # In real life, these would be read from an .ini file, # or from the file system. self.fake_db_source.connections = { "1": { "dbname": "db_1", "conn": "db_1" }, "2": { "dbname": "db_2", "conn": "db_2" } } self.fake_db_source.baseline_schema = { "1": [("a.txt", "a_sql"), ("b.txt", "b_sql")], "2": [("c.txt", "c_sql"), ("d.txt", "d_sql")] } self.fake_db_source.migrations = { "1": [("mig1.txt", "mig1_sql"), ("mig2.txt", "mig2_sql")], "2": [("mig3.txt", "mig3_sql"), ("mig4.txt", "mig4_sql")] } self.fake_db_source.code = { "1": [("code1.txt", "code1_sql"), ("code2.txt", "code2_sql")], "2": [("code3.txt", "code3_sql"), ("code4.txt", "code4_sql")] } self.fake_db_source.reference_data = { "1": [("ref1.txt", "ref1_sql"), ("ref2.txt", "ref2_sql")], "2": [("ref3.txt", "ref3_sql"), ("ref4.txt", "ref4_sql")] } self.migrator = Migrator(self.fake_db_source, self.fake_db_handler) def assert_db_history_contains(self, expected, msg): r = [x for x in self.fake_db_handler.call_history if x in expected] if (len(r) != len(expected)): self.assertFalse(True, "Missing expected matches {0}, got {1}".format(expected, r)) def assert_db_history_does_not_contain(self, unexpected, msg): r = [x for x in self.fake_db_handler.call_history if x in unexpected] if (len(r) != 0): self.assertFalse(True, "Have excess matches {0} in {1}".format(unexpected, r)) ##################################### # Creating a new database. def test_delete_make_new_creates_empty_database_does_not_track_scripts(self): self.migrator.delete_make_new("1") expected = ["create db_1"] unexpected = ["create db_2", "execute c_sql in db_2", "execute d_sql in db_2", "execute a_sql in db_1", "execute b_sql in db_1"] self.assert_db_history_contains(expected, "db_1 run") self.assert_db_history_does_not_contain(unexpected, "db_2 not run") def test_can_create_multiple_databases(self): self.migrator.delete_make_new("1", "2") expected = ["create db_1", "create db_2"] unexpected = ["execute c_sql in db_2", "execute d_sql in db_2", "execute a_sql in db_1", "execute b_sql in db_1"] self.assert_db_history_contains(expected, "db_1 and db_2 run") self.assert_db_history_does_not_contain(unexpected, "not tracked") ##################################### # Running baseline script. More exhaustive testing is not # nessary, as that has already been handled by # test_scriptrunner.py def test_happy_path_can_run_baseline_schema(self): self.migrator.delete_make_new("1") self.migrator.run_baseline_schema("1") expected = ["create db_1", "execute a_sql in db_1", "execute b_sql in db_1"] unexpected = ["create db_2", "execute c_sql in db_2", "execute d_sql in db_2"] self.assert_db_history_contains(expected, "db_1 run") self.assert_db_history_does_not_contain(unexpected, "db_2 not run") def test_baseline_cannot_be_run_on_database_that_already_has_tables(self): self.fake_db_handler.contains_userdefined_tables = True self.assertRaises(MigrationException, self.migrator.run_baseline_schema, "1") def test_migrations_are_tracked(self): self.migrator.delete_make_new("1") self.migrator.run_migrations("1") expected = [ 'create db_1', 'create_track_tbl in db_1', 'check mig1.txt in db_1', 'execute mig1_sql in db_1', 'record mig1.txt in db_1', 'check mig2.txt in db_1', 'execute mig2_sql in db_1' ] self.assert_db_history_contains(expected, "db_1 run") unexpected = ["create db_2", "execute c_sql in db_2", "execute d_sql in db_2"] self.assert_db_history_does_not_contain(unexpected, "db_2 not run") def test_code_runs_are_not_tracked(self): self.migrator.delete_make_new("1") self.migrator.run_code_definitions("1") expected = ['create db_1', 'execute code1_sql in db_1', 'execute code2_sql in db_1'] self.assert_db_history_contains(expected, "db_1 run") unexpected = ["create db_2", "execute c_sql in db_2", "execute d_sql in db_2"] self.assert_db_history_does_not_contain(unexpected, "db_2 not run") def test_ref_data_runs_are_not_tracked(self): self.migrator.delete_make_new("1") self.migrator.run_reference_data("1") expected = ['create db_1', 'execute ref1_sql in db_1', 'execute ref2_sql in db_1'] self.assert_db_history_contains(expected, "db_1 run") unexpected = ["create db_2", "execute c_sql in db_2", "execute d_sql in db_2"] self.assert_db_history_does_not_contain(unexpected, "db_2 not run")