Пример #1
0
    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)
Пример #2
0
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")