Skip to content

Commit ffdb5b5

Browse files
committed
Test that RoomWidgetClient can receive state without update_state
1 parent 35f840e commit ffdb5b5

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

spec/unit/embedded.spec.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import {
3131
type IOpenIDCredentials,
3232
type ISendEventFromWidgetResponseData,
3333
WidgetApiResponseError,
34+
UnstableApiVersion,
35+
type ApiVersion,
3436
} from "matrix-widget-api";
3537

3638
import { createRoomWidgetClient, MatrixError, MsgType, UpdateDelayedEventAction } from "../../src/matrix";
@@ -49,6 +51,7 @@ const testOIDCToken = {
4951
};
5052
class MockWidgetApi extends EventEmitter {
5153
public start = jest.fn().mockResolvedValue(undefined);
54+
public getClientVersions = jest.fn();
5255
public requestCapability = jest.fn().mockResolvedValue(undefined);
5356
public requestCapabilities = jest.fn().mockResolvedValue(undefined);
5457
public requestCapabilityForRoomTimeline = jest.fn().mockResolvedValue(undefined);
@@ -96,6 +99,11 @@ class MockWidgetApi extends EventEmitter {
9699
send: jest.fn(),
97100
sendComplete: jest.fn(),
98101
};
102+
103+
public constructor(clientVersions: ApiVersion[]) {
104+
super();
105+
this.getClientVersions.mockResolvedValue(clientVersions);
106+
}
99107
}
100108

101109
declare module "../../src/types" {
@@ -117,7 +125,7 @@ describe("RoomWidgetClient", () => {
117125
let client: MatrixClient;
118126

119127
beforeEach(() => {
120-
widgetApi = new MockWidgetApi() as unknown as MockedObject<WidgetApi>;
128+
widgetApi = new MockWidgetApi([UnstableApiVersion.MSC2762_UPDATE_STATE]) as unknown as MockedObject<WidgetApi>;
121129
});
122130

123131
afterEach(() => {
@@ -668,10 +676,34 @@ describe("RoomWidgetClient", () => {
668676
detail: { data: { state: [event] } },
669677
}),
670678
);
679+
// Allow the getClientVersions promise to resolve
680+
await new Promise<void>((resolve) => setTimeout(resolve, 0));
671681
// It should now have changed the room state
672682
expect(room!.currentState.getStateEvents("org.example.foo", "bar")?.getEffectiveEvent()).toEqual(event);
673683
});
674684

685+
it("receives without support for update_state", async () => {
686+
widgetApi = new MockWidgetApi([]) as unknown as MockedObject<WidgetApi>;
687+
await makeClient({ receiveState: [{ eventType: "org.example.foo", stateKey: "bar" }] });
688+
expect(widgetApi.requestCapabilityForRoomTimeline).toHaveBeenCalledWith("!1:example.org");
689+
expect(widgetApi.requestCapabilityToReceiveState).toHaveBeenCalledWith("org.example.foo", "bar");
690+
691+
const emittedEvent = new Promise<MatrixEvent>((resolve) => client.once(ClientEvent.Event, resolve));
692+
const emittedSync = new Promise<SyncState>((resolve) => client.once(ClientEvent.Sync, resolve));
693+
widgetApi.emit(
694+
`action:${WidgetApiToWidgetAction.SendEvent}`,
695+
new CustomEvent(`action:${WidgetApiToWidgetAction.SendEvent}`, { detail: { data: event } }),
696+
);
697+
698+
// The client should've emitted about the received event
699+
expect((await emittedEvent).getEffectiveEvent()).toEqual(event);
700+
expect(await emittedSync).toEqual(SyncState.Syncing);
701+
// It should've also inserted the event into the room object
702+
const room = client.getRoom("!1:example.org");
703+
expect(room).not.toBeNull();
704+
expect(room!.currentState.getStateEvents("org.example.foo", "bar")?.getEffectiveEvent()).toEqual(event);
705+
});
706+
675707
it("ignores state updates for other rooms", async () => {
676708
const init = makeClient({ receiveState: [{ eventType: "org.example.foo", stateKey: "bar" }] });
677709
// Client needs to be told that the room state is loaded

0 commit comments

Comments
 (0)