@@ -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
@@ -925,6 +926,96 @@ describe("MatrixClient event timelines", function() {
925926 } ) ;
926927 } ) ;
927928
929+ describe ( "paginateEventTimeline for thread list timeline" , function ( ) {
930+ async function flushHttp < T > ( promise : Promise < T > ) : Promise < T > {
931+ return Promise . all ( [ promise , httpBackend . flushAllExpected ( ) ] ) . then ( ( [ result ] ) => result ) ;
932+ }
933+
934+ it ( "should allow you to paginate backwards" , async function ( ) {
935+ // @ts -ignore
936+ client . clientOpts . experimentalThreadSupport = true ;
937+ Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
938+ Thread . setServerSideListSupport ( FeatureSupport . Stable ) ;
939+
940+ const room = client . getRoom ( roomId ) ;
941+ const [ allThreads ] = await room . createThreadsTimelineSets ( ) ;
942+
943+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/context/$eventId" , {
944+ $roomId : roomId ,
945+ $eventId : THREAD_ROOT . event_id ,
946+ } ) ) . respond ( 200 , {
947+ end : "" ,
948+ start : "" ,
949+ state : [ ] ,
950+ events_before : [ ] ,
951+ events_after : [ ] ,
952+ event : THREAD_ROOT ,
953+ } ) ;
954+
955+ await flushHttp ( client . getEventTimeline ( allThreads , THREAD_ROOT . event_id ) ) ;
956+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
957+ $roomId : roomId ,
958+ } ) ) . respond ( 200 , {
959+ chunk : [ THREAD_ROOT ] ,
960+ } ) ;
961+ const timeline = await flushHttp ( client . getLatestTimeline ( allThreads ) ) ;
962+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
963+ $roomId : roomId ,
964+ } ) ) . respond ( 200 , {
965+ chunk : [ THREAD_ROOT ] ,
966+ next_batch : "end_token0" ,
967+ } ) ;
968+ const success = await flushHttp ( client . paginateEventTimeline ( timeline , { backwards : true } ) ) ;
969+ expect ( success ) . toBeTruthy ( ) ;
970+ expect ( timeline . getEvents ( ) . length ) . toEqual ( 1 ) ;
971+ expect ( timeline . getEvents ( ) [ 0 ] . event ) . toEqual ( THREAD_ROOT ) ;
972+ expect ( timeline . getPaginationToken ( EventTimeline . BACKWARDS ) )
973+ . toEqual ( "end_token0" ) ;
974+ } ) ;
975+
976+ it ( "should allow you to paginate forwards" , async function ( ) {
977+ // @ts -ignore
978+ client . clientOpts . experimentalThreadSupport = true ;
979+ Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
980+ Thread . setServerSideListSupport ( FeatureSupport . Stable ) ;
981+
982+ const room = client . getRoom ( roomId ) ;
983+ const [ allThreads ] = await room . createThreadsTimelineSets ( ) ;
984+
985+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/context/$eventId" , {
986+ $roomId : roomId ,
987+ $eventId : THREAD_ROOT . event_id ,
988+ } ) ) . respond ( 200 , {
989+ end : "" ,
990+ start : "" ,
991+ state : [ ] ,
992+ events_before : [ ] ,
993+ events_after : [ ] ,
994+ event : THREAD_ROOT ,
995+ } ) ;
996+
997+ await flushHttp ( client . getEventTimeline ( allThreads , THREAD_ROOT . event_id ) ) ;
998+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
999+ $roomId : roomId ,
1000+ } ) ) . respond ( 200 , {
1001+ chunk : [ THREAD_ROOT ] ,
1002+ } ) ;
1003+ const timeline = await flushHttp ( client . getLatestTimeline ( allThreads ) ) ;
1004+ httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0/rooms/$roomId/threads" , {
1005+ $roomId : roomId ,
1006+ } ) ) . respond ( 200 , {
1007+ chunk : [ THREAD_ROOT ] ,
1008+ next_batch : "start_token1" ,
1009+ } ) ;
1010+ const success = await flushHttp ( client . paginateEventTimeline ( timeline , { backwards : false } ) ) ;
1011+ expect ( success ) . toBeTruthy ( ) ;
1012+ expect ( timeline . getEvents ( ) . length ) . toEqual ( 1 ) ;
1013+ expect ( timeline . getEvents ( ) [ 0 ] . event ) . toEqual ( THREAD_ROOT ) ;
1014+ expect ( timeline . getPaginationToken ( EventTimeline . FORWARDS ) )
1015+ . toEqual ( "start_token1" ) ;
1016+ } ) ;
1017+ } ) ;
1018+
9281019 describe ( "event timeline for sent events" , function ( ) {
9291020 const TXN_ID = "txn1" ;
9301021 const event = utils . mkMessage ( {
0 commit comments