Barry Warsaw pushed to branch master at mailman / Mailman
Commits:
1602cecd by Barry Warsaw at 2015-12-29T17:23:54Z
Coverage improvements.
* Boost coverage.
* Don't report coverage on the test modules.
* In one test, when acquiring the lock, set a timeout. Hopefully this will
eliminate the occasional test deadlock.
* Fix a buglet in wrap()
- - - - -
8e69b848 by Barry Warsaw at 2015-12-29T17:56:10Z
More coverage.
- - - - -
11 changed files:
- coverage.ini
- src/mailman/app/tests/test_lifecycle.py
- src/mailman/bin/tests/test_master.py
- src/mailman/model/tests/test_uid.py
- src/mailman/model/tests/test_workflow.py
- src/mailman/model/uid.py
- src/mailman/testing/nose.py
- src/mailman/utilities/modules.py
- src/mailman/utilities/string.py
- src/mailman/utilities/tests/test_import.py
- + src/mailman/utilities/tests/test_string.py
Changes:
=====================================
coverage.ini
=====================================
--- a/coverage.ini
+++ b/coverage.ini
@@ -5,6 +5,7 @@ omit =
setup*
*/showme.py
.tox/coverage/lib/python3.5/site-packages/*
+ */test_*.py
[paths]
source =
=====================================
src/mailman/app/tests/test_lifecycle.py
=====================================
--- a/src/mailman/app/tests/test_lifecycle.py
+++ b/src/mailman/app/tests/test_lifecycle.py
@@ -28,8 +28,10 @@ import unittest
from mailman.interfaces.address import InvalidEmailAddressError
from mailman.interfaces.domain import BadDomainSpecificationError
+from mailman.interfaces.listmanager import IListManager
from mailman.app.lifecycle import create_list, remove_list
from mailman.testing.layers import ConfigLayer
+from zope.component import getUtility
@@ -55,3 +57,16 @@ class TestLifecycle(unittest.TestCase):
self.addCleanup(shutil.rmtree, mlist.data_path)
self.assertRaises(OSError, remove_list, mlist)
os.chmod(mlist.data_path, 0o777)
+
+ def test_create_no_such_style(self):
+ mlist = create_list('[email protected]', style_name='bogus')
+ # The MailmanList._preferred_language column isn't set so there's no
+ # valid mapping to an ILanguage. Therefore this call will produce a
+ # KeyError.
+ self.assertRaises(KeyError, getattr, mlist, 'preferred_language')
+
+ def test_remove_list_without_data_path(self):
+ mlist = create_list('[email protected]')
+ shutil.rmtree(mlist.data_path)
+ remove_list(mlist)
+ self.assertIsNone(getUtility(IListManager).get('[email protected]'))
=====================================
src/mailman/bin/tests/test_master.py
=====================================
--- a/src/mailman/bin/tests/test_master.py
+++ b/src/mailman/bin/tests/test_master.py
@@ -27,6 +27,7 @@ import errno
import tempfile
import unittest
+from datetime import timedelta
from flufl.lock import Lock
from mailman.bin import master
@@ -60,8 +61,8 @@ class TestMasterLock(unittest.TestCase):
state, lock = master.master_state(self.lock_file)
self.assertEqual(state, master.WatcherState.none)
# Acquire the lock as if another process had already started the
- # master.
- my_lock.lock()
+ # master. Use a timeout to avoid this test deadlocking.
+ my_lock.lock(timedelta(seconds=60))
try:
state, lock = master.master_state(self.lock_file)
finally:
=====================================
src/mailman/model/tests/test_uid.py
=====================================
--- a/src/mailman/model/tests/test_uid.py
+++ b/src/mailman/model/tests/test_uid.py
@@ -85,3 +85,9 @@ class TestUID(unittest.TestCase):
# And all the users still exist.
non_orphans = set(user.user_id for user in manager.users)
self.assertEqual(uids, non_orphans)
+
+ def test_repr(self):
+ uid = UID(uuid.UUID(int=1))
+ self.assertTrue(repr(uid).startswith(
+ '<UID 00000000-0000-0000-0000-000000000001 at '))
+ self.assertTrue(repr(uid).endswith('>'))
=====================================
src/mailman/model/tests/test_workflow.py
=====================================
--- a/src/mailman/model/tests/test_workflow.py
+++ b/src/mailman/model/tests/test_workflow.py
@@ -146,3 +146,7 @@ class TestWorkflow(unittest.TestCase):
self.assertEqual(state.step, 'three')
state = self._manager.restore('bee', 'nekot')
self.assertEqual(state.step, 'four')
+
+ def test_discard_missing_workflow(self):
+ self._manager.discard('bogus-name', 'bogus-token')
+ self.assertEqual(self._manager.count, 0)
=====================================
src/mailman/model/uid.py
=====================================
--- a/src/mailman/model/uid.py
+++ b/src/mailman/model/uid.py
@@ -50,12 +50,12 @@ class UID(Model):
@dbconnection
def __init__(self, store, uid):
- super(UID, self).__init__()
+ super().__init__()
self.uid = uid
store.add(self)
def __repr__(self):
- return '<UID {0} at {1}>'.format(self.uid, id(self))
+ return '<UID {} at {}>'.format(self.uid, id(self))
@staticmethod
@dbconnection
=====================================
src/mailman/testing/nose.py
=====================================
--- a/src/mailman/testing/nose.py
+++ b/src/mailman/testing/nose.py
@@ -43,7 +43,7 @@ class NosePlugin(Plugin):
configSection = 'mailman'
def __init__(self):
- super(NosePlugin, self).__init__()
+ super().__init__()
self.patterns = []
self.stderr = False
def set_stderr(ignore):
=====================================
src/mailman/utilities/modules.py
=====================================
--- a/src/mailman/utilities/modules.py
+++ b/src/mailman/utilities/modules.py
@@ -78,7 +78,7 @@ def scan_module(module, interface):
for name in module.__all__:
component = getattr(module, name, missing)
assert component is not missing, (
- '%s has bad __all__: %s' % (module, name))
+ '%s has bad __all__: %s' % (module, name)) # pragma: no cover
if interface.implementedBy(component):
yield component
=====================================
src/mailman/utilities/string.py
=====================================
--- a/src/mailman/utilities/string.py
+++ b/src/mailman/utilities/string.py
@@ -117,8 +117,10 @@ def wrap(text, column=70, honor_leading_ws=True):
# This line does not constitute a paragraph break.
paragraph.append(line)
# We've consumed all the lines in the original text. Transfer the last
- # paragraph we were collecting to the full set of paragraphs.
- paragraphs.append(EMPTYSTRING.join(paragraph))
+ # paragraph we were collecting to the full set of paragraphs, but only if
+ # it's not empty.
+ if len(paragraph) > 0:
+ paragraphs.append(EMPTYSTRING.join(paragraph))
# Now iterate through all paragraphs, wrapping as necessary.
wrapped_paragraphs = []
# The dedented wrapper.
@@ -150,7 +152,7 @@ def wrap(text, column=70, honor_leading_ws=True):
# dedented. The leading whitespace on the first line of the
# original text will be used as the indentation for all lines
# in the wrapped text.
- for i, ch in enumerate(paragraph_text):
+ for i, ch in enumerate(paragraph_text): # pragma: no branch
if ch not in whitespace:
break
leading_ws = paragraph[:i]
=====================================
src/mailman/utilities/tests/test_import.py
=====================================
--- a/src/mailman/utilities/tests/test_import.py
+++ b/src/mailman/utilities/tests/test_import.py
@@ -52,7 +52,8 @@ from mailman.interfaces.usermanager import IUserManager
from mailman.testing.helpers import LogFileMark
from mailman.testing.layers import ConfigLayer
from mailman.utilities.filesystem import makedirs
-from mailman.utilities.importer import import_config_pck, Import21Error
+from mailman.utilities.importer import (
+ Import21Error, check_language_code, import_config_pck)
from mailman.utilities.string import expand
from pickle import load
from pkg_resources import resource_filename
@@ -294,7 +295,7 @@ class TestBasicImport(unittest.TestCase):
except Import21Error as error:
# Check the message.
self.assertIn('[language.xx_XX]', str(error))
- else: # pragma: no cover
+ else:
self.fail('Import21Error was not raised')
def test_encode_ascii_prefixes(self):
@@ -865,7 +866,7 @@ class TestRosterImport(unittest.TestCase):
import_config_pck(self._mlist, self._pckdict)
except Import21Error as error:
self.assertIn('[language.xx_XX]', str(error))
- else: # pragma: no cover
+ else:
self.fail('Import21Error was not raised')
def test_username(self):
@@ -1136,3 +1137,6 @@ class TestPreferencesImport(unittest.TestCase):
receive_list_copy=False,
delivery_mode=DeliveryMode.plaintext_digests,
))
+
+ def test_language_code_none(self):
+ self.assertIsNone(check_language_code(None))
=====================================
src/mailman/utilities/tests/test_string.py
=====================================
--- /dev/null
+++ b/src/mailman/utilities/tests/test_string.py
@@ -0,0 +1,36 @@
+# Copyright (C) 2015 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Test the string utilities."""
+
+__all__ = [
+ 'TestString',
+ ]
+
+
+import unittest
+
+from mailman.utilities import string
+
+
+
+class TestString(unittest.TestCase):
+ def test_oneline_bogus_charset(self):
+ self.assertEqual(string.oneline('foo', 'bogus'), 'foo')
+
+ def test_wrap_blank_paragraph(self):
+ self.assertEqual(string.wrap('\n\n'), '\n\n')
View it on GitLab:
https://gitlab.com/mailman/mailman/compare/39fd2905cc34221ca2907f14f3f018190a3f62c5...8e69b848270da6ba4852f8c6dfdeeed8124ab024
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org