@@ -15,8 +15,8 @@ limitations under the License.
1515*/
1616
1717import { type MatrixEvent } from "../../../src" ;
18- import { CallMembership , DEFAULT_EXPIRE_DURATION } from "../../../src/matrixrtc/CallMembership" ;
1918import { rtcMembershipTemplate , sessionMembershipTemplate } from "./mocks" ;
19+ import { CallMembership , DEFAULT_EXPIRE_DURATION } from "../../../src/matrixrtc/CallMembership" ;
2020
2121function makeMockEvent ( originTs = 0 , content = { } ) : MatrixEvent {
2222 return {
@@ -187,12 +187,24 @@ describe("CallMembership", () => {
187187
188188 describe ( "RtcMembershipData" , ( ) => {
189189 const membershipTemplate = rtcMembershipTemplate ;
190+
190191 it ( "rejects membership with no slot_id" , ( ) => {
191192 expect ( ( ) => {
192193 new CallMembership ( makeMockEvent ( 0 , { ...membershipTemplate , slot_id : undefined } ) ) ;
193194 } ) . toThrow ( ) ;
194195 } ) ;
195196
197+ it ( "rejects membership with invalid slot_id" , ( ) => {
198+ expect ( ( ) => {
199+ new CallMembership ( makeMockEvent ( 0 , { ...membershipTemplate , slot_id : "invalid_slot_id" } ) ) ;
200+ } ) . toThrow ( ) ;
201+ } ) ;
202+ it ( "accepts membership with valid slot_id" , ( ) => {
203+ expect ( ( ) => {
204+ new CallMembership ( makeMockEvent ( 0 , { ...membershipTemplate , slot_id : "m.call#" } ) ) ;
205+ } ) . not . toThrow ( ) ;
206+ } ) ;
207+
196208 it ( "rejects membership with no application" , ( ) => {
197209 expect ( ( ) => {
198210 new CallMembership ( makeMockEvent ( 0 , { ...membershipTemplate , application : undefined } ) ) ;
@@ -248,18 +260,91 @@ describe("CallMembership", () => {
248260 new CallMembership (
249261 makeMockEvent ( 0 , {
250262 ...membershipTemplate ,
251- member : { id : "test" , device_id : "test" , user_id : "@test:user.id" } ,
263+ member : { id : "test" , device_id : "test" , user_id : "@test-wrong-user:user.id" } ,
264+ } ) ,
265+ ) ;
266+ } ) . toThrow ( ) ;
267+ } ) ;
268+ it ( "rejects membership with incorrect sticky_key" , ( ) => {
269+ expect ( ( ) => {
270+ new CallMembership ( makeMockEvent ( 0 , membershipTemplate ) ) ;
271+ } ) . not . toThrow ( ) ;
272+ expect ( ( ) => {
273+ new CallMembership (
274+ makeMockEvent ( 0 , {
275+ ...membershipTemplate ,
276+ sticky_key : 1 ,
277+ msc4354_sticky_key : undefined ,
278+ } ) ,
279+ ) ;
280+ } ) . toThrow ( ) ;
281+ expect ( ( ) => {
282+ new CallMembership (
283+ makeMockEvent ( 0 , {
284+ ...membershipTemplate ,
285+ sticky_key : "1" ,
286+ msc4354_sticky_key : undefined ,
252287 } ) ,
253288 ) ;
254289 } ) . not . toThrow ( ) ;
290+ expect ( ( ) => {
291+ new CallMembership ( makeMockEvent ( 0 , { ...membershipTemplate , msc4354_sticky_key : undefined } ) ) ;
292+ } ) . toThrow ( ) ;
293+ expect ( ( ) => {
294+ new CallMembership (
295+ makeMockEvent ( 0 , {
296+ ...membershipTemplate ,
297+ msc4354_sticky_key : 1 ,
298+ sticky_key : "valid" ,
299+ } ) ,
300+ ) ;
301+ } ) . toThrow ( ) ;
302+ expect ( ( ) => {
303+ new CallMembership (
304+ makeMockEvent ( 0 , {
305+ ...membershipTemplate ,
306+ msc4354_sticky_key : "valid" ,
307+ sticky_key : "valid" ,
308+ } ) ,
309+ ) ;
310+ } ) . not . toThrow ( ) ;
311+ expect ( ( ) => {
312+ new CallMembership (
313+ makeMockEvent ( 0 , {
314+ ...membershipTemplate ,
315+ msc4354_sticky_key : "valid_but_different" ,
316+ sticky_key : "valid" ,
317+ } ) ,
318+ ) ;
319+ } ) . toThrow ( ) ;
255320 } ) ;
256321
257322 it ( "considers memberships unexpired if local age low enough" , ( ) => {
258- // TODO link prev event
323+ const now = Date . now ( ) ;
324+ const startEv = makeMockEvent ( now - DEFAULT_EXPIRE_DURATION + 100 , membershipTemplate ) ;
325+ const membershipWithRel = new CallMembership (
326+ //update 900 ms later
327+ makeMockEvent ( now - DEFAULT_EXPIRE_DURATION + 1000 , membershipTemplate ) ,
328+ startEv ,
329+ ) ;
330+ const membershipWithoutRel = new CallMembership ( startEv ) ;
331+ expect ( membershipWithRel . isExpired ( ) ) . toEqual ( false ) ;
332+ expect ( membershipWithoutRel . isExpired ( ) ) . toEqual ( false ) ;
333+ expect ( membershipWithoutRel . createdTs ( ) ) . toEqual ( membershipWithRel . createdTs ( ) ) ;
259334 } ) ;
260335
261336 it ( "considers memberships expired if local age large enough" , ( ) => {
262- // TODO link prev event
337+ const now = Date . now ( ) ;
338+ const startEv = makeMockEvent ( now - DEFAULT_EXPIRE_DURATION - 100 , membershipTemplate ) ;
339+ const membershipWithRel = new CallMembership (
340+ //update 1100 ms later (so the update is still after expiry)
341+ makeMockEvent ( now - DEFAULT_EXPIRE_DURATION + 1000 , membershipTemplate ) ,
342+ startEv ,
343+ ) ;
344+ const membershipWithoutRel = new CallMembership ( startEv ) ;
345+ expect ( membershipWithRel . isExpired ( ) ) . toEqual ( true ) ;
346+ expect ( membershipWithoutRel . isExpired ( ) ) . toEqual ( true ) ;
347+ expect ( membershipWithoutRel . createdTs ( ) ) . toEqual ( membershipWithRel . createdTs ( ) ) ;
263348 } ) ;
264349
265350 describe ( "getTransport" , ( ) => {
@@ -279,6 +364,7 @@ describe("CallMembership", () => {
279364 expect ( membership . getTransport ( oldestMembership ) ) . toStrictEqual ( { type : "livekit" } ) ;
280365 } ) ;
281366 } ) ;
367+
282368 describe ( "correct values from computed fields" , ( ) => {
283369 const membership = new CallMembership ( makeMockEvent ( 0 , membershipTemplate ) ) ;
284370 it ( "returns correct sender" , ( ) => {
0 commit comments