@@ -37,6 +37,8 @@ import {
37
37
ThreadFilterType ,
38
38
} from "matrix-js-sdk/src/models/thread" ;
39
39
import React , { createRef } from "react" ;
40
+ import { mocked } from "jest-mock" ;
41
+ import { forEachRight } from "lodash" ;
40
42
41
43
import TimelinePanel from "../../../src/components/structures/TimelinePanel" ;
42
44
import MatrixClientContext from "../../../src/contexts/MatrixClientContext" ;
@@ -60,10 +62,10 @@ const newReceipt = (eventId: string, userId: string, readTs: number, fullyReadTs
60
62
const getProps = ( room : Room , events : MatrixEvent [ ] ) : TimelinePanel [ "props" ] => {
61
63
const timelineSet = { room : room as Room } as EventTimelineSet ;
62
64
const timeline = new EventTimeline ( timelineSet ) ;
63
- events . forEach ( ( event ) => timeline . addEvent ( event , { toStartOfTimeline : true } ) ) ;
65
+ events . forEach ( ( event ) => timeline . addEvent ( event , { toStartOfTimeline : false } ) ) ;
64
66
timelineSet . getLiveTimeline = ( ) => timeline ;
65
67
timelineSet . getTimelineForEvent = ( ) => timeline ;
66
- timelineSet . getPendingEvents = ( ) => events ;
68
+ timelineSet . getPendingEvents = ( ) => [ ] ;
67
69
timelineSet . room ! . getEventReadUpTo = ( ) => events [ 1 ] . getId ( ) ?? null ;
68
70
69
71
return {
@@ -97,6 +99,12 @@ const setupTestData = (): [MatrixClient, Room, MatrixEvent[]] => {
97
99
return [ client , room , events ] ;
98
100
} ;
99
101
102
+ const expectEvents = ( container : HTMLElement , events : MatrixEvent [ ] ) : void => {
103
+ const eventTiles = container . querySelectorAll ( ".mx_EventTile" ) ;
104
+ const eventTileIds = [ ...eventTiles ] . map ( ( tileElement ) => tileElement . getAttribute ( "data-event-id" ) ) ;
105
+ expect ( eventTileIds ) . toEqual ( events . map ( ( ev ) => ev . getId ( ) ) ) ;
106
+ } ;
107
+
100
108
describe ( "TimelinePanel" , ( ) => {
101
109
beforeEach ( ( ) => {
102
110
stubClient ( ) ;
@@ -279,8 +287,7 @@ describe("TimelinePanel", () => {
279
287
} ) ;
280
288
281
289
describe ( "with overlayTimeline" , ( ) => {
282
- // Trying to understand why this is not passing anymore
283
- it . skip ( "renders merged timeline" , ( ) => {
290
+ it ( "renders merged timeline" , ( ) => {
284
291
const [ client , room , events ] = setupTestData ( ) ;
285
292
const virtualRoom = mkRoom ( client , "virtualRoomId" ) ;
286
293
const virtualCallInvite = new MatrixEvent ( {
@@ -296,25 +303,87 @@ describe("TimelinePanel", () => {
296
303
const virtualEvents = [ virtualCallInvite , ...mockEvents ( virtualRoom ) , virtualCallMetaEvent ] ;
297
304
const { timelineSet : overlayTimelineSet } = getProps ( virtualRoom , virtualEvents ) ;
298
305
299
- const props = {
300
- ... getProps ( room , events ) ,
301
- overlayTimelineSet ,
302
- overlayTimelineSetFilter : isCallEvent ,
303
- } ;
304
-
305
- const { container } = render ( < TimelinePanel { ... props } /> ) ;
306
+ const { container } = render (
307
+ < TimelinePanel
308
+ { ... getProps ( room , events ) }
309
+ overlayTimelineSet = { overlayTimelineSet }
310
+ overlayTimelineSetFilter = { isCallEvent }
311
+ /> ,
312
+ ) ;
306
313
307
- const eventTiles = container . querySelectorAll ( ".mx_EventTile" ) ;
308
- const eventTileIds = [ ...eventTiles ] . map ( ( tileElement ) => tileElement . getAttribute ( "data-event-id" ) ) ;
309
- expect ( eventTileIds ) . toEqual ( [
314
+ expectEvents ( container , [
310
315
// main timeline events are included
311
- events [ 1 ] . getId ( ) ,
312
- events [ 0 ] . getId ( ) ,
316
+ events [ 0 ] ,
317
+ events [ 1 ] ,
313
318
// virtual timeline call event is included
314
- virtualCallInvite . getId ( ) ,
319
+ virtualCallInvite ,
315
320
// virtual call event has no tile renderer => not rendered
316
321
] ) ;
317
322
} ) ;
323
+
324
+ it ( "paginates to get enough overlay events" , async ( ) => {
325
+ const [ client , room , events ] = setupTestData ( ) ;
326
+ const virtualRoom = mkRoom ( client , "virtualRoomId" ) ;
327
+ const overlayEvents = mockEvents ( virtualRoom , 5 ) ;
328
+ const overlayEventsPage1 = overlayEvents . slice ( 0 , 2 ) ;
329
+ const overlayEventsPage2 = overlayEvents . slice ( 2 , 3 ) ;
330
+ const overlayEventsPage3 = overlayEvents . slice ( 3 , 5 ) ;
331
+
332
+ // Set the event order that we'll be looking for in the timeline
333
+ overlayEventsPage1 [ 0 ] . localTimestamp = 1000 ;
334
+ events [ 0 ] . localTimestamp = 2000 ;
335
+ overlayEventsPage1 [ 1 ] . localTimestamp = 3000 ;
336
+ overlayEventsPage2 [ 0 ] . localTimestamp = 4000 ;
337
+ overlayEventsPage3 [ 0 ] . localTimestamp = 5000 ;
338
+ events [ 1 ] . localTimestamp = 6000 ;
339
+ overlayEventsPage3 [ 1 ] . localTimestamp = 7000 ;
340
+
341
+ const overlayTimelineSet = {
342
+ room : room as Room ,
343
+ getLiveTimeline : ( ) => overlayTimeline ,
344
+ getTimelineForEvent : ( ) => overlayTimeline ,
345
+ getPendingEvents : ( ) => [ ] ,
346
+ } as EventTimelineSet ;
347
+ const overlayTimeline = new EventTimeline ( overlayTimelineSet ) ;
348
+ // Start with only page 2 of the overlay events in the window
349
+ overlayEventsPage2 . forEach ( ( event ) => overlayTimeline . addEvent ( event , { toStartOfTimeline : false } ) ) ;
350
+ // Enable the overlay timeline to be paginated
351
+ overlayTimeline . setPaginationToken ( "page2-start" , EventTimeline . BACKWARDS ) ;
352
+ overlayTimeline . setPaginationToken ( "page2-end" , EventTimeline . FORWARDS ) ;
353
+
354
+ mocked ( client ) . paginateEventTimeline . mockImplementation ( async ( timeline , { backwards } ) => {
355
+ if ( timeline === overlayTimeline ) {
356
+ if ( backwards ) {
357
+ forEachRight ( overlayEventsPage1 , ( event ) =>
358
+ timeline . addEvent ( event , { toStartOfTimeline : true } ) ,
359
+ ) ;
360
+ } else {
361
+ overlayEventsPage3 . forEach ( ( event ) => timeline . addEvent ( event , { toStartOfTimeline : false } ) ) ;
362
+ }
363
+ // Prevent any further pagination attempts in this direction
364
+ timeline . setPaginationToken ( null , backwards ? EventTimeline . BACKWARDS : EventTimeline . FORWARDS ) ;
365
+ return true ;
366
+ } else {
367
+ return false ;
368
+ }
369
+ } ) ;
370
+
371
+ const { container } = render (
372
+ < TimelinePanel { ...getProps ( room , events ) } overlayTimelineSet = { overlayTimelineSet } /> ,
373
+ ) ;
374
+
375
+ await waitFor ( ( ) =>
376
+ expectEvents ( container , [
377
+ overlayEventsPage1 [ 0 ] ,
378
+ events [ 0 ] ,
379
+ overlayEventsPage1 [ 1 ] ,
380
+ overlayEventsPage2 [ 0 ] ,
381
+ overlayEventsPage3 [ 0 ] ,
382
+ events [ 1 ] ,
383
+ overlayEventsPage3 [ 1 ] ,
384
+ ] ) ,
385
+ ) ;
386
+ } ) ;
318
387
} ) ;
319
388
320
389
describe ( "when a thread updates" , ( ) => {
0 commit comments