summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mailman/database/alembic/versions/51b7f92bd06c_initial.py4
-rw-r--r--src/mailman/database/factory.py1
-rw-r--r--src/mailman/database/tests/test_factory.py46
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)