1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
# Copyright (C) 2011-2014 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 ListManager."""
from __future__ import absolute_import, print_function, unicode_literals
__metaclass__ = type
__all__ = [
'TestListCreation',
'TestListLifecycleEvents',
'TestListManager',
]
import unittest
from storm.locals import Store
from zope.component import getUtility
from mailman.app.lifecycle import create_list
from mailman.app.moderator import hold_message
from mailman.interfaces.listmanager import (
IListManager, ListCreatedEvent, ListCreatingEvent, ListDeletedEvent,
ListDeletingEvent)
from mailman.interfaces.messages import IMessageStore
from mailman.interfaces.requests import IListRequests
from mailman.interfaces.subscriptions import ISubscriptionService
from mailman.interfaces.usermanager import IUserManager
from mailman.model.mime import ContentFilter
from mailman.testing.helpers import (
event_subscribers, specialized_message_from_string)
from mailman.testing.layers import ConfigLayer
class TestListManager(unittest.TestCase):
layer = ConfigLayer
def setUp(self):
self._events = []
def _record_event(self, event):
self._events.append(event)
def test_create_list_event(self):
# Test that creating a list in the list manager propagates the
# expected events.
with event_subscribers(self._record_event):
mlist = getUtility(IListManager).create('test@example.com')
self.assertEqual(len(self._events), 2)
self.assertTrue(isinstance(self._events[0], ListCreatingEvent))
self.assertEqual(self._events[0].fqdn_listname, 'test@example.com')
self.assertTrue(isinstance(self._events[1], ListCreatedEvent))
self.assertEqual(self._events[1].mailing_list, mlist)
def test_delete_list_event(self):
# Test that deleting a list in the list manager propagates the
# expected event.
mlist = create_list('another@example.com')
with event_subscribers(self._record_event):
getUtility(IListManager).delete(mlist)
self.assertEqual(len(self._events), 2)
self.assertTrue(isinstance(self._events[0], ListDeletingEvent))
self.assertEqual(self._events[0].mailing_list, mlist)
self.assertTrue(isinstance(self._events[1], ListDeletedEvent))
self.assertEqual(self._events[1].fqdn_listname, 'another@example.com')
class TestListLifecycleEvents(unittest.TestCase):
layer = ConfigLayer
def setUp(self):
self._ant = create_list('ant@example.com')
self._bee = create_list('bee@example.com')
self._usermanager = getUtility(IUserManager)
def test_members_are_deleted_when_mailing_list_is_deleted(self):
# When a mailing list with members is deleted, all the Member records
# are also deleted.
anne = self._usermanager.create_address('anne@example.com')
bart = self._usermanager.create_address('bart@example.com')
anne_ant = self._ant.subscribe(anne)
anne_bee = self._bee.subscribe(anne)
bart_ant = self._ant.subscribe(bart)
anne_ant_id = anne_ant.member_id
anne_bee_id = anne_bee.member_id
bart_ant_id = bart_ant.member_id
getUtility(IListManager).delete(self._ant)
service = getUtility(ISubscriptionService)
# We deleted the ant@example.com mailing list. Anne's and Bart's
# membership in this list should now be removed, but Anne's membership
# in bee@example.com should still exist.
self.assertEqual(service.get_member(anne_ant_id), None)
self.assertEqual(service.get_member(bart_ant_id), None)
self.assertEqual(service.get_member(anne_bee_id), anne_bee)
def test_requests_are_deleted_when_mailing_list_is_deleted(self):
# When a mailing list is deleted, its requests database is deleted
# too, e.g. all its message hold requests (but not the messages
# themselves).
msg = specialized_message_from_string("""\
From: anne@example.com
To: ant@example.com
Subject: Hold me
Message-ID: <argon>
""")
request_id = hold_message(self._ant, msg)
getUtility(IListManager).delete(self._ant)
# This is a hack. ListRequests don't access self._mailinglist in
# their get_request() method.
requestsdb = IListRequests(self._bee)
request = requestsdb.get_request(request_id)
self.assertEqual(request, None)
saved_message = getUtility(IMessageStore).get_message_by_id('<argon>')
self.assertEqual(saved_message.as_string(), msg.as_string())
def test_content_filters_are_deleted_when_mailing_list_is_deleted(self):
# When a mailing list with content filters is deleted, the filters
# must be deleted first or an IntegrityError will be raised.
filter_names = ('filter_types', 'pass_types',
'filter_extensions', 'pass_extensions')
for name in filter_names:
setattr(self._ant, name, ['test-filter-1', 'test-filter-2'])
getUtility(IListManager).delete(self._ant)
store = Store.of(self._ant)
filters = store.find(ContentFilter,
ContentFilter.mailing_list == self._ant)
self.assertEqual(filters.count(), 0)
class TestListCreation(unittest.TestCase):
layer = ConfigLayer
def test_create_list_case_folding(self):
# LP: #1117176 describes a problem where list names created in upper
# case are not actually usable by the LMTP server.
manager = getUtility(IListManager)
manager.create('my-LIST@example.com')
self.assertIsNone(manager.get('my-LIST@example.com'))
mlist = manager.get('my-list@example.com')
self.assertEqual(mlist.list_id, 'my-list.example.com')
|