146
148
super(TestNotificationsLinkToFilters, self).setUp()
147
149
self.bug = self.factory.makeBug()
150
self.subscriber = self.factory.makePerson()
151
self.subscription = self.bug.default_bugtask.target.addSubscription(
152
self.subscriber, self.subscriber)
153
self.notification = self.addNotification(self.subscriber)
155
def addNotificationRecipient(self, notification, person):
156
# Manually insert BugNotificationRecipient for
157
# construct_email_notifications to work.
158
# Not sure why using SQLObject constructor doesn't work (it
159
# tries to insert a row with only the ID which fails).
160
Store.of(notification).execute("""
161
INSERT INTO BugNotificationRecipient
162
(bug_notification, person, reason_header, reason_body)
163
VALUES (%s, %s, %s, %s)""" % sqlvalues(
164
notification, person,
165
u'reason header', u'reason body'))
167
def addNotification(self, person):
168
# Add a notification along with recipient data.
169
# This is generally done with BugTaskSet.addNotification()
170
# but that requires a more complex set-up.
148
171
message = self.factory.makeMessage()
149
self.notification = BugNotification(
150
message=message, activity=None, bug=self.bug, is_comment=False,
172
notification = BugNotification(
173
message=message, activity=None, bug=self.bug,
174
is_comment=False, date_emailed=None)
175
self.addNotificationRecipient(notification, person)
153
178
def test_bug_filters_empty(self):
154
179
# When there are no linked bug filters, it returns a ResultSet
158
183
def test_bug_filters_single(self):
159
184
# With a linked BugSubscriptionFilter, it is returned.
160
subscriber=self.factory.makePerson()
161
subscription = self.bug.default_bugtask.target.addSubscription(
162
subscriber, subscriber)
163
bug_filter = subscription.newBugFilter()
185
bug_filter = self.subscription.bug_filters.one()
164
186
BugNotificationFilter(
165
187
bug_notification=self.notification,
166
188
bug_subscription_filter=bug_filter)
168
189
self.assertContentEqual([bug_filter],
169
190
self.notification.bug_filters)
171
192
def test_bug_filters_multiple(self):
172
193
# We can have more than one filter matched up with a single
174
subscriber=self.factory.makePerson()
175
subscription = self.bug.default_bugtask.target.addSubscription(
176
subscriber, subscriber)
177
bug_filter1 = subscription.newBugFilter()
178
bug_filter2 = subscription.newBugFilter()
195
bug_filter1 = self.subscription.bug_filters.one()
196
bug_filter2 = self.subscription.newBugFilter()
179
197
BugNotificationFilter(
180
198
bug_notification=self.notification,
181
199
bug_subscription_filter=bug_filter1)
186
204
self.assertContentEqual([bug_filter1, bug_filter2],
187
205
self.notification.bug_filters)
189
def test_getFiltersByRecipient_empty(self):
190
# When there are no linked bug filters, it returns a ResultSet
192
subscriber = self.factory.makePerson()
194
BugNotificationSet().getFiltersByRecipient(
195
[self.notification], subscriber).is_empty())
207
def test_getRecipientFilterData_empty(self):
208
# When there is empty input, there is empty output.
210
BugNotificationSet().getRecipientFilterData({}, []),
213
BugNotificationSet().getRecipientFilterData(
214
{}, [self.notification]),
197
def test_getFiltersByRecipient_other_persons(self):
198
# When there is no bug filter for the recipient,
199
# it returns a ResultSet with no entries.
200
recipient = self.factory.makePerson()
201
subscriber = self.factory.makePerson()
202
subscription = self.bug.default_bugtask.target.addSubscription(
203
subscriber, subscriber)
204
bug_filter = subscription.newBugFilter()
217
def test_getRecipientFilterData_other_persons(self):
218
# When there is no named bug filter for the recipient,
219
# it returns the recipient but with no filter descriptions.
220
BugNotificationFilter(
221
bug_notification=self.notification,
222
bug_subscription_filter=self.subscription.bug_filters.one())
223
subscriber2 = self.factory.makePerson()
224
subscription2 = self.bug.default_bugtask.target.addSubscription(
225
subscriber2, subscriber2)
226
bug_filter = subscription2.bug_filters.one()
227
bug_filter.description = u'Special Filter!'
205
228
BugNotificationFilter(
206
229
bug_notification=self.notification,
207
230
bug_subscription_filter=bug_filter)
209
BugNotificationSet().getFiltersByRecipient(
210
[self.notification], recipient).is_empty())
231
sources = list(self.notification.recipients)
233
{self.subscriber: {'sources': sources,
234
'filter descriptions': []}},
235
BugNotificationSet().getRecipientFilterData(
236
{self.subscriber: sources}, [self.notification]))
212
def test_getFiltersByRecipient_match(self):
238
def test_getRecipientFilterData_match(self):
213
239
# When there are bug filters for the recipient,
214
240
# only those filters are returned.
215
subscriber = self.factory.makePerson()
216
subscription = self.bug.default_bugtask.target.addSubscription(
217
subscriber, subscriber)
218
bug_filter = subscription.newBugFilter()
241
bug_filter = self.subscription.bug_filters.one()
242
bug_filter.description = u'Special Filter!'
219
243
BugNotificationFilter(
220
244
bug_notification=self.notification,
221
245
bug_subscription_filter=bug_filter)
222
self.assertContentEqual(
224
BugNotificationSet().getFiltersByRecipient(
225
[self.notification], subscriber))
246
sources = list(self.notification.recipients)
248
{self.subscriber: {'sources': sources,
249
'filter descriptions': ['Special Filter!']}},
250
BugNotificationSet().getRecipientFilterData(
251
{self.subscriber: sources}, [self.notification]))
227
def test_getFiltersByRecipients_multiple_notifications_match(self):
253
def test_getRecipientFilterData_multiple_notifications_match(self):
228
254
# When there are bug filters for the recipient for multiple
229
255
# notifications, return filters for all the notifications.
230
256
# Set up first notification and filter.
231
subscriber = self.factory.makePerson()
232
subscription = self.bug.default_bugtask.target.addSubscription(
233
subscriber, subscriber)
234
bug_filter = subscription.newBugFilter()
257
bug_filter = self.subscription.bug_filters.one()
258
bug_filter.description = u'Special Filter!'
235
259
BugNotificationFilter(
236
260
bug_notification=self.notification,
237
261
bug_subscription_filter=bug_filter)
238
# set up second notification and filter.
239
bug2 = self.factory.makeBug()
240
message2 = self.factory.makeMessage()
241
notification2 = BugNotification(
242
message=message2, activity=None, bug=bug2, is_comment=False,
244
subscription2 = bug2.default_bugtask.target.addSubscription(
245
subscriber, subscriber)
246
bug_filter2 = subscription2.newBugFilter()
262
# Set up second notification and filter.
263
notification2 = self.addNotification(self.subscriber)
264
bug_filter2 = self.subscription.newBugFilter()
265
bug_filter2.description = u'Another Filter!'
247
266
BugNotificationFilter(
248
267
bug_notification=notification2,
249
268
bug_subscription_filter=bug_filter2)
269
sources = list(self.notification.recipients)
270
sources.extend(notification2.recipients)
271
# This first check is really just for the internal consistency of the
273
self.assertEqual(len(sources), 2)
250
274
# Perform the test.
251
self.assertContentEqual(
252
set([bug_filter, bug_filter2]),
253
set(BugNotificationSet().getFiltersByRecipient(
254
[self.notification, notification2], subscriber)))
276
{self.subscriber: {'sources': sources,
277
'filter descriptions': ['Another Filter!', 'Special Filter!']}},
278
BugNotificationSet().getRecipientFilterData(
279
{self.subscriber: sources},
280
[self.notification, notification2]))
257
283
class TestNotificationProcessingWithoutRecipients(TestCaseWithFactory):