diff --git a/src/postorius/doc/news.rst b/src/postorius/doc/news.rst index eb121da..859f13a 100644 --- a/src/postorius/doc/news.rst +++ b/src/postorius/doc/news.rst @@ -25,6 +25,7 @@ (2014-xx-xx) * French translation. Provided by Guillaume Libersat +* Addedd an improved test harness using WebTest. Contributed by Aurélien Abompard. 1.0 beta 1 -- "Year of the Parrot" diff --git a/src/postorius/management/commands/mmclient.py b/src/postorius/management/commands/mmclient.py index 31a4104..2145d05 100644 --- a/src/postorius/management/commands/mmclient.py +++ b/src/postorius/management/commands/mmclient.py @@ -18,7 +18,6 @@ from django.conf import settings from django.core.management.base import BaseCommand, CommandError -from mailmanclient import Client, MailmanConnectionError from postorius import utils from urllib2 import HTTPError diff --git a/src/postorius/tests/mailman_api_tests/__init__.py b/src/postorius/tests/mailman_api_tests/__init__.py index edeaacc..c4d5c4e 100644 --- a/src/postorius/tests/mailman_api_tests/__init__.py +++ b/src/postorius/tests/mailman_api_tests/__init__.py @@ -14,17 +14,34 @@ # # You should have received a copy of the GNU General Public License along with # Postorius. If not, see . -from django.conf import settings -from postorius.tests.mm_setup import setup_mm, teardown_mm, Testobject +from mailmanclient.tests.utils import FakeMailmanClient - -test_obj = Testobject() +from mock import patch +from django.test import TestCase def setup_module(): - setup_mm(test_obj) - + FakeMailmanClient.setUp() def teardown_module(): - teardown_mm(test_obj) + FakeMailmanClient.tearDown() + + +class MMTestCase(TestCase): + + def _pre_setup(self): + super(MMTestCase, self)._pre_setup() + self.mm_client = FakeMailmanClient( + 'http://localhost:8001/3.0', "restadmin", "restpass") + self.mm_client_patcher = patch('postorius.utils.Client', lambda *a, **kw: self.mm_client) + self.mm_client_patcher.start() + self.mm_client.create_domain( + 'example.com', + contact_address='postmaster@example.com', + base_url='lists.example.com') + + def _post_teardown(self): + self.mm_client_patcher.stop() + self.mm_client.delete_domain('example.com') + super(MMTestCase, self)._post_teardown() diff --git a/src/postorius/tests/mailman_api_tests/test_list_index.py b/src/postorius/tests/mailman_api_tests/test_list_index.py index ff3629a..122e5a3 100644 --- a/src/postorius/tests/mailman_api_tests/test_list_index.py +++ b/src/postorius/tests/mailman_api_tests/test_list_index.py @@ -14,42 +14,22 @@ # # You should have received a copy of the GNU General Public License along with # Postorius. If not, see . + import logging from django.core.urlresolvers import reverse -from django.test import TestCase -from django.test.client import Client -from django.test.utils import override_settings -from postorius.tests.mm_setup import mm_client +from postorius.tests.mailman_api_tests import MMTestCase logger = logging.getLogger(__name__) -def setup_module(): - # Create a domain for all tests in this module. - mm_client.create_domain( - 'example.com', - contact_address='postmaster@example.com', - base_url='lists.example.com') - - -def teardown_module(): - # Clean up. - mm_client.delete_domain('example.com') - - -@override_settings( - MAILMAN_API_URL='http://localhost:9001', - MAILMAN_USER='restadmin', - MAILMAN_PASS='restpass') -class ListIndexPageTest(TestCase): +class ListIndexPageTest(MMTestCase): """Tests for the list index page.""" def setUp(self): - self.client = Client() - domain = mm_client.get_domain('example.com') + domain = self.mm_client.get_domain('example.com') self.foo_list = domain.create_list('foo') def tearDown(self): diff --git a/src/postorius/tests/mailman_api_tests/test_list_members.py b/src/postorius/tests/mailman_api_tests/test_list_members.py index a405821..914109c 100644 --- a/src/postorius/tests/mailman_api_tests/test_list_members.py +++ b/src/postorius/tests/mailman_api_tests/test_list_members.py @@ -18,42 +18,21 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse -from django.test import TestCase -from django.test.client import Client -from django.test.utils import override_settings -from postorius.tests.mm_setup import mm_client +from postorius.tests.mailman_api_tests import MMTestCase logger = logging.getLogger(__name__) -def setup_module(): - # Create a domain for all tests in this module. - mm_client.create_domain( - 'example.com', - contact_address='postmaster@example.com', - base_url='lists.example.com') - - -def teardown_module(): - # Clean up. - mm_client.delete_domain('example.com') - - -@override_settings( - MAILMAN_API_URL='http://localhost:9001', - MAILMAN_USER='restadmin', - MAILMAN_PASS='restpass') -class ListMembersPageTest(TestCase): +class ListMembersPageTest(MMTestCase): """Tests for the list members page. Tests permissions and creation of list owners and moderators. """ def setUp(self): - self.client = Client() - domain = mm_client.get_domain('example.com') + domain = self.mm_client.get_domain('example.com') self.foo_list = domain.create_list('foo') self.user = User.objects.create_user('testuser', 'test@example.com', 'testpass') diff --git a/src/postorius/tests/mailman_api_tests/test_list_new.py b/src/postorius/tests/mailman_api_tests/test_list_new.py index 0989ccb..8df4373 100644 --- a/src/postorius/tests/mailman_api_tests/test_list_new.py +++ b/src/postorius/tests/mailman_api_tests/test_list_new.py @@ -19,38 +19,17 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse -from django.test import TestCase -from django.test.client import Client -from django.test.utils import override_settings -from postorius.tests.mm_setup import mm_client +from postorius.tests.mailman_api_tests import MMTestCase logger = logging.getLogger(__name__) -def setup_module(): - # Create a domain for all tests in this module. - mm_client.create_domain( - 'example.com', - contact_address='postmaster@example.com', - base_url='lists.example.com') - - -def teardown_module(): - # Clean up. - mm_client.delete_domain('example.com') - - -@override_settings( - MAILMAN_API_URL='http://localhost:9001', - MAILMAN_USER='restadmin', - MAILMAN_PASS='restpass') -class ListCreationTest(TestCase): +class ListCreationTest(MMTestCase): """Tests for the new list page.""" def setUp(self): - self.client = Client() self.user = User.objects.create_user('user', 'user@example.com', 'pwd') self.superuser = User.objects.create_superuser('su', 'su@example.com', 'pwd') @@ -66,11 +45,6 @@ response, '/postorius/accounts/login/?next=/postorius/lists/new/') - def test_page_accessible_to_su(self): - self.client.login(username='su', password='pwd') - response = self.client.get(reverse('list_new')) - self.assertEqual(response.status_code, 200) - def test_new_list_created(self): self.client.login(username='su', password='pwd') post_data = {'listname': 'a_new_list', @@ -79,5 +53,5 @@ 'advertised': 'True', 'description': 'A new list.'} self.client.post(reverse('list_new'), post_data) - a_new_list = mm_client.get_list('a_new_list@example.com') + a_new_list = self.mm_client.get_list('a_new_list@example.com') self.assertEqual(a_new_list.fqdn_listname, u'a_new_list@example.com') diff --git a/src/postorius/tests/mailman_api_tests/test_list_summary.py b/src/postorius/tests/mailman_api_tests/test_list_summary.py index 919eaa1..85212bf 100644 --- a/src/postorius/tests/mailman_api_tests/test_list_summary.py +++ b/src/postorius/tests/mailman_api_tests/test_list_summary.py @@ -18,34 +18,14 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse -from django.test import TestCase -from django.test.client import Client -from django.test.utils import override_settings -from postorius.tests.mm_setup import mm_client +from postorius.tests.mailman_api_tests import MMTestCase logger = logging.getLogger(__name__) -def setup_module(): - # Create a domain for all tests in this module. - mm_client.create_domain( - 'example.com', - contact_address='postmaster@example.com', - base_url='lists.example.com') - - -def teardown_module(): - # Clean up. - mm_client.delete_domain('example.com') - - -@override_settings( - MAILMAN_API_URL='http://localhost:9001', - MAILMAN_USER='restadmin', - MAILMAN_PASS='restpass') -class ListSummaryPageTest(TestCase): +class ListSummaryPageTest(MMTestCase): """Tests for the list summary page. Tests accessiblity and existince of the submit form depending on @@ -53,8 +33,7 @@ """ def setUp(self): - self.client = Client() - domain = mm_client.get_domain('example.com') + domain = self.mm_client.get_domain('example.com') self.foo_list = domain.create_list('foo') def tearDown(self): diff --git a/src/postorius/tests/mm_setup.py b/src/postorius/tests/mm_setup.py deleted file mode 100644 index f88df53..0000000 --- a/src/postorius/tests/mm_setup.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (C) 1998-2014 by the Free Software Foundation, Inc. -# -# This file is part of Postorius. -# -# Postorius 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. -# -# Postorius 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 -# Postorius. If not, see . -import os -import time -import shutil -import logging -import tempfile -import subprocess - -from django.conf import settings -from mailmanclient import Client - - -logger = logging.getLogger(__name__) - - -mm_client = Client('%s/3.0' % settings.MAILMAN_TEST_API_URL, - settings.MAILMAN_TEST_USER, - settings.MAILMAN_TEST_PASS) - - -class Testobject: - bindir = None - vardir = None - cfgfile = None - - -def setup_mm(testobject): - bindir = testobject.bindir = settings.MAILMAN_TEST_BINDIR - if bindir is None: - raise RuntimeError("something's not quite right") - vardir = testobject.vardir = tempfile.mkdtemp() - cfgfile = testobject.cfgfile = os.path.join(vardir, 'client_test.cfg') - with open(cfgfile, 'w') as fp: - print >> fp, """\ -[mailman] -layout: tmpdir -[paths.tmpdir] -var_dir: {vardir} -log_dir: /tmp/mmclient/logs -[runner.archive] -start: no -[runner.bounces] -start: no -[runner.command] -start: no -[runner.in] -start: no -[runner.lmtp] -start: no -[runner.news] -start: no -[runner.out] -start: no -[runner.pipeline] -start: no -[runner.retry] -start: no -[runner.virgin] -start: no -[runner.digest] -start: no -[webservice] -port: 9001 -""".format(vardir=vardir) - mailman = os.path.join(bindir, 'mailman') - subprocess.call([mailman, '-C', cfgfile, 'start', '-q']) - time.sleep(3) - return testobject - - -def teardown_mm(testobject): - bindir = testobject.bindir - cfgfile = testobject.cfgfile - vardir = testobject.vardir - mailman = os.path.join(bindir, 'mailman') - subprocess.call([mailman, '-C', cfgfile, 'stop', '-q']) - shutil.rmtree(vardir) diff --git a/src/postorius/tests/test_address_activation.py b/src/postorius/tests/test_address_activation.py index 02fef05..b09ee44 100644 --- a/src/postorius/tests/test_address_activation.py +++ b/src/postorius/tests/test_address_activation.py @@ -9,7 +9,6 @@ from django.test.client import Client, RequestFactory from django.test.utils import override_settings from django.utils import unittest -from mailmanclient._client import _Connection from mock import patch, call from postorius.forms import AddressActivationForm diff --git a/src/postorius/views/api.py b/src/postorius/views/api.py index 2d2f62d..8856df6 100644 --- a/src/postorius/views/api.py +++ b/src/postorius/views/api.py @@ -39,7 +39,6 @@ from django.utils.translation import gettext as _ from urllib2 import HTTPError -from mailmanclient import Client from postorius import utils from postorius.models import (Domain, List, Member, MailmanUser, MailmanApiError, Mailman404Error) diff --git a/src/postorius/views/generic.py b/src/postorius/views/generic.py index f523837..f491662 100644 --- a/src/postorius/views/generic.py +++ b/src/postorius/views/generic.py @@ -21,7 +21,6 @@ from django.shortcuts import render_to_response, redirect from django.template import Context, loader, RequestContext from django.views.generic import TemplateView, View -from mailmanclient import Client from postorius.models import (Domain, List, Member, MailmanUser, MailmanApiError, Mailman404Error) diff --git a/src/postorius/views/settings.py b/src/postorius/views/settings.py index aeed78f..3859aec 100644 --- a/src/postorius/views/settings.py +++ b/src/postorius/views/settings.py @@ -37,7 +37,6 @@ from django.utils.translation import gettext as _ from urllib2 import HTTPError -from mailmanclient import Client from postorius import utils from postorius.models import (Domain, List, Member, MailmanUser, MailmanApiError, Mailman404Error) diff --git a/src/postorius/views/views.py b/src/postorius/views/views.py index 400b0c5..ebdf28c 100644 --- a/src/postorius/views/views.py +++ b/src/postorius/views/views.py @@ -40,7 +40,6 @@ from django.utils.translation import gettext as _ from urllib2 import HTTPError -from mailmanclient import Client from postorius import utils from postorius.models import (Domain, List, Member, MailmanUser, MailmanApiError, Mailman404Error)