add more tests

This commit is contained in:
Michael Telatynski 2021-04-23 09:55:30 +01:00
parent fba7465ad4
commit 1075756929
3 changed files with 76 additions and 11 deletions

View file

@ -583,7 +583,9 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
return state; return state;
} }
// traverse space tree with DFS calling fn on each space including the given root one // traverse space tree with DFS calling fn on each space including the given root one,
// if includeRooms is true then fn will be called on each leaf room, if it is present in multiple sub-spaces
// then fn will be called with it multiple times.
public traverseSpace( public traverseSpace(
spaceId: string, spaceId: string,
fn: (roomId: string) => void, fn: (roomId: string) => void,

View file

@ -18,7 +18,7 @@ import { EventType } from "matrix-js-sdk/src/@types/event";
import "../skinned-sdk"; // Must be first for skinning to work import "../skinned-sdk"; // Must be first for skinning to work
import SpaceStore from "../../src/stores/SpaceStore"; import SpaceStore from "../../src/stores/SpaceStore";
import { setupAsyncStoreWithClient } from "../utils/test-utils"; import { resetAsyncStoreWithClient, setupAsyncStoreWithClient } from "../utils/test-utils";
import { createTestClient, mkEvent, mkStubRoom } from "../test-utils"; import { createTestClient, mkEvent, mkStubRoom } from "../test-utils";
import { EnhancedMap } from "../../src/utils/maps"; import { EnhancedMap } from "../../src/utils/maps";
import SettingsStore from "../../src/settings/SettingsStore"; import SettingsStore from "../../src/settings/SettingsStore";
@ -45,8 +45,14 @@ const testUserId = "@test:user";
let rooms = []; let rooms = [];
const mkRoom = (roomId: string) => {
const room = mkStubRoom(roomId);
rooms.push(room);
return room;
};
const mkSpace = (spaceId: string, children: string[] = []) => { const mkSpace = (spaceId: string, children: string[] = []) => {
const space = mkStubRoom(spaceId); const space = mkRoom(spaceId);
space.isSpaceRoom.mockReturnValue(true); space.isSpaceRoom.mockReturnValue(true);
space.currentState.getStateEvents.mockImplementation(mockStateEventImplementation(children.map(roomId => space.currentState.getStateEvents.mockImplementation(mockStateEventImplementation(children.map(roomId =>
mkEvent({ mkEvent({
@ -59,7 +65,6 @@ const mkSpace = (spaceId: string, children: string[] = []) => {
ts: Date.now(), ts: Date.now(),
}), }),
))); )));
rooms.push(space);
return space; return space;
}; };
@ -84,9 +89,8 @@ describe("SpaceStore", () => {
} }
}); });
}); });
afterEach(() => { afterEach(async () => {
// @ts-ignore await resetAsyncStoreWithClient(store);
store.onNotReady();
}); });
describe("static hierarchy resolution tests", () => { describe("static hierarchy resolution tests", () => {
@ -237,8 +241,59 @@ describe("SpaceStore", () => {
}); });
describe("traverseSpace", () => { describe("traverseSpace", () => {
test.todo("avoids cycles"); beforeEach(() => {
test.todo("including rooms"); mkSpace("!a:server", [
test.todo("excluding rooms"); mkSpace("!b:server", [
mkSpace("!c:server", [
"!a:server",
mkRoom("!c-child:server").roomId,
mkRoom("!shared-child:server").roomId,
]).roomId,
mkRoom("!b-child:server").roomId,
]).roomId,
mkRoom("!a-child:server").roomId,
"!shared-child:server",
]);
});
it("avoids cycles", () => {
const seenMap = new Map<string, number>();
store.traverseSpace("!b:server", roomId => {
seenMap.set(roomId, (seenMap.get(roomId) || 0) + 1);
});
expect(seenMap.size).toBe(3);
expect(seenMap.get("!a:server")).toBe(1);
expect(seenMap.get("!b:server")).toBe(1);
expect(seenMap.get("!c:server")).toBe(1);
});
it("including rooms", () => {
const seenMap = new Map<string, number>();
store.traverseSpace("!b:server", roomId => {
seenMap.set(roomId, (seenMap.get(roomId) || 0) + 1);
}, true);
expect(seenMap.size).toBe(7);
expect(seenMap.get("!a:server")).toBe(1);
expect(seenMap.get("!a-child:server")).toBe(1);
expect(seenMap.get("!b:server")).toBe(1);
expect(seenMap.get("!b-child:server")).toBe(1);
expect(seenMap.get("!c:server")).toBe(1);
expect(seenMap.get("!c-child:server")).toBe(1);
expect(seenMap.get("!shared-child:server")).toBe(2);
});
it("excluding rooms", () => {
const seenMap = new Map<string, number>();
store.traverseSpace("!b:server", roomId => {
seenMap.set(roomId, (seenMap.get(roomId) || 0) + 1);
}, false);
expect(seenMap.size).toBe(3);
expect(seenMap.get("!a:server")).toBe(1);
expect(seenMap.get("!b:server")).toBe(1);
expect(seenMap.get("!c:server")).toBe(1);
});
}); });
}); });

View file

@ -15,7 +15,10 @@ limitations under the License.
*/ */
import { MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixClient } from "matrix-js-sdk/src/client";
import {AsyncStoreWithClient} from "../../src/stores/AsyncStoreWithClient"; import { AsyncStoreWithClient } from "../../src/stores/AsyncStoreWithClient";
// These methods make some use of some private methods on the AsyncStoreWithClient to simplify getting into a consistent
// ready state without needing to wire up a dispatcher and pretend to be a js-sdk client.
export const setupAsyncStoreWithClient = async (store: AsyncStoreWithClient<any>, client: MatrixClient) => { export const setupAsyncStoreWithClient = async (store: AsyncStoreWithClient<any>, client: MatrixClient) => {
// @ts-ignore // @ts-ignore
@ -23,3 +26,8 @@ export const setupAsyncStoreWithClient = async (store: AsyncStoreWithClient<any>
// @ts-ignore // @ts-ignore
await store.onReady(); await store.onReady();
}; };
export const resetAsyncStoreWithClient = async (store: AsyncStoreWithClient<any>) => {
// @ts-ignore
await store.onNotReady();
};