add more tests
This commit is contained in:
parent
fba7465ad4
commit
1075756929
3 changed files with 76 additions and 11 deletions
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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();
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in a new issue