@@ -31,6 +31,8 @@ import {
3131 type IOpenIDCredentials ,
3232 type ISendEventFromWidgetResponseData ,
3333 WidgetApiResponseError ,
34+ UnstableApiVersion ,
35+ type ApiVersion ,
3436} from "matrix-widget-api" ;
3537
3638import { createRoomWidgetClient , MatrixError , MsgType , UpdateDelayedEventAction } from "../../src/matrix" ;
@@ -49,6 +51,7 @@ const testOIDCToken = {
4951} ;
5052class 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
101109declare 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