@@ -48,6 +48,7 @@ import {
4848} from "../src" ;
4949import { IGetMediaConfigActionFromWidgetActionRequest } from "../src/interfaces/GetMediaConfigAction" ;
5050import { IReadRoomAccountDataFromWidgetActionRequest } from "../src/interfaces/ReadRoomAccountDataAction" ;
51+ import { IToDeviceMessage } from "../src/interfaces/IToDeviceMessage" ;
5152
5253jest . mock ( "../src/transport/PostmessageTransport" ) ;
5354
@@ -886,11 +887,11 @@ describe("ClientWidgetApi", () => {
886887 describe ( "receiving events" , ( ) => {
887888 const roomId = "!room:example.org" ;
888889 const otherRoomId = "!other-room:example.org" ;
889- const event = createRoomEvent ( { room_id : roomId , type : "m.room.message" , content : " hello" } ) ;
890+ const event = createRoomEvent ( { room_id : roomId , type : "m.room.message" , content : { hello : "there" } } ) ;
890891 const eventFromOtherRoom = createRoomEvent ( {
891892 room_id : otherRoomId ,
892893 type : "m.room.message" ,
893- content : "test" ,
894+ content : { test : "test" } ,
894895 } ) ;
895896
896897 it ( "forwards events to the widget from one room only" , async ( ) => {
@@ -1095,6 +1096,36 @@ describe("ClientWidgetApi", () => {
10951096 } ) ;
10961097 } ) ;
10971098
1099+ describe ( "receiving to device messages" , ( ) => {
1100+ it . each ( [ true , false ] ) ( "forwards device messages to the widget" , async ( encrypted ) => {
1101+ const event : IToDeviceMessage = {
1102+ content : { foo : "bar" } ,
1103+ type : "org.example.mytype" ,
1104+ sender : "@alice:example.org" ,
1105+ } ;
1106+ // Give the widget capabilities to receive from just one room
1107+ await loadIframe ( [ "org.matrix.msc3819.receive.to_device:org.example.mytype" ] ) ;
1108+
1109+ // Event from the matching room should be forwarded
1110+ await clientWidgetApi . feedToDevice ( event , encrypted ) ;
1111+ expect ( transport . send ) . toHaveBeenCalledWith ( WidgetApiToWidgetAction . SendToDevice , { ...event , encrypted } ) ;
1112+ } ) ;
1113+ it ( "ignores messages not allowed by capabilities" , async ( ) => {
1114+ const event : IToDeviceMessage = {
1115+ content : { foo : "bar" } ,
1116+ type : "org.example.othertype" ,
1117+ sender : "@alice:example.org" ,
1118+ } ;
1119+ // Give the widget capabilities to receive from just one room
1120+ await loadIframe ( [ "org.matrix.msc3819.receive.to_device:org.example.mytype" ] ) ;
1121+ // Clear all prior messages.
1122+ jest . mocked ( transport . send ) . mockClear ( ) ;
1123+ // Event from the matching room should be forwarded
1124+ await clientWidgetApi . feedToDevice ( event , false ) ;
1125+ expect ( transport . send ) . not . toHaveBeenCalled ( ) ;
1126+ } ) ;
1127+ } ) ;
1128+
10981129 describe ( "update_delayed_event action" , ( ) => {
10991130 it ( "fails to cancel delayed events" , async ( ) => {
11001131 const event : IUpdateDelayedEventFromWidgetActionRequest = {
@@ -1727,7 +1758,7 @@ describe("ClientWidgetApi", () => {
17271758 it ( "reads events from a specific room" , async ( ) => {
17281759 const roomId = "!room:example.org" ;
17291760 jest . spyOn ( clientWidgetApi , "getWidgetVersions" ) . mockResolvedValue ( [ ] ) ;
1730- const event = createRoomEvent ( { room_id : roomId , type : "net.example.test" , content : "test" } ) ;
1761+ const event = createRoomEvent ( { room_id : roomId , type : "net.example.test" , content : { test : "test" } } ) ;
17311762 driver . readRoomTimeline . mockImplementation ( async ( rId ) => {
17321763 if ( rId === roomId ) return [ event ] ;
17331764 return [ ] ;
@@ -1772,8 +1803,12 @@ describe("ClientWidgetApi", () => {
17721803 const roomId = "!room:example.org" ;
17731804 const otherRoomId = "!other-room:example.org" ;
17741805 jest . spyOn ( clientWidgetApi , "getWidgetVersions" ) . mockResolvedValue ( [ ] ) ;
1775- const event = createRoomEvent ( { room_id : roomId , type : "net.example.test" , content : "test" } ) ;
1776- const otherRoomEvent = createRoomEvent ( { room_id : otherRoomId , type : "net.example.test" , content : "hi" } ) ;
1806+ const event = createRoomEvent ( { room_id : roomId , type : "net.example.test" , content : { test : "test" } } ) ;
1807+ const otherRoomEvent = createRoomEvent ( {
1808+ room_id : otherRoomId ,
1809+ type : "net.example.test" ,
1810+ content : { hi : "there" } ,
1811+ } ) ;
17771812 driver . getKnownRooms . mockReturnValue ( [ roomId , otherRoomId ] ) ;
17781813 driver . readRoomTimeline . mockImplementation ( async ( rId ) => {
17791814 if ( rId === roomId ) return [ event ] ;
0 commit comments