diff --git a/spec/test-utils/webrtc.ts b/spec/test-utils/webrtc.ts index 62bf94510..28ee7e8a8 100644 --- a/spec/test-utils/webrtc.ts +++ b/spec/test-utils/webrtc.ts @@ -148,6 +148,7 @@ export class MockMediaStream { ) {} listeners: [string, (...args: any[]) => any][] = []; + public isStopped = false; dispatchEvent(eventType: string) { this.listeners.forEach(([t, c]) => { @@ -196,7 +197,9 @@ export class MockMediaHandler { this.userMediaStreams.push(stream); return stream; } - stopUserMediaStream() { } + stopUserMediaStream(stream: MockMediaStream) { + stream.isStopped = true; + } hasAudioDevice() { return true; } hasVideoDevice() { return true; } stopAllStreams() {} diff --git a/spec/unit/webrtc/groupCall.spec.ts b/spec/unit/webrtc/groupCall.spec.ts index 378fc1de8..6fc7ddf00 100644 --- a/spec/unit/webrtc/groupCall.spec.ts +++ b/spec/unit/webrtc/groupCall.spec.ts @@ -263,6 +263,33 @@ describe('Group Call', function() { groupCall.leave(); } }); + + it("retains state of local user media stream when updated", async () => { + try { + await groupCall.create(); + + await groupCall.initLocalCallFeed(); + + const oldStream = groupCall.localCallFeed.stream as unknown as MockMediaStream; + + // arbitrary values, important part is that they're the same afterwards + await groupCall.setLocalVideoMuted(true); + await groupCall.setMicrophoneMuted(false); + + const newStream = await mockClient.getMediaHandler().getUserMediaStream(true, true); + + groupCall.updateLocalUsermediaStream(newStream); + + expect(groupCall.localCallFeed.stream).toBe(newStream); + + expect(groupCall.isLocalVideoMuted()).toEqual(true); + expect(groupCall.isMicrophoneMuted()).toEqual(false); + + expect(oldStream.isStopped).toEqual(true); + } finally { + groupCall.leave(); + } + }); }); describe('Placing calls', function() {