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('a...@example.com', 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('a...@example.com') + shutil.rmtree(mlist.data_path) + remove_list(mlist) + self.assertIsNone(getUtility(IListManager).get('a...@example.com')) ===================================== 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 Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org