1- import nock from 'nock' ;
21import { v4 as uuidv4 } from 'uuid' ;
32
43import { SimpleMockSdk , MockSession , MockStream , MockTrack , random } from '../../test-utils' ;
@@ -25,7 +24,6 @@ let userId: string;
2524
2625beforeEach ( ( ) => {
2726 jest . clearAllMocks ( ) ;
28- nock . cleanAll ( ) ;
2927 mockSdk = ( new SimpleMockSdk ( ) as any ) ;
3028 ( mockSdk as any ) . isGuest = true ;
3129 mockSdk . _config . autoConnectSessions = true ;
@@ -1006,7 +1004,7 @@ describe('setInitialMuteStates', () => {
10061004 beforeEach ( ( ) => {
10071005 session = new MockSession ( ) as any ;
10081006 audioSender = { track : { kind : 'audio' , enabled : true } } ;
1009- videoSender = { track : { kind : 'video' , enabled : true } } ;
1007+ videoSender = { track : { kind : 'video' , enabled : true , id : 'camera-track-1' } } ;
10101008 } ) ;
10111009
10121010 it ( 'should mute video' , async ( ) => {
@@ -1219,7 +1217,7 @@ describe('setVideoMute', () => {
12191217
12201218 await handler . setVideoMute ( session , { conversationId : session . conversationId , mute : false } ) ;
12211219
1222- expect ( mockSdk . logger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Cannot unmute, a video track already exists' ) , expect . any ( Object ) , undefined ) ;
1220+ expect ( mockSdk . logger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Cannot unmute, a camera video track already exists' ) , expect . any ( Object ) , undefined ) ;
12231221 } ) ;
12241222
12251223 it ( 'mute: should mute video track when there is no screen track and remove track from outboundStream' , async ( ) => {
@@ -1306,7 +1304,7 @@ describe('setVideoMute', () => {
13061304 const stream = new MockStream ( true ) ;
13071305 const spy = jest . spyOn ( mockSdk . media , 'startMedia' ) . mockResolvedValue ( stream as any ) ;
13081306 jest . spyOn ( mockSessionManager , 'getAllActiveSessions' ) . mockReturnValue ( [ { id : session . id } as IExtendedMediaSession ] ) ;
1309- jest . spyOn ( handler , 'addMediaToSession ' ) . mockResolvedValue ( ) ;
1307+ jest . spyOn ( handler , 'addReplaceTrackToSession ' ) . mockResolvedValue ( ) ;
13101308
13111309 session . _outboundStream = {
13121310 addTrack : jest . fn ( ) ,
@@ -1327,7 +1325,7 @@ describe('setVideoMute', () => {
13271325 const stream = new MockStream ( true ) ;
13281326 const spy = jest . spyOn ( mockSdk . media , 'startMedia' ) . mockResolvedValue ( stream as any ) ;
13291327 jest . spyOn ( mockSessionManager , 'getAllActiveSessions' ) . mockReturnValue ( [ { id : session . id } as IExtendedMediaSession ] ) ;
1330- jest . spyOn ( handler , 'addMediaToSession ' ) . mockResolvedValue ( ) ;
1328+ jest . spyOn ( handler , 'addReplaceTrackToSession ' ) . mockResolvedValue ( ) ;
13311329
13321330 session . _outboundStream = {
13331331 addTrack : jest . fn ( ) ,
@@ -1347,7 +1345,7 @@ describe('setVideoMute', () => {
13471345 const unmuteDeviceId = 'device-id' ;
13481346 const stream = new MockStream ( true ) ;
13491347 const spy = jest . spyOn ( mockSdk . media , 'startMedia' ) . mockResolvedValue ( stream as any ) ;
1350- jest . spyOn ( handler , 'addMediaToSession ' ) . mockResolvedValue ( ) ;
1348+ jest . spyOn ( handler , 'addReplaceTrackToSession ' ) . mockResolvedValue ( ) ;
13511349
13521350 session . _outboundStream = {
13531351 addTrack : jest . fn ( ) ,
@@ -1361,6 +1359,51 @@ describe('setVideoMute', () => {
13611359 expect ( session . unmute ) . not . toHaveBeenCalled ( ) ;
13621360 expect ( stream . getVideoTracks ( ) [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
13631361 } ) ;
1362+
1363+ it ( 'mute: should find camera track when screen share exists' , async ( ) => {
1364+ const screenTrack = new MockTrack ( 'video' ) ;
1365+ screenTrack . id = 'screen-track-id' ;
1366+ const cameraTrack = new MockTrack ( 'video' ) ;
1367+ cameraTrack . id = 'camera-track-id' ;
1368+
1369+ session . _screenShareStream = {
1370+ getVideoTracks : jest . fn ( ) . mockReturnValue ( [ screenTrack ] )
1371+ } as any ;
1372+
1373+ session . _outboundStream = {
1374+ removeTrack : jest . fn ( ) ,
1375+ getVideoTracks : jest . fn ( ) . mockReturnValue ( [ cameraTrack ] )
1376+ } as any ;
1377+
1378+ jest . spyOn ( handler , 'getSendersByTrackType' ) . mockReturnValue ( [
1379+ { track : cameraTrack }
1380+ ] as any ) ;
1381+
1382+ await handler . setVideoMute ( session , { conversationId : session . conversationId , mute : true } ) ;
1383+
1384+ expect ( cameraTrack . stop ) . toHaveBeenCalled ( ) ;
1385+ expect ( session . mute ) . toHaveBeenCalledWith ( userId , 'video' ) ;
1386+ } ) ;
1387+
1388+ it ( 'unmute: should check for existing camera track when screen share exists' , async ( ) => {
1389+ const screenTrack = new MockTrack ( 'video' ) ;
1390+ screenTrack . id = 'screen-track-id' ;
1391+ const cameraTrack = new MockTrack ( 'video' ) ;
1392+ cameraTrack . id = 'camera-track-id' ;
1393+
1394+ session . _screenShareStream = {
1395+ getVideoTracks : jest . fn ( ) . mockReturnValue ( [ screenTrack ] )
1396+ } as any ;
1397+
1398+ session . _outboundStream = {
1399+ addTrack : jest . fn ( ) ,
1400+ getVideoTracks : jest . fn ( ) . mockReturnValue ( [ cameraTrack ] )
1401+ } as any ;
1402+
1403+ await handler . setVideoMute ( session , { conversationId : session . conversationId , mute : false } ) ;
1404+
1405+ expect ( mockSdk . logger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Cannot unmute, a camera video track already exists' ) , expect . any ( Object ) , undefined ) ;
1406+ } ) ;
13641407} ) ;
13651408
13661409describe ( 'setAudioMute' , ( ) => {
@@ -1483,33 +1526,29 @@ describe('getSendersByTrackType', () => {
14831526
14841527describe ( 'startScreenShare' , ( ) => {
14851528 let displayMediaSpy : jest . SpyInstance < Promise < MediaStream > > ;
1486- let videoMuteSpy : jest . SpyInstance < Promise < void > > ;
1487- let addReplaceTrackToSession : jest . SpyInstance < Promise < any > > ;
1529+ let addMediaToSessionSpy : jest . SpyInstance < Promise < void > > ;
14881530 let session : VideoMediaSession ;
14891531
14901532 beforeEach ( ( ) => {
14911533 displayMediaSpy = jest . spyOn ( mockSdk . media , 'startDisplayMedia' ) . mockResolvedValue ( new MockStream ( { video : true } ) as any ) ;
1492- videoMuteSpy = jest . spyOn ( handler , 'setVideoMute' ) . mockResolvedValue ( ) ;
1493- addReplaceTrackToSession = jest . spyOn ( handler , 'addReplaceTrackToSession' ) . mockResolvedValue ( ) ;
1534+ addMediaToSessionSpy = jest . spyOn ( handler , 'addMediaToSession' ) . mockResolvedValue ( ) ;
14941535 session = new MockSession ( ) as any ;
14951536 } ) ;
14961537
1497- it ( 'should start media and mute video if it is not already muted ' , async ( ) => {
1538+ it ( 'should start media and add screen share track without replacing existing video ' , async ( ) => {
14981539 await handler . startScreenShare ( session ) ;
14991540
15001541 expect ( displayMediaSpy ) . toHaveBeenCalled ( ) ;
1501- expect ( videoMuteSpy ) . toHaveBeenCalled ( ) ;
1502- expect ( addReplaceTrackToSession ) . toHaveBeenCalled ( ) ;
1542+ expect ( addMediaToSessionSpy ) . toHaveBeenCalled ( ) ;
15031543 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStart ) . toHaveBeenCalled ( ) ;
15041544 } ) ;
15051545
1506- it ( 'should not mute video if already muted ' , async ( ) => {
1546+ it ( 'should add screen share track regardless of video mute state ' , async ( ) => {
15071547 session . videoMuted = true ;
15081548 await handler . startScreenShare ( session ) ;
15091549
15101550 expect ( displayMediaSpy ) . toHaveBeenCalled ( ) ;
1511- expect ( videoMuteSpy ) . not . toHaveBeenCalled ( ) ;
1512- expect ( addReplaceTrackToSession ) . toHaveBeenCalled ( ) ;
1551+ expect ( addMediaToSessionSpy ) . toHaveBeenCalled ( ) ;
15131552 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStart ) . toHaveBeenCalled ( ) ;
15141553 } ) ;
15151554
@@ -1534,12 +1573,10 @@ describe('startScreenShare', () => {
15341573} ) ;
15351574
15361575describe ( 'stopScreenShare' , ( ) => {
1537- let videoMuteSpy ;
15381576 let removeMediaSpy ;
15391577 let session ;
15401578
15411579 beforeEach ( ( ) => {
1542- videoMuteSpy = jest . spyOn ( handler , 'setVideoMute' ) . mockResolvedValue ( ) ;
15431580 removeMediaSpy = jest . spyOn ( handler , 'removeMediaFromSession' ) . mockResolvedValue ( ) ;
15441581 session = new MockSession ( ) ;
15451582 } ) ;
@@ -1549,49 +1586,34 @@ describe('stopScreenShare', () => {
15491586
15501587 await handler . stopScreenShare ( session ) ;
15511588
1552- expect ( videoMuteSpy ) . not . toHaveBeenCalled ( ) ;
15531589 expect ( removeMediaSpy ) . not . toHaveBeenCalled ( ) ;
15541590 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . not . toHaveBeenCalled ( ) ;
15551591 } ) ;
15561592
1557- it ( 'should stop screen share tracks and unmute video if resurrectVideoOnScreenShareEnd' , async ( ) => {
1558- session . _resurrectVideoOnScreenShareEnd = true ;
1593+ it ( 'should remove screen share track and stop it' , async ( ) => {
15591594 session . _screenShareStream = new MockStream ( { video : true } ) ;
1595+ const screenTrack = session . _screenShareStream . _tracks [ 0 ] ;
15601596
1561- await handler . stopScreenShare ( session ) ;
1562-
1563- expect ( videoMuteSpy ) . toHaveBeenCalled ( ) ;
1564- expect ( session . _screenShareStream . _tracks [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
1565- expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . toHaveBeenCalled ( ) ;
1566- } ) ;
1567-
1568- it ( 'should not unmute video if not resurrect' , async ( ) => {
1569- session . resurrectVideoOnScreenShareEnd = false ;
1570- session . _screenShareStream = new MockStream ( { video : true } ) ;
1571-
1572- const replaceSpy = jest . fn ( ) ;
1573- jest . spyOn ( session . pc , 'getSenders' ) . mockReturnValue ( [ { track : session . _screenShareStream . _tracks [ 0 ] , replaceTrack : replaceSpy } ] ) ;
1597+ jest . spyOn ( session . pc , 'getSenders' ) . mockReturnValue ( [ { track : screenTrack } ] ) ;
15741598
15751599 await handler . stopScreenShare ( session ) ;
15761600
1577- expect ( videoMuteSpy ) . not . toHaveBeenCalled ( ) ;
1578- expect ( session . _screenShareStream . _tracks [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
1579- expect ( replaceSpy ) . toHaveBeenCalled ( ) ;
1601+ expect ( removeMediaSpy ) . toHaveBeenCalled ( ) ;
1602+ expect ( screenTrack . stop ) . toHaveBeenCalled ( ) ;
15801603 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . toHaveBeenCalled ( ) ;
15811604 } ) ;
15821605
1583- it ( 'should toggle off of screen share AND keep video unmuted if something goes wrong when fetching device media' , async ( ) => {
1584- videoMuteSpy = jest . spyOn ( handler , 'setVideoMute' ) . mockRejectedValueOnce ( { message : 'Could not start video source' } ) . mockResolvedValueOnce ( ) ;
1585- session . _resurrectVideoOnScreenShareEnd = true ;
1606+ it ( 'should stop screen share track even if no sender found' , async ( ) => {
15861607 session . _screenShareStream = new MockStream ( { video : true } ) ;
1608+ const screenTrack = session . _screenShareStream . _tracks [ 0 ] ;
1609+
1610+ jest . spyOn ( session . pc , 'getSenders' ) . mockReturnValue ( [ ] ) ;
15871611
15881612 await handler . stopScreenShare ( session ) ;
15891613
1590- expect ( videoMuteSpy ) . toHaveBeenNthCalledWith ( 1 , session , { conversationId : session . conversationId , mute : false } , true ) ;
1591- expect ( videoMuteSpy ) . toHaveBeenNthCalledWith ( 2 , session , { conversationId : session . conversationId , mute : true } , false ) ;
1592- expect ( session . _screenShareStream . _tracks [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
1614+ expect ( removeMediaSpy ) . not . toHaveBeenCalled ( ) ;
1615+ expect ( screenTrack . stop ) . toHaveBeenCalled ( ) ;
15931616 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . toHaveBeenCalled ( ) ;
1594- jest . resetAllMocks ( ) ;
15951617 } ) ;
15961618} ) ;
15971619
0 commit comments