diff options
Diffstat (limited to 'oslo_db/tests/sqlalchemy/test_migrations.py')
-rw-r--r-- | oslo_db/tests/sqlalchemy/test_migrations.py | 187 |
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 |