@@ -14,15 +14,27 @@ See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
1616
17+ import React from "react" ;
18+ import { render } from "@testing-library/react" ;
1719import { MatrixClient } from "matrix-js-sdk/src/client" ;
1820import { Room } from "matrix-js-sdk/src/models/room" ;
1921import { RoomHierarchy } from "matrix-js-sdk/src/room-hierarchy" ;
22+ import { IHierarchyRoom } from "matrix-js-sdk/src/@types/spaces" ;
2023
2124import { MatrixClientPeg } from "../../../src/MatrixClientPeg" ;
22- import { stubClient } from "../../test-utils" ;
25+ import { mkStubRoom , stubClient } from "../../test-utils" ;
2326import dispatcher from "../../../src/dispatcher/dispatcher" ;
24- import { showRoom } from "../../../src/components/structures/SpaceHierarchy" ;
27+ import { HierarchyLevel , showRoom , toLocalRoom } from "../../../src/components/structures/SpaceHierarchy" ;
2528import { Action } from "../../../src/dispatcher/actions" ;
29+ import MatrixClientContext from "../../../src/contexts/MatrixClientContext" ;
30+ import DMRoomMap from "../../../src/utils/DMRoomMap" ;
31+
32+ // Fake random strings to give a predictable snapshot for checkbox IDs
33+ jest . mock ( "matrix-js-sdk/src/randomstring" , ( ) => {
34+ return {
35+ randomString : ( ) => "abdefghi" ,
36+ } ;
37+ } ) ;
2638
2739describe ( "SpaceHierarchy" , ( ) => {
2840 describe ( "showRoom" , ( ) => {
@@ -67,4 +79,115 @@ describe("SpaceHierarchy", () => {
6779 } ) ;
6880 } ) ;
6981 } ) ;
82+
83+ describe ( "toLocalRoom" , ( ) => {
84+ stubClient ( ) ;
85+ const client = MatrixClientPeg . get ( ) ;
86+ const roomV1 = mkStubRoom ( "room-id-1" , "Room V1" , client ) ;
87+ const roomV2 = mkStubRoom ( "room-id-2" , "Room V2" , client ) ;
88+ const roomV3 = mkStubRoom ( "room-id-3" , "Room V3" , client ) ;
89+ jest . spyOn ( client , "getRoomUpgradeHistory" ) . mockReturnValue ( [ roomV1 , roomV2 , roomV3 ] ) ;
90+
91+ it ( "grabs last room that is in hierarchy when latest version is in hierarchy" , ( ) => {
92+ const hierarchy = {
93+ roomMap : new Map ( [
94+ [ roomV1 . roomId , { room_id : roomV1 . roomId } as IHierarchyRoom ] ,
95+ [ roomV2 . roomId , { room_id : roomV2 . roomId } as IHierarchyRoom ] ,
96+ [ roomV3 . roomId , { room_id : roomV3 . roomId } as IHierarchyRoom ] ,
97+ ] ) ,
98+ } as RoomHierarchy ;
99+ const localRoomV1 = toLocalRoom ( client , { room_id : roomV1 . roomId } as IHierarchyRoom , hierarchy ) ;
100+ expect ( localRoomV1 . room_id ) . toEqual ( roomV3 . roomId ) ;
101+ const localRoomV2 = toLocalRoom ( client , { room_id : roomV2 . roomId } as IHierarchyRoom , hierarchy ) ;
102+ expect ( localRoomV2 . room_id ) . toEqual ( roomV3 . roomId ) ;
103+ const localRoomV3 = toLocalRoom ( client , { room_id : roomV3 . roomId } as IHierarchyRoom , hierarchy ) ;
104+ expect ( localRoomV3 . room_id ) . toEqual ( roomV3 . roomId ) ;
105+ } ) ;
106+
107+ it ( "grabs last room that is in hierarchy when latest version is *not* in hierarchy" , ( ) => {
108+ const hierarchy = {
109+ roomMap : new Map ( [
110+ [ roomV1 . roomId , { room_id : roomV1 . roomId } as IHierarchyRoom ] ,
111+ [ roomV2 . roomId , { room_id : roomV2 . roomId } as IHierarchyRoom ] ,
112+ ] ) ,
113+ } as RoomHierarchy ;
114+ const localRoomV1 = toLocalRoom ( client , { room_id : roomV1 . roomId } as IHierarchyRoom , hierarchy ) ;
115+ expect ( localRoomV1 . room_id ) . toEqual ( roomV2 . roomId ) ;
116+ const localRoomV2 = toLocalRoom ( client , { room_id : roomV2 . roomId } as IHierarchyRoom , hierarchy ) ;
117+ expect ( localRoomV2 . room_id ) . toEqual ( roomV2 . roomId ) ;
118+ const localRoomV3 = toLocalRoom ( client , { room_id : roomV3 . roomId } as IHierarchyRoom , hierarchy ) ;
119+ expect ( localRoomV3 . room_id ) . toEqual ( roomV2 . roomId ) ;
120+ } ) ;
121+
122+ it ( "returns specified room when none of the versions is in hierarchy" , ( ) => {
123+ const hierarchy = { roomMap : new Map ( [ ] ) } as RoomHierarchy ;
124+ const localRoomV1 = toLocalRoom ( client , { room_id : roomV1 . roomId } as IHierarchyRoom , hierarchy ) ;
125+ expect ( localRoomV1 . room_id ) . toEqual ( roomV1 . roomId ) ;
126+ const localRoomV2 = toLocalRoom ( client , { room_id : roomV2 . roomId } as IHierarchyRoom , hierarchy ) ;
127+ expect ( localRoomV2 . room_id ) . toEqual ( roomV2 . roomId ) ;
128+ const localRoomV3 = toLocalRoom ( client , { room_id : roomV3 . roomId } as IHierarchyRoom , hierarchy ) ;
129+ expect ( localRoomV3 . room_id ) . toEqual ( roomV3 . roomId ) ;
130+ } ) ;
131+ } ) ;
132+
133+ describe ( "<HierarchyLevel />" , ( ) => {
134+ stubClient ( ) ;
135+ const client = MatrixClientPeg . get ( ) ;
136+
137+ const dmRoomMap = {
138+ getUserIdForRoomId : jest . fn ( ) ,
139+ } as unknown as DMRoomMap ;
140+ jest . spyOn ( DMRoomMap , "shared" ) . mockReturnValue ( dmRoomMap ) ;
141+
142+ const root = mkStubRoom ( "room-id-1" , "Room 1" , client ) ;
143+ const room1 = mkStubRoom ( "room-id-2" , "Room 2" , client ) ;
144+ const room2 = mkStubRoom ( "room-id-3" , "Room 3" , client ) ;
145+
146+ const hierarchyRoot = {
147+ room_id : root . roomId ,
148+ num_joined_members : 1 ,
149+ children_state : [
150+ {
151+ state_key : room1 . roomId ,
152+ content : { order : "1" } ,
153+ } ,
154+ {
155+ state_key : room2 . roomId ,
156+ content : { order : "2" } ,
157+ } ,
158+ ] ,
159+ } as IHierarchyRoom ;
160+ const hierarchyRoom1 = { room_id : room1 . roomId , num_joined_members : 2 } as IHierarchyRoom ;
161+ const hierarchyRoom2 = { room_id : root . roomId , num_joined_members : 3 } as IHierarchyRoom ;
162+
163+ const roomHierarchy = {
164+ roomMap : new Map ( [
165+ [ root . roomId , hierarchyRoot ] ,
166+ [ room1 . roomId , hierarchyRoom1 ] ,
167+ [ room2 . roomId , hierarchyRoom2 ] ,
168+ ] ) ,
169+ isSuggested : jest . fn ( ) ,
170+ } as unknown as RoomHierarchy ;
171+
172+ it ( "renders" , ( ) => {
173+ const defaultProps = {
174+ root : hierarchyRoot ,
175+ roomSet : new Set ( [ hierarchyRoom1 , hierarchyRoom2 ] ) ,
176+ hierarchy : roomHierarchy ,
177+ parents : new Set < string > ( ) ,
178+ selectedMap : new Map < string , Set < string > > ( ) ,
179+ onViewRoomClick : jest . fn ( ) ,
180+ onJoinRoomClick : jest . fn ( ) ,
181+ onToggleClick : jest . fn ( ) ,
182+ } ;
183+ const getComponent = ( props = { } ) : React . ReactElement => (
184+ < MatrixClientContext . Provider value = { client } >
185+ < HierarchyLevel { ...defaultProps } { ...props } /> ;
186+ </ MatrixClientContext . Provider >
187+ ) ;
188+
189+ const { container } = render ( getComponent ( ) ) ;
190+ expect ( container ) . toMatchSnapshot ( ) ;
191+ } ) ;
192+ } ) ;
70193} ) ;
0 commit comments