|
15 | 15 | from trac.web.api import RequestDone |
16 | 16 |
|
17 | 17 | from tracdjangoplugin.middlewares import DjangoDBManagementMiddleware |
18 | | -from tracdjangoplugin.plugins import PlainLoginComponent, ReservedUsernamesComponent |
| 18 | +from tracdjangoplugin.plugins import ( |
| 19 | + PlainLoginComponent, |
| 20 | + ReservedUsernamesComponent, |
| 21 | + TimelineTicketComponentFilter, |
| 22 | +) |
19 | 23 |
|
20 | 24 |
|
21 | 25 | class PlainLoginComponentTestCase(TestCase): |
@@ -248,6 +252,72 @@ def test_anonymous_goes_through(self): |
248 | 252 | self.assertIs(retval, handler) |
249 | 253 |
|
250 | 254 |
|
| 255 | +class TimelineTicketComponentFilterTestCase(SimpleTestCase): |
| 256 | + def setUp(self): |
| 257 | + self.env = EnvironmentStub() |
| 258 | + self.filter = TimelineTicketComponentFilter(self.env) |
| 259 | + self.request_factory = partial(MockRequest, self.env) |
| 260 | + |
| 261 | + def make_ticket_event(self, kind, component): |
| 262 | + data = [None] * 11 |
| 263 | + data[TimelineTicketComponentFilter._TICKET_COMPONENT_INDEX] = component |
| 264 | + return {"kind": kind, "data": tuple(data)} |
| 265 | + |
| 266 | + def make_non_ticket_event(self, kind="wiki"): |
| 267 | + return {"kind": kind, "data": ()} |
| 268 | + |
| 269 | + def post_process(self, req, events): |
| 270 | + return self.filter.post_process_request( |
| 271 | + req, "timeline.rss", {"events": events}, {} |
| 272 | + ) |
| 273 | + |
| 274 | + def test_keeps_matching_component(self): |
| 275 | + req = self.request_factory( |
| 276 | + path_info="/timeline", args={"component": "contrib.staticfiles"} |
| 277 | + ) |
| 278 | + matching = self.make_ticket_event("newticket", "contrib.staticfiles") |
| 279 | + non_matching = self.make_ticket_event("newticket", "contrib.auth") |
| 280 | + _, data, _ = self.filter.post_process_request( |
| 281 | + req, "timeline.rss", {"events": [matching, non_matching]}, {} |
| 282 | + ) |
| 283 | + self.assertEqual(data["events"], [matching]) |
| 284 | + |
| 285 | + def test_filters_out_non_ticket_events(self): |
| 286 | + req = self.request_factory( |
| 287 | + path_info="/timeline", args={"component": "contrib.staticfiles"} |
| 288 | + ) |
| 289 | + ticket_event = self.make_ticket_event("newticket", "contrib.staticfiles") |
| 290 | + wiki_event = self.make_non_ticket_event("wiki") |
| 291 | + _, data, _ = self.post_process(req, [ticket_event, wiki_event]) |
| 292 | + self.assertEqual(data["events"], [ticket_event]) |
| 293 | + |
| 294 | + def test_all_ticket_kinds_match(self): |
| 295 | + req = self.request_factory( |
| 296 | + path_info="/timeline", args={"component": "contrib.staticfiles"} |
| 297 | + ) |
| 298 | + events = [ |
| 299 | + self.make_ticket_event(kind, "contrib.staticfiles") |
| 300 | + for kind in ("newticket", "editedticket", "closedticket", "reopenedticket") |
| 301 | + ] |
| 302 | + _, data, _ = self.post_process(req, events) |
| 303 | + self.assertEqual(len(data["events"]), 4) |
| 304 | + |
| 305 | + def test_multiple_components(self): |
| 306 | + req = self.request_factory( |
| 307 | + path_info="/timeline", |
| 308 | + args={"component": ["contrib.staticfiles", "contrib.auth"]}, |
| 309 | + ) |
| 310 | + matching_staticfiles = self.make_ticket_event( |
| 311 | + "newticket", "contrib.staticfiles" |
| 312 | + ) |
| 313 | + matching_auth = self.make_ticket_event("newticket", "contrib.auth") |
| 314 | + non_matching = self.make_ticket_event("newticket", "contrib.admin") |
| 315 | + _, data, _ = self.post_process( |
| 316 | + req, [matching_staticfiles, matching_auth, non_matching] |
| 317 | + ) |
| 318 | + self.assertEqual(data["events"], [matching_staticfiles, matching_auth]) |
| 319 | + |
| 320 | + |
251 | 321 | class RSTWikiTestCase(SimpleTestCase): |
252 | 322 | def test_wiki_can_render_rst(self): |
253 | 323 | renderer = Mimeview(EnvironmentStub()) |
|
0 commit comments