@@ -169,7 +169,7 @@ def test_daysback_less_than_min(self):
169
169
170
170
data = TimelineModule (self .env ).process_request (req )[1 ]
171
171
172
- self .assertEqual (1 , data ['daysback' ])
172
+ self .assertEqual (0 , data ['daysback' ])
173
173
174
174
def test_daysback_greater_than_max (self ):
175
175
"""Daysback is limited to [timeline] max_daysback."""
@@ -219,13 +219,15 @@ class TimelineEventProvider(Component):
219
219
implements (ITimelineEventProvider )
220
220
221
221
def __init__ (self ):
222
- self ._events = None
222
+ self ._events = ()
223
223
224
224
def get_timeline_filters (self , req ):
225
225
yield ('test' , 'Test' )
226
226
227
227
def get_timeline_events (self , req , start , stop , filters ):
228
- return iter (self ._events or ())
228
+ for event in self ._events :
229
+ if start <= event [1 ] <= stop :
230
+ yield event
229
231
230
232
def render_timeline_event (self , context , field , event ):
231
233
return event [3 ].render (context , field , event )
@@ -263,15 +265,16 @@ def render(context, field, event):
263
265
if field == 'description' :
264
266
return tag (tag .h1 ('Title 2nd' ), tag .p ('body & < >' ))
265
267
266
- provider = self .timeline_event_providers [ 'normal' ]( self . env )
268
+ provider = self ._get_event_provider ( 'normal' )
267
269
provider ._events = [
268
270
('test&1' , datetime (2018 , 4 , 27 , 12 , 34 , 56 , 123456 , utc ),
269
271
'jo&hn' , Mock (render = render )),
270
272
('test&2' , datetime (2018 , 3 , 19 , 23 , 56 , 12 , 987654 , utc ),
271
273
'Joe <[email protected] >' ,
Mock (
render = render )),
272
274
]
273
- req = MockRequest (self .env , path_info = '/timeline' ,
274
- args = {'format' : 'rss' })
275
+ req = MockRequest (self .env , path_info = '/timeline' , tz = utc ,
276
+ args = {'format' : 'rss' , 'daysback' : '90' ,
277
+ 'from' : '2018-04-30T00:00:00Z' })
275
278
rv = self ._process_request (req )
276
279
self .assertEqual ('timeline.rss' , rv [0 ])
277
280
self .assertEqual ({'content_type' : 'application/rss+xml' }, rv [2 ])
@@ -307,10 +310,49 @@ def render(context, field, event):
307
310
self .assertEqual ('<?xml version="1.0"?>' , output [:21 ])
308
311
minidom .parseString (output ) # verify valid xml
309
312
313
+ def test_daysback (self ):
314
+ provider = self ._get_event_provider ('normal' )
315
+ base_datetime = datetime (2025 , 2 , 20 , 12 , tzinfo = utc )
316
+ provider ._events = [
317
+ ('test' , base_datetime - timedelta (days = days ), 'trac' , None )
318
+ for days in range (- 30 , 120 )
319
+ ]
320
+
321
+ def render_and_get_events (daysback ):
322
+ req = MockRequest (self .env , path_info = '/timeline' , tz = utc ,
323
+ args = {'from' : '2025-02-19T12:34:56.012345Z' ,
324
+ 'daysback' : daysback })
325
+ rv = self ._process_request (req )
326
+ data = rv [1 ]
327
+ return data ['events' ]
328
+
329
+ def get_datetimes (events ):
330
+ return [event ['datetime' ] for event in events ]
331
+
332
+ events = render_and_get_events ('0' )
333
+ self .assertEqual ([datetime (2025 , 2 , 19 , 12 , tzinfo = utc )],
334
+ get_datetimes (events ))
335
+
336
+ events = render_and_get_events ('1' )
337
+ self .assertEqual ([datetime (2025 , 2 , 19 , 12 , tzinfo = utc ),
338
+ datetime (2025 , 2 , 18 , 12 , tzinfo = utc )],
339
+ get_datetimes (events ))
340
+
341
+ events = render_and_get_events ('90' )
342
+ self .assertEqual (datetime (2024 , 11 , 21 , 12 , tzinfo = utc ),
343
+ get_datetimes (events )[- 1 ])
344
+ self .assertEqual (91 , len (events ))
345
+
346
+ events = render_and_get_events ('91' )
347
+ self .assertEqual (datetime (2024 , 11 , 21 , 12 , tzinfo = utc ),
348
+ get_datetimes (events )[- 1 ])
349
+ self .assertEqual (91 , len (events ))
350
+
351
+ def _get_event_provider (self , name ):
352
+ return self .timeline_event_providers [name ](self .env )
353
+
310
354
def _process_request (self , req ):
311
355
mod = TimelineModule (self .env )
312
- req = MockRequest (self .env , path_info = '/timeline' ,
313
- args = {'format' : 'rss' })
314
356
self .assertTrue (mod .match_request (req ))
315
357
return mod .process_request (req )
316
358
0 commit comments