@@ -17,6 +17,7 @@ limitations under the License.
1717import * as utils from "../test-utils/test-utils" ;
1818import { ClientEvent , EventTimeline , Filter , IEvent , MatrixClient , MatrixEvent , Room } from "../../src/matrix" ;
1919import { logger } from "../../src/logger" ;
20+ import { encodeUri } from "../../lib/utils" ;
2021import { TestClient } from "../TestClient" ;
2122import { FeatureSupport , Thread , THREAD_RELATION_TYPE } from "../../src/models/thread" ;
2223
@@ -886,6 +887,96 @@ describe("MatrixClient event timelines", function() {
886887 } ) ;
887888 } ) ;
888889
890+ describe ( "paginateEventTimeline for thread list timeline" , function ( ) {
891+ async function flushHttp < T > ( promise : Promise < T > ) : Promise < T > {
892+ return Promise . all ( [ promise , httpBackend . flushAllExpected ( ) ] ) . then ( ( [ result ] ) => result ) ;
893+ }
894+
895+ it ( "should allow you to paginate backwards" , async function ( ) {
896+ // @ts -ignore
897+ client . clientOpts . experimentalThreadSupport = true ;
898+ Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
899+ Thread . setServerSideListSupport ( FeatureSupport . Stable ) ;
900+
901+ const room = client . getRoom ( roomId ) ;
902+ const [ allThreads ] = await room . createThreadsTimelineSets ( ) ;
903+
904+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/context/$eventId" , {
905+ $roomId : roomId ,
906+ $eventId : THREAD_ROOT . event_id ,
907+ } ) ) . respond ( 200 , {
908+ end : "" ,
909+ start : "" ,
910+ state : [ ] ,
911+ events_before : [ ] ,
912+ events_after : [ ] ,
913+ event : THREAD_ROOT ,
914+ } ) ;
915+
916+ await flushHttp ( client . getEventTimeline ( allThreads , THREAD_ROOT . event_id ) ) ;
917+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
918+ $roomId : roomId ,
919+ } ) ) . respond ( 200 , {
920+ chunk : [ THREAD_ROOT ] ,
921+ } ) ;
922+ const timeline = await flushHttp ( client . getLatestTimeline ( allThreads ) ) ;
923+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
924+ $roomId : roomId ,
925+ } ) ) . respond ( 200 , {
926+ chunk : [ THREAD_ROOT ] ,
927+ next_batch : "end_token0" ,
928+ } ) ;
929+ const success = await flushHttp ( client . paginateEventTimeline ( timeline , { backwards : true } ) ) ;
930+ expect ( success ) . toBeTruthy ( ) ;
931+ expect ( timeline . getEvents ( ) . length ) . toEqual ( 1 ) ;
932+ expect ( timeline . getEvents ( ) [ 0 ] . event ) . toEqual ( THREAD_ROOT ) ;
933+ expect ( timeline . getPaginationToken ( EventTimeline . BACKWARDS ) )
934+ . toEqual ( "end_token0" ) ;
935+ } ) ;
936+
937+ it ( "should allow you to paginate forwards" , async function ( ) {
938+ // @ts -ignore
939+ client . clientOpts . experimentalThreadSupport = true ;
940+ Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
941+ Thread . setServerSideListSupport ( FeatureSupport . Stable ) ;
942+
943+ const room = client . getRoom ( roomId ) ;
944+ const [ allThreads ] = await room . createThreadsTimelineSets ( ) ;
945+
946+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/context/$eventId" , {
947+ $roomId : roomId ,
948+ $eventId : THREAD_ROOT . event_id ,
949+ } ) ) . respond ( 200 , {
950+ end : "" ,
951+ start : "" ,
952+ state : [ ] ,
953+ events_before : [ ] ,
954+ events_after : [ ] ,
955+ event : THREAD_ROOT ,
956+ } ) ;
957+
958+ await flushHttp ( client . getEventTimeline ( allThreads , THREAD_ROOT . event_id ) ) ;
959+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
960+ $roomId : roomId ,
961+ } ) ) . respond ( 200 , {
962+ chunk : [ THREAD_ROOT ] ,
963+ } ) ;
964+ const timeline = await flushHttp ( client . getLatestTimeline ( allThreads ) ) ;
965+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
966+ $roomId : roomId ,
967+ } ) ) . respond ( 200 , {
968+ chunk : [ THREAD_ROOT ] ,
969+ next_batch : "start_token1" ,
970+ } ) ;
971+ const success = await flushHttp ( client . paginateEventTimeline ( timeline , { backwards : false } ) ) ;
972+ expect ( success ) . toBeTruthy ( ) ;
973+ expect ( timeline . getEvents ( ) . length ) . toEqual ( 1 ) ;
974+ expect ( timeline . getEvents ( ) [ 0 ] . event ) . toEqual ( THREAD_ROOT ) ;
975+ expect ( timeline . getPaginationToken ( EventTimeline . FORWARDS ) )
976+ . toEqual ( "start_token1" ) ;
977+ } ) ;
978+ } ) ;
979+
889980 describe ( "event timeline for sent events" , function ( ) {
890981 const TXN_ID = "txn1" ;
891982 const event = utils . mkMessage ( {
0 commit comments