summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oslo_db/sqlalchemy/test_migrations.py75
-rw-r--r--oslo_db/tests/old_import_api/sqlalchemy/test_migrations.py2
-rw-r--r--oslo_db/tests/old_import_api/sqlalchemy/test_sqlalchemy.py37
-rw-r--r--oslo_db/tests/sqlalchemy/test_migrations.py2
-rw-r--r--oslo_db/tests/sqlalchemy/test_sqlalchemy.py37
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])