@@ -16,9 +16,10 @@ limitations under the License.
16
16
17
17
import { EventType } from "matrix-js-sdk/src/@types/event" ;
18
18
import { RoomMember } from "matrix-js-sdk/src/models/room-member" ;
19
+ import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state" ;
20
+ import { defer } from "matrix-js-sdk/src/utils" ;
19
21
20
22
import "../skinned-sdk" ; // Must be first for skinning to work
21
-
22
23
import SpaceStore from "../../src/stores/spaces/SpaceStore" ;
23
24
import {
24
25
MetaSpace ,
@@ -30,11 +31,11 @@ import {
30
31
import * as testUtils from "../test-utils" ;
31
32
import { mkEvent , stubClient } from "../test-utils" ;
32
33
import DMRoomMap from "../../src/utils/DMRoomMap" ;
33
- import { MatrixClientPeg } from "../../src/MatrixClientPeg" ;
34
34
import defaultDispatcher from "../../src/dispatcher/dispatcher" ;
35
35
import SettingsStore from "../../src/settings/SettingsStore" ;
36
36
import { SettingLevel } from "../../src/settings/SettingLevel" ;
37
37
import { Action } from "../../src/dispatcher/actions" ;
38
+ import { MatrixClientPeg } from "../../src/MatrixClientPeg" ;
38
39
39
40
jest . useFakeTimers ( ) ;
40
41
@@ -92,6 +93,8 @@ describe("SpaceStore", () => {
92
93
const store = SpaceStore . instance ;
93
94
const client = MatrixClientPeg . get ( ) ;
94
95
96
+ const spyDispatcher = jest . spyOn ( defaultDispatcher , "dispatch" ) ;
97
+
95
98
let rooms = [ ] ;
96
99
const mkRoom = ( roomId : string ) => testUtils . mkRoom ( client , roomId , rooms ) ;
97
100
const mkSpace = ( spaceId : string , children : string [ ] = [ ] ) => testUtils . mkSpace ( client , spaceId , rooms , children ) ;
@@ -122,6 +125,8 @@ describe("SpaceStore", () => {
122
125
[ MetaSpace . People ] : true ,
123
126
[ MetaSpace . Orphans ] : true ,
124
127
} ) ;
128
+
129
+ spyDispatcher . mockClear ( ) ;
125
130
} ) ;
126
131
127
132
afterEach ( async ( ) => {
@@ -842,6 +847,61 @@ describe("SpaceStore", () => {
842
847
} ) ;
843
848
} ) ;
844
849
850
+ it ( "does not race with lazy loading" , async ( ) => {
851
+ store . setActiveSpace ( MetaSpace . Home ) ;
852
+
853
+ mkRoom ( room1 ) ;
854
+ const space = mkSpace ( space1 , [ room1 ] ) ;
855
+ // seed the context for space1 to be room1
856
+ window . localStorage . setItem ( `mx_space_context_${ space1 } ` , room1 ) ;
857
+
858
+ await run ( ) ;
859
+
860
+ const deferred = defer < void > ( ) ;
861
+ ( space . loadMembersIfNeeded as jest . Mock ) . mockImplementation ( ( ) => {
862
+ const event = mkEvent ( {
863
+ event : true ,
864
+ type : EventType . RoomMember ,
865
+ content : { membership : "join" } ,
866
+ skey : dm1Partner . userId ,
867
+ user : dm1Partner . userId ,
868
+ room : space1 ,
869
+ } ) ;
870
+
871
+ client . emit ( RoomStateEvent . Members , event , null , null ) ;
872
+ deferred . resolve ( ) ;
873
+ } ) ;
874
+
875
+ spyDispatcher . mockClear ( ) ;
876
+ const getCurrentRoom = ( ) => {
877
+ for ( let i = spyDispatcher . mock . calls . length - 1 ; i >= 0 ; i -- ) {
878
+ if ( spyDispatcher . mock . calls [ i ] [ 0 ] . action === Action . ViewRoom ) {
879
+ return spyDispatcher . mock . calls [ i ] [ 0 ] [ "room_id" ] ;
880
+ }
881
+ }
882
+ } ;
883
+
884
+ // set up space with LL where loadMembersIfNeeded emits membership events which trip switchSpaceIfNeeded
885
+ expect ( space . loadMembersIfNeeded ) . not . toHaveBeenCalled ( ) ;
886
+
887
+ store . setActiveSpace ( space1 , true ) ;
888
+ // traverse the space and call loadMembersIfNeeded, similarly to SpaceWatcher's behaviour
889
+ store . traverseSpace ( space1 , roomId => {
890
+ client . getRoom ( roomId ) ?. loadMembersIfNeeded ( ) ;
891
+ } , false ) ;
892
+
893
+ expect ( store . activeSpace ) . toBe ( space1 ) ;
894
+ expect ( getCurrentRoom ( ) ) . toBe ( room1 ) ;
895
+
896
+ await deferred . promise ;
897
+ expect ( store . activeSpace ) . toBe ( space1 ) ;
898
+ expect ( getCurrentRoom ( ) ) . toBe ( room1 ) ;
899
+
900
+ jest . runAllTimers ( ) ;
901
+ expect ( store . activeSpace ) . toBe ( space1 ) ;
902
+ expect ( getCurrentRoom ( ) ) . toBe ( room1 ) ;
903
+ } ) ;
904
+
845
905
describe ( "context switching tests" , ( ) => {
846
906
let dispatcherRef ;
847
907
let currentRoom = null ;
0 commit comments