@@ -2234,7 +2234,78 @@ 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 describe ( "getVisibleRooms" , ( ) => {
2252+ function setUpReplacedRooms ( ) : {
2253+ room1 : Room ;
2254+ room2 : Room ;
2255+ replacedByCreate1 : Room ;
2256+ replacedByCreate2 : Room ;
2257+ replacedByDynamicPredecessor1 : Room ;
2258+ replacedByDynamicPredecessor2 : Room ;
2259+ } {
2260+ const room1 = new Room ( "room1" , client , "@carol:alexandria.example.com" ) ;
2261+ const replacedByCreate1 = new Room ( "replacedByCreate1" , client , "@carol:alexandria.example.com" ) ;
2262+ const replacedByCreate2 = new Room ( "replacedByCreate2" , client , "@carol:alexandria.example.com" ) ;
2263+ const replacedByDynamicPredecessor1 = new Room ( "dyn1" , client , "@carol:alexandria.example.com" ) ;
2264+ const replacedByDynamicPredecessor2 = new Room ( "dyn2" , client , "@carol:alexandria.example.com" ) ;
2265+ const room2 = new Room ( "room2" , client , "@daryl:alexandria.example.com" ) ;
2266+ client . store = new StubStore ( ) ;
2267+ client . store . getRooms = ( ) => [
2268+ room1 ,
2269+ replacedByCreate1 ,
2270+ replacedByCreate2 ,
2271+ replacedByDynamicPredecessor1 ,
2272+ replacedByDynamicPredecessor2 ,
2273+ room2 ,
2274+ ] ;
2275+ room1 . addLiveEvents (
2276+ [
2277+ roomCreateEvent ( room1 . roomId , replacedByCreate1 . roomId ) ,
2278+ predecessorEvent ( room1 . roomId , replacedByDynamicPredecessor1 . roomId ) ,
2279+ ] ,
2280+ { } ,
2281+ ) ;
2282+ room2 . addLiveEvents (
2283+ [
2284+ roomCreateEvent ( room2 . roomId , replacedByCreate2 . roomId ) ,
2285+ predecessorEvent ( room2 . roomId , replacedByDynamicPredecessor2 . roomId ) ,
2286+ ] ,
2287+ { } ,
2288+ ) ;
2289+ replacedByCreate1 . addLiveEvents ( [ tombstoneEvent ( room1 . roomId , replacedByCreate1 . roomId ) ] , { } ) ;
2290+ replacedByCreate2 . addLiveEvents ( [ tombstoneEvent ( room2 . roomId , replacedByCreate2 . roomId ) ] , { } ) ;
2291+ replacedByDynamicPredecessor1 . addLiveEvents (
2292+ [ tombstoneEvent ( room1 . roomId , replacedByDynamicPredecessor1 . roomId ) ] ,
2293+ { } ,
2294+ ) ;
2295+ replacedByDynamicPredecessor2 . addLiveEvents (
2296+ [ tombstoneEvent ( room2 . roomId , replacedByDynamicPredecessor2 . roomId ) ] ,
2297+ { } ,
2298+ ) ;
2299+
2300+ return {
2301+ room1,
2302+ room2,
2303+ replacedByCreate1,
2304+ replacedByCreate2,
2305+ replacedByDynamicPredecessor1,
2306+ replacedByDynamicPredecessor2,
2307+ } ;
2308+ }
22382309 it ( "Returns an empty list if there are no rooms" , ( ) => {
22392310 client . store = new StubStore ( ) ;
22402311 client . store . getRooms = ( ) => [ ] ;
@@ -2275,6 +2346,82 @@ describe("MatrixClient", function () {
22752346 expect ( rooms ) . toContain ( room1 ) ;
22762347 expect ( rooms ) . toContain ( room2 ) ;
22772348 } ) ;
2349+
2350+ it ( "Ignores m.predecessor if we don't ask to use it" , ( ) => {
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 rooms = client . getVisibleRooms ( ) ; // Don't supply msc3946ProcessDynamicPredecessor
2365+
2366+ // Then we only get the ones that have not been replaced
2367+ expect ( rooms ) . not . toContain ( replacedByCreate1 ) ;
2368+ expect ( rooms ) . not . toContain ( replacedByCreate2 ) ;
2369+ expect ( rooms ) . toContain ( replacedByDynamicPredecessor1 ) ;
2370+ expect ( rooms ) . toContain ( replacedByDynamicPredecessor2 ) ;
2371+ expect ( rooms ) . toContain ( room1 ) ;
2372+ expect ( rooms ) . toContain ( room2 ) ;
2373+ } ) ;
2374+
2375+ it ( "Considers rooms replaced with m.predecessor events to be replaced" , ( ) => {
2376+ // Given 6 rooms, 2 of which have been replaced, and 2 of which WERE
2377+ // replaced by create events, but are now NOT replaced, because an
2378+ // m.predecessor event has changed the room's predecessor.
2379+ const {
2380+ room1,
2381+ room2,
2382+ replacedByCreate1,
2383+ replacedByCreate2,
2384+ replacedByDynamicPredecessor1,
2385+ replacedByDynamicPredecessor2,
2386+ } = setUpReplacedRooms ( ) ;
2387+
2388+ // When we ask for the visible rooms
2389+ const useMsc3946 = true ;
2390+ const rooms = client . getVisibleRooms ( useMsc3946 ) ;
2391+
2392+ // Then we only get the ones that have not been replaced
2393+ expect ( rooms ) . not . toContain ( replacedByDynamicPredecessor1 ) ;
2394+ expect ( rooms ) . not . toContain ( replacedByDynamicPredecessor2 ) ;
2395+ expect ( rooms ) . toContain ( replacedByCreate1 ) ;
2396+ expect ( rooms ) . toContain ( replacedByCreate2 ) ;
2397+ expect ( rooms ) . toContain ( room1 ) ;
2398+ expect ( rooms ) . toContain ( room2 ) ;
2399+ } ) ;
2400+
2401+ it ( "Ignores m.predecessor if we don't ask to use it" , ( ) => {
2402+ // Given 6 rooms, 2 of which have been replaced, and 2 of which WERE
2403+ // replaced by create events, but are now NOT replaced, because an
2404+ // m.predecessor event has changed the room's predecessor.
2405+ const {
2406+ room1,
2407+ room2,
2408+ replacedByCreate1,
2409+ replacedByCreate2,
2410+ replacedByDynamicPredecessor1,
2411+ replacedByDynamicPredecessor2,
2412+ } = setUpReplacedRooms ( ) ;
2413+
2414+ // When we ask for the visible rooms
2415+ const rooms = client . getVisibleRooms ( ) ; // Don't supply msc3946ProcessDynamicPredecessor
2416+
2417+ // Then we only get the ones that have not been replaced
2418+ expect ( rooms ) . not . toContain ( replacedByCreate1 ) ;
2419+ expect ( rooms ) . not . toContain ( replacedByCreate2 ) ;
2420+ expect ( rooms ) . toContain ( replacedByDynamicPredecessor1 ) ;
2421+ expect ( rooms ) . toContain ( replacedByDynamicPredecessor2 ) ;
2422+ expect ( rooms ) . toContain ( room1 ) ;
2423+ expect ( rooms ) . toContain ( room2 ) ;
2424+ } ) ;
22782425 } ) ;
22792426
22802427 describe ( "getRoomUpgradeHistory" , ( ) => {
0 commit comments