summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAurélien Bompard2014-10-06 14:47:38 +0200
committerAurélien Bompard2014-10-06 14:47:38 +0200
commitcbbac03083357ca928d104d386d9e3008c937581 (patch)
tree28b9296f92666896a2c2dbd5ef39922ee0bb6573 /src
parentee21bba194822d347f008dc7a2ddda3d9af39b4e (diff)
downloadmailman-cbbac03083357ca928d104d386d9e3008c937581.tar.gz
mailman-cbbac03083357ca928d104d386d9e3008c937581.tar.zst
mailman-cbbac03083357ca928d104d386d9e3008c937581.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/database/tests/test_factory.py54
-rw-r--r--src/mailman/testing/layers.py38
2 files changed, 53 insertions, 39 deletions
diff --git a/src/mailman/database/tests/test_factory.py b/src/mailman/database/tests/test_factory.py
index 7becdbfde..42a05fe1b 100644
--- a/src/mailman/database/tests/test_factory.py
+++ b/src/mailman/database/tests/test_factory.py
@@ -40,6 +40,7 @@ from mailman.database.model import Model
class TestSchemaManager(unittest.TestCase):
+
layer = DatabaseLayer
def setUp(self):
@@ -55,23 +56,22 @@ class TestSchemaManager(unittest.TestCase):
Model.metadata.remove(version)
- def _db_is_setup(self):
- md = MetaData()
- md.reflect(bind=config.db.engine)
- return "mailinglist" in md.tables and "alembic_version" in md.tables
-
def _table_exists(self, tablename):
md = MetaData()
md.reflect(bind=config.db.engine)
return tablename in md.tables
- def _create_storm_version_table(self):
- table = Table("version", Model.metadata,
- Column("id", Integer, primary_key=True),
- Column("component", Unicode),
- Column("version", Unicode),
- )
- table.create(config.db.engine)
+ def _create_storm_version_table(self, revision):
+ version_table = Table("version", Model.metadata,
+ Column("id", Integer, primary_key=True),
+ Column("component", Unicode),
+ Column("version", Unicode),
+ )
+ version_table.create(config.db.engine)
+ config.db.store.execute(version_table.insert().values(
+ component='schema', version=revision))
+ config.db.commit()
+
def test_current_db(self):
"""The database is already at the latest version"""
@@ -84,27 +84,19 @@ class TestSchemaManager(unittest.TestCase):
def test_initial(self):
"""No existing database"""
- self.assertFalse(self._table_exists("mailinglist")
- and self._table_exists("alembic_version"))
+ self.assertFalse(self._table_exists("mailinglist"))
+ self.assertFalse(self._table_exists("alembic_version"))
self.schema_mgr._upgrade = Mock()
self.schema_mgr.setup_db()
self.assertFalse(self.schema_mgr._upgrade.called)
- self.assertTrue(self._table_exists("mailinglist")
- and self._table_exists("alembic_version"))
+ self.assertTrue(self._table_exists("mailinglist"))
+ self.assertTrue(self._table_exists("alembic_version"))
def test_storm(self):
"""Existing Storm database"""
Model.metadata.create_all(config.db.engine)
- version_table = Table("version", Model.metadata,
- Column("id", Integer, primary_key=True),
- Column("component", Unicode),
- Column("version", Unicode),
- )
- version_table.create(config.db.engine)
- config.db.store.execute(version_table.insert().values(
- component='schema',
- version=self.schema_mgr.LAST_STORM_SCHEMA_VERSION))
- config.db.commit()
+ self._create_storm_version_table(
+ self.schema_mgr.LAST_STORM_SCHEMA_VERSION)
self.schema_mgr._create = Mock()
self.schema_mgr.setup_db()
self.assertFalse(self.schema_mgr._create.called)
@@ -115,15 +107,7 @@ class TestSchemaManager(unittest.TestCase):
def test_old_storm(self):
"""Existing Storm database in an old version"""
Model.metadata.create_all(config.db.engine)
- version_table = Table("version", Model.metadata,
- Column("id", Integer, primary_key=True),
- Column("component", Unicode),
- Column("version", Unicode),
- )
- version_table.create(config.db.engine)
- config.db.store.execute(version_table.insert().values(
- component='schema', version='001'))
- config.db.commit()
+ self._create_storm_version_table("001")
self.schema_mgr._create = Mock()
self.assertRaises(RuntimeError, self.schema_mgr.setup_db)
self.assertFalse(self.schema_mgr._create.called)
diff --git a/src/mailman/testing/layers.py b/src/mailman/testing/layers.py
index 304f9a891..68cb07f8c 100644
--- a/src/mailman/testing/layers.py
+++ b/src/mailman/testing/layers.py
@@ -49,6 +49,7 @@ from lazr.config import as_boolean
from pkg_resources import resource_string
from sqlalchemy import MetaData
from textwrap import dedent
+from zope import event
from zope.component import getUtility
from mailman.config import config
@@ -100,7 +101,9 @@ class ConfigLayer(MockAndMonkeyLayer):
# Set up the basic configuration stuff. Turn off path creation until
# we've pushed the testing config.
config.create_paths = False
- initialize.initialize_1(INHIBIT_CONFIG_FILE)
+ if not event.subscribers:
+ # only if not yet initialized by another layer
+ initialize.initialize_1(INHIBIT_CONFIG_FILE)
assert cls.var_dir is None, 'Layer already set up'
# Calculate a temporary VAR_DIR directory so that run-time artifacts
# of the tests won't tread on the installation's data. This also
@@ -312,9 +315,11 @@ class RESTLayer(SMTPLayer):
-class DatabaseLayer(MockAndMonkeyLayer):
+class DatabaseLayer:
"""Layer for database tests"""
+ var_dir = None
+
@classmethod
def _drop_all_tables(cls):
Model.metadata.drop_all(config.db.engine)
@@ -327,12 +332,37 @@ class DatabaseLayer(MockAndMonkeyLayer):
def setUp(cls):
# Set up the basic configuration stuff. Turn off path creation.
config.create_paths = False
- initialize.initialize_1(INHIBIT_CONFIG_FILE)
+ if not event.subscribers:
+ # only if not yet initialized by another layer
+ initialize.initialize_1(INHIBIT_CONFIG_FILE)
# Don't initialize the database.
+ cls.var_dir = tempfile.mkdtemp()
+ test_config = dedent("""
+ [mailman]
+ layout: testing
+ [paths.testing]
+ var_dir: {0}
+ [devmode]
+ testing: yes
+ """.format(cls.var_dir))
+ # Read the testing config and push it.
+ test_config += resource_string('mailman.testing', 'testing.cfg')
+ config.create_paths = True
+ config.push('test config', test_config)
+ # Write the configuration file for subprocesses and set up the config
+ # object to pass that properly on the -C option.
+ config_file = os.path.join(cls.var_dir, 'test.cfg')
+ with open(config_file, 'w') as fp:
+ fp.write(test_config)
+ print(file=fp)
+ config.filename = config_file
@classmethod
def tearDown(cls):
- cls._drop_all_tables()
+ assert cls.var_dir is not None, 'Layer not set up'
+ shutil.rmtree(cls.var_dir)
+ config.pop('test config')
+ cls.var_dir = None
@classmethod
def testTearDown(cls):