diff options
-rw-r--r-- | oslo_db/sqlalchemy/test_migrations.py | 75 | ||||
-rw-r--r-- | oslo_db/tests/old_import_api/sqlalchemy/test_migrations.py | 2 | ||||
-rw-r--r-- | oslo_db/tests/old_import_api/sqlalchemy/test_sqlalchemy.py | 37 | ||||
-rw-r--r-- | oslo_db/tests/sqlalchemy/test_migrations.py | 2 | ||||
-rw-r--r-- | oslo_db/tests/sqlalchemy/test_sqlalchemy.py | 37 |
5 files changed, 49 insertions, 104 deletions
diff --git a/oslo_db/sqlalchemy/test_migrations.py b/oslo_db/sqlalchemy/test_migrations.py index 6c21275..8990790 100644 --- a/oslo_db/sqlalchemy/test_migrations.py +++ b/oslo_db/sqlalchemy/test_migrations.py @@ -15,7 +15,6 @@ # under the License. import abc -import collections import logging import pprint @@ -511,73 +510,6 @@ class ModelsMigrationsSync(object): for table in tbs: conn.execute(schema.DropTable(table)) - FKInfo = collections.namedtuple('fk_info', ['constrained_columns', - 'referred_table', - 'referred_columns']) - - def check_foreign_keys(self, metadata, bind): - """Compare foreign keys between model and db table. - - :returns: a list that contains information about: - - * should be a new key added or removed existing, - * name of that key, - * source table, - * referred table, - * constrained columns, - * referred columns - - Output:: - - [('drop_key', - 'testtbl_fk_check_fkey', - 'testtbl', - fk_info(constrained_columns=(u'fk_check',), - referred_table=u'table', - referred_columns=(u'fk_check',)))] - - """ - - diff = [] - insp = sqlalchemy.engine.reflection.Inspector.from_engine(bind) - # Get all tables from db - db_tables = insp.get_table_names() - # Get all tables from models - model_tables = metadata.tables - for table in db_tables: - if table not in model_tables: - continue - # Get all necessary information about key of current table from db - fk_db = dict((self._get_fk_info_from_db(i), i['name']) - for i in insp.get_foreign_keys(table)) - fk_db_set = set(fk_db.keys()) - # Get all necessary information about key of current table from - # models - fk_models = dict((self._get_fk_info_from_model(fk), fk) - for fk in model_tables[table].foreign_keys) - fk_models_set = set(fk_models.keys()) - for key in (fk_db_set - fk_models_set): - diff.append(('drop_key', fk_db[key], table, key)) - LOG.info(("Detected removed foreign key %(fk)r on " - "table %(table)r"), {'fk': fk_db[key], - 'table': table}) - for key in (fk_models_set - fk_db_set): - diff.append(('add_key', fk_models[key], table, key)) - LOG.info(( - "Detected added foreign key for column %(fk)r on table " - "%(table)r"), {'fk': fk_models[key].column.name, - 'table': table}) - return diff - - def _get_fk_info_from_db(self, fk): - return self.FKInfo(tuple(fk['constrained_columns']), - fk['referred_table'], - tuple(fk['referred_columns'])) - - def _get_fk_info_from_model(self, fk): - return self.FKInfo((fk.parent.name,), fk.column.table.name, - (fk.column.name,)) - def test_models_sync(self): # recent versions of sqlalchemy and alembic are needed for running of # this test, but we already have them in requirements @@ -602,11 +534,8 @@ class ModelsMigrationsSync(object): mc = alembic.migration.MigrationContext.configure(conn, opts=opts) # compare schemas and fail with diff, if it's not empty - diff1 = alembic.autogenerate.compare_metadata(mc, - self.get_metadata()) - diff2 = self.check_foreign_keys(self.get_metadata(), - self.get_engine()) - diff = diff1 + diff2 + diff = alembic.autogenerate.compare_metadata(mc, + self.get_metadata()) if diff: msg = pprint.pformat(diff, indent=2, width=20) self.fail( diff --git a/oslo_db/tests/old_import_api/sqlalchemy/test_migrations.py b/oslo_db/tests/old_import_api/sqlalchemy/test_migrations.py index 1c560e8..b537ea4 100644 --- a/oslo_db/tests/old_import_api/sqlalchemy/test_migrations.py +++ b/oslo_db/tests/old_import_api/sqlalchemy/test_migrations.py @@ -290,7 +290,7 @@ class ModelsMigrationSyncMixin(test.BaseTestCase): self.assertIn('bool_wo_default', msg) self.assertIn('defaulttest', msg) self.assertIn('defaulttest3', msg) - self.assertIn('drop_key', msg) + self.assertIn('remove_fk', msg) class ModelsMigrationsSyncMysql(ModelsMigrationSyncMixin, diff --git a/oslo_db/tests/old_import_api/sqlalchemy/test_sqlalchemy.py b/oslo_db/tests/old_import_api/sqlalchemy/test_sqlalchemy.py index 8d45cd4..2c80430 100644 --- a/oslo_db/tests/old_import_api/sqlalchemy/test_sqlalchemy.py +++ b/oslo_db/tests/old_import_api/sqlalchemy/test_sqlalchemy.py @@ -533,22 +533,31 @@ class MysqlConnectTest(test_base.MySQLOpportunisticTestCase): log.output) -# NOTE(dhellmann): This test no longer works as written. The code in -# oslo_db.sqlalchemy.session filters out lines from modules under -# oslo_db, and now this test is under oslo_db, so the test filename -# does not appear in the context for the error message. LP #1405376 +class PatchStacktraceTest(test_base.DbTestCase): -# class PatchStacktraceTest(test_base.DbTestCase): + def test_trace(self): + engine = self.engine -# def test_trace(self): -# engine = self.engine -# private_session._add_trace_comments(engine) -# conn = engine.connect() -# with mock.patch.object(engine.dialect, "do_execute") as mock_exec: + # NOTE(viktors): The code in oslo_db.sqlalchemy.session filters out + # lines from modules under oslo_db, so we should remove + # "oslo_db/" from file path in traceback. + import traceback + orig_extract_stack = traceback.extract_stack -# conn.execute("select * from table") + def extract_stack(): + return [(row[0].replace("oslo_db/", ""), row[1], row[2], row[3]) + for row in orig_extract_stack()] -# call = mock_exec.mock_calls[0] + with mock.patch("traceback.extract_stack", side_effect=extract_stack): -# # we're the caller, see that we're in there -# self.assertTrue("tests/sqlalchemy/test_sqlalchemy.py" in call[1][1]) + private_session._add_trace_comments(engine) + conn = engine.connect() + with mock.patch.object(engine.dialect, "do_execute") as mock_exec: + + conn.execute("select * from table") + + call = mock_exec.mock_calls[0] + + # we're the caller, see that we're in there + self.assertIn("tests/old_import_api/sqlalchemy/test_sqlalchemy.py", + call[1][1]) diff --git a/oslo_db/tests/sqlalchemy/test_migrations.py b/oslo_db/tests/sqlalchemy/test_migrations.py index a372d8b..ad71757 100644 --- a/oslo_db/tests/sqlalchemy/test_migrations.py +++ b/oslo_db/tests/sqlalchemy/test_migrations.py @@ -290,7 +290,7 @@ class ModelsMigrationSyncMixin(test.BaseTestCase): self.assertIn('bool_wo_default', msg) self.assertIn('defaulttest', msg) self.assertIn('defaulttest3', msg) - self.assertIn('drop_key', msg) + self.assertIn('remove_fk', msg) class ModelsMigrationsSyncMysql(ModelsMigrationSyncMixin, diff --git a/oslo_db/tests/sqlalchemy/test_sqlalchemy.py b/oslo_db/tests/sqlalchemy/test_sqlalchemy.py index 84cbbcf..26cda61 100644 --- a/oslo_db/tests/sqlalchemy/test_sqlalchemy.py +++ b/oslo_db/tests/sqlalchemy/test_sqlalchemy.py @@ -633,23 +633,30 @@ class CreateEngineTest(oslo_test.BaseTestCase): ) -# NOTE(dhellmann): This test no longer works as written. The code in -# oslo_db.sqlalchemy.session filters out lines from modules under -# oslo_db, and now this test is under oslo_db, so the test filename -# does not appear in the context for the error message. LP #1405376 +class PatchStacktraceTest(test_base.DbTestCase): -# class PatchStacktraceTest(test_base.DbTestCase): + def test_trace(self): + engine = self.engine -# def test_trace(self): -# engine = self.engine -# session._add_trace_comments(engine) -# conn = engine.connect() -# with mock.patch.object(engine.dialect, "do_execute") as mock_exec: + # NOTE(viktors): The code in oslo_db.sqlalchemy.session filters out + # lines from modules under oslo_db, so we should remove + # "oslo_db/" from file path in traceback. + import traceback + orig_extract_stack = traceback.extract_stack -# conn.execute("select * from table") + def extract_stack(): + return [(row[0].replace("oslo_db/", ""), row[1], row[2], row[3]) + for row in orig_extract_stack()] -# call = mock_exec.mock_calls[0] + with mock.patch("traceback.extract_stack", side_effect=extract_stack): -# # we're the caller, see that we're in there -# self.assertIn("oslo_db/tests/sqlalchemy/test_sqlalchemy.py", -# call[1][1]) + session._add_trace_comments(engine) + conn = engine.connect() + with mock.patch.object(engine.dialect, "do_execute") as mock_exec: + + conn.execute("select * from table") + + call = mock_exec.mock_calls[0] + + # we're the caller, see that we're in there + self.assertIn("tests/sqlalchemy/test_sqlalchemy.py", call[1][1]) |