diff options
| -rw-r--r-- | src/mailman/database/alembic/versions/51b7f92bd06c_initial.py | 4 | ||||
| -rw-r--r-- | src/mailman/database/factory.py | 1 | ||||
| -rw-r--r-- | src/mailman/database/tests/test_factory.py | 46 |
3 files changed, 41 insertions, 10 deletions
diff --git a/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py b/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py index c5b3e01c5..226bff7f6 100644 --- a/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py +++ b/src/mailman/database/alembic/versions/51b7f92bd06c_initial.py @@ -17,7 +17,9 @@ import sqlalchemy as sa def upgrade(): ### commands auto generated by Alembic - please adjust! ### op.drop_table('version') - op.drop_column('mailinglist', 'acceptable_aliases_id') + if op.get_bind().dialect.name != "sqlite": + # SQLite does not support dropping columns + op.drop_column('mailinglist', 'acceptable_aliases_id') op.create_index(op.f('ix_user__user_id'), 'user', ['_user_id'], unique=False) op.drop_index('ix_user_user_id', table_name='user') ### end Alembic commands ### diff --git a/src/mailman/database/factory.py b/src/mailman/database/factory.py index ea2048143..8a5909283 100644 --- a/src/mailman/database/factory.py +++ b/src/mailman/database/factory.py @@ -88,6 +88,7 @@ class SchemaManager: def _create(self): # initial DB creation Model.metadata.create_all(self.database.engine) + self.database.commit() command.stamp(alembic_cfg, "head") def _upgrade(self): diff --git a/src/mailman/database/tests/test_factory.py b/src/mailman/database/tests/test_factory.py index a87bca7be..bb37d01c9 100644 --- a/src/mailman/database/tests/test_factory.py +++ b/src/mailman/database/tests/test_factory.py @@ -30,6 +30,8 @@ import types import alembic.command from mock import Mock from sqlalchemy import MetaData, Table, Column, Integer, Unicode +from sqlalchemy.schema import Index +from sqlalchemy.exc import ProgrammingError, OperationalError from mailman.config import config from mailman.testing.layers import ConfigLayer @@ -49,15 +51,13 @@ class TestSchemaManager(unittest.TestCase): Model.metadata.drop_all(config.db.engine) md = MetaData() md.reflect(bind=config.db.engine) - if "alembic_version" in md.tables: - md.tables["alembic_version"].drop(config.db.engine) + for tablename in ("alembic_version", "version"): + if tablename in md.tables: + md.tables[tablename].drop(config.db.engine) self.schema_mgr = SchemaManager(config.db) def tearDown(self): - if "version" in Model.metadata.tables: - version = Model.metadata.tables["version"] - version.drop(config.db.engine, checkfirst=True) - Model.metadata.remove(version) + self._drop_storm_database() # Restore a virgin DB Model.metadata.create_all(config.db.engine) @@ -67,7 +67,7 @@ class TestSchemaManager(unittest.TestCase): md.reflect(bind=config.db.engine) return tablename in md.tables - def _create_storm_version_table(self, revision): + def _create_storm_database(self, revision): version_table = Table("version", Model.metadata, Column("id", Integer, primary_key=True), Column("component", Unicode), @@ -77,6 +77,34 @@ class TestSchemaManager(unittest.TestCase): config.db.store.execute(version_table.insert().values( component='schema', version=revision)) config.db.commit() + # Other Storm specific changes, those SQL statements hopefully work on + # all DB engines... + config.db.engine.execute( + "ALTER TABLE mailinglist ADD COLUMN acceptable_aliases_id INT") + Index("ix_user__user_id").drop(bind=config.db.engine) + # Don't pollute our main metadata object, create a new one + md = MetaData() + user_table = Model.metadata.tables["user"].tometadata(md) + Index("ix_user_user_id", user_table.c._user_id + ).create(bind=config.db.engine) + config.db.commit() + + def _drop_storm_database(self): + """ + Remove the leftovers from a Storm DB. + (you must issue a drop_all() afterwards) + """ + if "version" in Model.metadata.tables: + version = Model.metadata.tables["version"] + version.drop(config.db.engine, checkfirst=True) + Model.metadata.remove(version) + try: + Index("ix_user_user_id").drop(bind=config.db.engine) + except (ProgrammingError, OperationalError) as e: + # non-existant (PGSQL raises a ProgrammingError, while SQLite + # raises an OperationalError) + pass + config.db.commit() def test_current_db(self): @@ -101,7 +129,7 @@ class TestSchemaManager(unittest.TestCase): def test_storm(self): """Existing Storm database""" Model.metadata.create_all(config.db.engine) - self._create_storm_version_table( + self._create_storm_database( self.schema_mgr.LAST_STORM_SCHEMA_VERSION) self.schema_mgr._create = Mock() self.schema_mgr.setup_db() @@ -113,7 +141,7 @@ class TestSchemaManager(unittest.TestCase): def test_old_storm(self): """Existing Storm database in an old version""" Model.metadata.create_all(config.db.engine) - self._create_storm_version_table("001") + self._create_storm_database("001") self.schema_mgr._create = Mock() self.assertRaises(RuntimeError, self.schema_mgr.setup_db) self.assertFalse(self.schema_mgr._create.called) |
