@@ -2234,6 +2234,20 @@ describe("MatrixClient", function () {
22342234 } ) ;
22352235 }
22362236
2237+ function predecessorEvent ( newRoomId : string , predecessorRoomId : string ) : MatrixEvent {
2238+ return new MatrixEvent ( {
2239+ content : {
2240+ predecessor_room_id : predecessorRoomId ,
2241+ } ,
2242+ event_id : `predecessor_event_id_pred_${ predecessorRoomId } ` ,
2243+ origin_server_ts : 1432735824653 ,
2244+ room_id : newRoomId ,
2245+ sender : "@daryl:alexandria.example.com" ,
2246+ state_key : "" ,
2247+ type : "org.matrix.msc3946.room_predecessor" ,
2248+ } ) ;
2249+ }
2250+
22372251 it ( "Returns an empty list if there are no rooms" , ( ) => {
22382252 client . store = new StubStore ( ) ;
22392253 client . store . getRooms = ( ) => [ ] ;
@@ -2274,5 +2288,114 @@ describe("MatrixClient", function () {
22742288 expect ( rooms ) . toContain ( room1 ) ;
22752289 expect ( rooms ) . toContain ( room2 ) ;
22762290 } ) ;
2291+
2292+ function setUpReplacedRooms ( ) : {
2293+ room1 : Room ;
2294+ room2 : Room ;
2295+ replacedByCreate1 : Room ;
2296+ replacedByCreate2 : Room ;
2297+ replacedByDynamicPredecessor1 : Room ;
2298+ replacedByDynamicPredecessor2 : Room ;
2299+ } {
2300+ const room1 = new Room ( "room1" , client , "@carol:alexandria.example.com" ) ;
2301+ const replacedByCreate1 = new Room ( "replacedByCreate1" , client , "@carol:alexandria.example.com" ) ;
2302+ const replacedByCreate2 = new Room ( "replacedByCreate2" , client , "@carol:alexandria.example.com" ) ;
2303+ const replacedByDynamicPredecessor1 = new Room ( "dyn1" , client , "@carol:alexandria.example.com" ) ;
2304+ const replacedByDynamicPredecessor2 = new Room ( "dyn2" , client , "@carol:alexandria.example.com" ) ;
2305+ const room2 = new Room ( "room2" , client , "@daryl:alexandria.example.com" ) ;
2306+ client . store = new StubStore ( ) ;
2307+ client . store . getRooms = ( ) => [
2308+ room1 ,
2309+ replacedByCreate1 ,
2310+ replacedByCreate2 ,
2311+ replacedByDynamicPredecessor1 ,
2312+ replacedByDynamicPredecessor2 ,
2313+ room2 ,
2314+ ] ;
2315+ room1 . addLiveEvents (
2316+ [
2317+ roomCreateEvent ( room1 . roomId , replacedByCreate1 . roomId ) ,
2318+ predecessorEvent ( room1 . roomId , replacedByDynamicPredecessor1 . roomId ) ,
2319+ ] ,
2320+ { } ,
2321+ ) ;
2322+ room2 . addLiveEvents (
2323+ [
2324+ roomCreateEvent ( room2 . roomId , replacedByCreate2 . roomId ) ,
2325+ predecessorEvent ( room2 . roomId , replacedByDynamicPredecessor2 . roomId ) ,
2326+ ] ,
2327+ { } ,
2328+ ) ;
2329+ replacedByCreate1 . addLiveEvents ( [ tombstoneEvent ( room1 . roomId , replacedByCreate1 . roomId ) ] , { } ) ;
2330+ replacedByCreate2 . addLiveEvents ( [ tombstoneEvent ( room2 . roomId , replacedByCreate2 . roomId ) ] , { } ) ;
2331+ replacedByDynamicPredecessor1 . addLiveEvents (
2332+ [ tombstoneEvent ( room1 . roomId , replacedByDynamicPredecessor1 . roomId ) ] ,
2333+ { } ,
2334+ ) ;
2335+ replacedByDynamicPredecessor2 . addLiveEvents (
2336+ [ tombstoneEvent ( room2 . roomId , replacedByDynamicPredecessor2 . roomId ) ] ,
2337+ { } ,
2338+ ) ;
2339+
2340+ return {
2341+ room1,
2342+ room2,
2343+ replacedByCreate1,
2344+ replacedByCreate2,
2345+ replacedByDynamicPredecessor1,
2346+ replacedByDynamicPredecessor2,
2347+ } ;
2348+ }
2349+
2350+ it ( "Considers rooms replaced with m.predecessor events to be replaced" , ( ) => {
2351+ // Given 6 rooms, 2 of which have been replaced, and 2 of which WERE
2352+ // replaced by create events, but are now NOT replaced, because an
2353+ // m.predecessor event has changed the room's predecessor.
2354+ const {
2355+ room1,
2356+ room2,
2357+ replacedByCreate1,
2358+ replacedByCreate2,
2359+ replacedByDynamicPredecessor1,
2360+ replacedByDynamicPredecessor2,
2361+ } = setUpReplacedRooms ( ) ;
2362+
2363+ // When we ask for the visible rooms
2364+ const useMsc3946 = true ;
2365+ const rooms = client . getVisibleRooms ( useMsc3946 ) ;
2366+
2367+ // Then we only get the ones that have not been replaced
2368+ expect ( rooms ) . not . toContain ( replacedByDynamicPredecessor1 ) ;
2369+ expect ( rooms ) . not . toContain ( replacedByDynamicPredecessor2 ) ;
2370+ expect ( rooms ) . toContain ( replacedByCreate1 ) ;
2371+ expect ( rooms ) . toContain ( replacedByCreate2 ) ;
2372+ expect ( rooms ) . toContain ( room1 ) ;
2373+ expect ( rooms ) . toContain ( room2 ) ;
2374+ } ) ;
2375+
2376+ it ( "Ignores m.predecessor if we don't ask to use it" , ( ) => {
2377+ // Given 6 rooms, 2 of which have been replaced, and 2 of which WERE
2378+ // replaced by create events, but are now NOT replaced, because an
2379+ // m.predecessor event has changed the room's predecessor.
2380+ const {
2381+ room1,
2382+ room2,
2383+ replacedByCreate1,
2384+ replacedByCreate2,
2385+ replacedByDynamicPredecessor1,
2386+ replacedByDynamicPredecessor2,
2387+ } = setUpReplacedRooms ( ) ;
2388+
2389+ // When we ask for the visible rooms
2390+ const rooms = client . getVisibleRooms ( ) ; // Don't supply msc3946ProcessDynamicPredecessor
2391+
2392+ // Then we only get the ones that have not been replaced
2393+ expect ( rooms ) . not . toContain ( replacedByCreate1 ) ;
2394+ expect ( rooms ) . not . toContain ( replacedByCreate2 ) ;
2395+ expect ( rooms ) . toContain ( replacedByDynamicPredecessor1 ) ;
2396+ expect ( rooms ) . toContain ( replacedByDynamicPredecessor2 ) ;
2397+ expect ( rooms ) . toContain ( room1 ) ;
2398+ expect ( rooms ) . toContain ( room2 ) ;
2399+ } ) ;
22772400 } ) ;
22782401} ) ;
0 commit comments