summaryrefslogtreecommitdiff
path: root/oslo_db/tests/sqlalchemy/test_migrations.py
diff options
context:
space:
mode:
Diffstat (limited to 'oslo_db/tests/sqlalchemy/test_migrations.py')
-rw-r--r--oslo_db/tests/sqlalchemy/test_migrations.py187
1 files changed, 187 insertions, 0 deletions
diff --git a/oslo_db/tests/sqlalchemy/test_migrations.py b/oslo_db/tests/sqlalchemy/test_migrations.py
index ad71757..1bae701 100644
--- a/oslo_db/tests/sqlalchemy/test_migrations.py
+++ b/oslo_db/tests/sqlalchemy/test_migrations.py
@@ -307,3 +307,190 @@ class ModelsMigrationsSyncPsql(ModelsMigrationSyncMixin,
def test_models_not_sync(self):
self._test_models_not_sync()
+
+
+class TestOldCheckForeignKeys(test_base.DbTestCase):
+ def setUp(self):
+ super(TestOldCheckForeignKeys, self).setUp()
+
+ test = self
+
+ class MigrateSync(migrate.ModelsMigrationsSync):
+ def get_engine(self):
+ return test.engine
+
+ def get_metadata(self):
+ return test.metadata
+
+ def db_sync(self):
+ raise NotImplementedError()
+
+ self.migration_sync = MigrateSync()
+
+ def _fk_added_fixture(self):
+ self.metadata = sa.MetaData()
+ self.metadata_migrations = sa.MetaData()
+
+ sa.Table(
+ 'testtbl_one', self.metadata,
+ sa.Column('id', sa.Integer, primary_key=True),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_two', self.metadata,
+ sa.Column('id', sa.Integer, primary_key=True),
+ sa.Column('tone_id', sa.Integer),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_one', self.metadata_migrations,
+ sa.Column('id', sa.Integer, primary_key=True),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_two', self.metadata_migrations,
+ sa.Column('id', sa.Integer, primary_key=True),
+ sa.Column(
+ 'tone_id', sa.Integer,
+ sa.ForeignKey('testtbl_one.id', name="tone_id_fk")),
+ mysql_engine='InnoDB'
+ )
+
+ def _fk_removed_fixture(self):
+ self.metadata = sa.MetaData()
+ self.metadata_migrations = sa.MetaData()
+
+ sa.Table(
+ 'testtbl_one', self.metadata,
+ sa.Column('id', sa.Integer, primary_key=True),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_two', self.metadata,
+ sa.Column('id', sa.Integer, primary_key=True),
+ sa.Column(
+ 'tone_id', sa.Integer,
+ sa.ForeignKey('testtbl_one.id', name="tone_id_fk")),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_one', self.metadata_migrations,
+ sa.Column('id', sa.Integer, primary_key=True),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_two', self.metadata_migrations,
+ sa.Column('id', sa.Integer, primary_key=True),
+ sa.Column('tone_id', sa.Integer),
+ mysql_engine='InnoDB'
+ )
+
+ def _fk_no_change_fixture(self):
+ self.metadata = sa.MetaData()
+ self.metadata_migrations = sa.MetaData()
+
+ sa.Table(
+ 'testtbl_one', self.metadata,
+ sa.Column('id', sa.Integer, primary_key=True),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_two', self.metadata,
+ sa.Column('id', sa.Integer, primary_key=True),
+ sa.Column(
+ 'tone_id', sa.Integer,
+ sa.ForeignKey('testtbl_one.id', name="tone_id_fk")),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_one', self.metadata_migrations,
+ sa.Column('id', sa.Integer, primary_key=True),
+ mysql_engine='InnoDB'
+ )
+
+ sa.Table(
+ 'testtbl_two', self.metadata_migrations,
+ sa.Column('id', sa.Integer, primary_key=True),
+ sa.Column(
+ 'tone_id', sa.Integer,
+ sa.ForeignKey('testtbl_one.id', name="tone_id_fk")),
+ mysql_engine='InnoDB'
+ )
+
+ def _run_test(self):
+ self.metadata.create_all(bind=self.engine)
+ return self.migration_sync.check_foreign_keys(
+ self.metadata_migrations, self.engine)
+
+ def _compare_diffs(self, diffs, compare_to):
+ diffs = [
+ (
+ cmd,
+ fk._get_colspec() if isinstance(fk, sa.ForeignKey)
+ else "tone_id_fk" if fk is None # sqlite workaround
+ else fk,
+ tname, fk_info
+ )
+ for cmd, fk, tname, fk_info in diffs
+ ]
+ self.assertEqual(diffs, compare_to)
+
+ def test_fk_added(self):
+ self._fk_added_fixture()
+ diffs = self._run_test()
+
+ self._compare_diffs(
+ diffs,
+ [(
+ 'add_key',
+ 'testtbl_one.id',
+ 'testtbl_two',
+ self.migration_sync.FKInfo(
+ constrained_columns=('tone_id',),
+ referred_table='testtbl_one',
+ referred_columns=('id',))
+ )]
+ )
+
+ def test_fk_removed(self):
+ self._fk_removed_fixture()
+ diffs = self._run_test()
+
+ self._compare_diffs(
+ diffs,
+ [(
+ 'drop_key',
+ "tone_id_fk",
+ 'testtbl_two',
+ self.migration_sync.FKInfo(
+ constrained_columns=('tone_id',),
+ referred_table='testtbl_one',
+ referred_columns=('id',))
+ )]
+ )
+
+ def test_fk_no_change(self):
+ self._fk_no_change_fixture()
+ diffs = self._run_test()
+
+ self._compare_diffs(
+ diffs,
+ [])
+
+
+class PGTestOldCheckForeignKeys(
+ TestOldCheckForeignKeys, test_base.PostgreSQLOpportunisticTestCase):
+ pass
+
+
+class MySQLTestOldCheckForeignKeys(
+ TestOldCheckForeignKeys, test_base.MySQLOpportunisticTestCase):
+ pass