import SharingSession from './SharingSession' ; import SharingSessionStatusEnum from './SharingSessionStatusEnum' ; import SharingType from './SharingTypeEnum' ; jest . useFakeTimers ( ) ; const testUser = { username : '' , privateKey : '' , publicKey : '' , } ; describe ( 'SharingSession unit tests' , ( ) => { let sharingSession ; beforeEach ( ( ) => { process . env . RUN_MODE = 'test-jest' ; sharingSession = new SharingSession ( '1234' , testUser , { createPeerConnectionHelperRenderer : ( ) => { return { webContents : { on : jest . fn ( ) , send : jest . fn ( ) , } , close : jest . fn ( ) , } ; } , } ) ; } ) ; afterEach ( ( ) => { process . env . RUN_MODE = 'test' ; jest . clearAllMocks ( ) ; jest . restoreAllMocks ( ) ; } ) ; describe ( 'when new SahringSession() is created' , ( ) => { it ( 'should create new SharingSession with id' , ( ) => { expect ( sharingSession . id ) . toBeTruthy ( ) ; } ) ; it ( 'should crete new SharingSession with deviceID equal to "" ' , ( ) => { expect ( sharingSession . deviceID ) . toBe ( '' ) ; } ) ; it ( 'should create new SharingSession with sharingType equal to NOT_SET' , ( ) => { expect ( sharingSession . sharingType ) . toBe ( SharingType . NOT_SET ) ; } ) ; it ( 'should create new SharingSession with sharingStream set to null' , ( ) => { expect ( sharingSession . sharingStream ) . toBe ( null ) ; } ) ; it ( 'should create new SharingSession with roomID' , ( ) => { expect ( sharingSession . roomID ) . toBeTruthy ( ) ; } ) ; it ( 'should create new SharingSession with connectedDeviceAt set to null' , ( ) => { expect ( sharingSession . connectedDeviceAt ) . toBe ( null ) ; } ) ; it ( 'should create new SharingSession with sharingStartedAt set to null' , ( ) => { expect ( sharingSession . sharingStartedAt ) . toBe ( null ) ; } ) ; it ( 'should create new SharingSession with status set to NOT_CONNECTED' , ( ) => { expect ( sharingSession . status ) . toBe ( SharingSessionStatusEnum . NOT_CONNECTED ) ; } ) ; it ( 'should create new SharingSession with statusChangeListeners.length to be 1' , ( ) => { expect ( sharingSession . statusChangeListeners . length ) . toBe ( 1 ) ; } ) ; describe ( 'when .peerConnectionHelperRenderer.webContents.on(did-finish-load event occurred' , ( ) => { it ( 'should call .peerConnectionHelperRenderer?.webContents.send( with proper parameters' , ( ) => { const callback = sharingSession . peerConnectionHelperRenderer ?. webContents . on . mock . calls [ 0 ] [ 1 ] ; callback ( ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. webContents . send ) . toBeCalledWith ( 'create-peer-connection-with-data' , { roomID : sharingSession . roomID , sharingSessionID : sharingSession . id , user : testUser , } ) ; } ) ; } ) ; describe ( 'when .peerConnectionHelperRenderer.webContents.on("ipc-message" event occurred on "peer-connected" channel and when onDeviceConnectedCallback is defined' , ( ) => { it ( 'should call .onDeviceConnectedCallback(data) with proper data' , ( ) => { const testData = 'alsi33i223' ; const testCallback = jest . fn ( ) ; const callback = sharingSession . peerConnectionHelperRenderer ?. webContents . on . mock . calls [ 1 ] [ 1 ] ; sharingSession . onDeviceConnectedCallback = testCallback ; callback ( undefined , 'peer-connected' , testData ) ; expect ( testCallback ) . toBeCalledWith ( testData ) ; } ) ; } ) ; describe ( 'when .peerConnectionHelperRenderer.webContents.on("ipc-message" event occurred NOT on "peer-connected" channel or when .onDeviceConnectedCallback is UNdefined' , ( ) => { it ( 'should call .onDeviceConnectedCallback()' , ( ) => { const testData = 'alsi33i223' ; const testCallback = jest . fn ( ) ; const callback = sharingSession . peerConnectionHelperRenderer ?. webContents . on . mock . calls [ 1 ] [ 1 ] ; sharingSession . onDeviceConnectedCallback = testCallback ; callback ( undefined , 'random-channel!!' , testData ) ; expect ( testCallback ) . not . toBeCalled ( ) ; sharingSession . onDeviceConnectedCallback = undefined ; callback ( undefined , 'peer-connected' , testData ) ; expect ( testCallback ) . not . toBeCalled ( ) ; } ) ; } ) ; } ) ; describe ( 'when addStatusChangeListener is called' , ( ) => { it ( 'should have statusChangeListeners.length of 1' , ( ) => { sharingSession . addStatusChangeListener ( ( ) => { } ) ; expect ( sharingSession . statusChangeListeners . length ) . toBe ( 2 ) ; } ) ; } ) ; describe ( 'when notifyStatusChangeListeners is called' , ( ) => { it ( 'should invoke all statusChangeListeners' , async ( ) => { const mockStatusChangeListener1 = jest . fn ( ) ; const mockStatusChangeListener2 = jest . fn ( ) ; sharingSession . addStatusChangeListener ( mockStatusChangeListener1 ) ; sharingSession . addStatusChangeListener ( mockStatusChangeListener2 ) ; await sharingSession . notifyStatusChangeListeners ( ) ; expect ( mockStatusChangeListener1 ) . toBeCalled ( ) ; expect ( mockStatusChangeListener2 ) . toBeCalled ( ) ; } ) ; } ) ; describe ( 'when setStatus is called' , ( ) => { it ( 'should invoke notifyStatusChangeListeners' , async ( ) => { const mockNotifyStatusChangeListeners = jest . fn ( ) ; sharingSession . notifyStatusChangeListeners = mockNotifyStatusChangeListeners ; sharingSession . setStatus ( SharingSessionStatusEnum . CONNECTED ) ; expect ( mockNotifyStatusChangeListeners ) . toBeCalled ( ) ; } ) ; } ) ; describe ( 'when updateStatus is called with SharingSessionStatus argument' , ( ) => { it ( 'should set SharingSession.status as passed in updateStatus argument' , async ( ) => { sharingSession . setStatus ( SharingSessionStatusEnum . CONNECTED ) ; expect ( sharingSession . status ) . toBe ( SharingSessionStatusEnum . CONNECTED ) ; sharingSession . setStatus ( SharingSessionStatusEnum . SHARING ) ; expect ( sharingSession . status ) . toBe ( SharingSessionStatusEnum . SHARING ) ; } ) ; } ) ; describe ( 'when setDeviceID is called with deviceID argument' , ( ) => { it ( 'should set SharingSession.deviceID as in setDeviceID passed argument' , async ( ) => { const testDeviceID = '8989' ; sharingSession . setDeviceID ( testDeviceID ) ; expect ( sharingSession . deviceID ) . toBe ( testDeviceID ) ; } ) ; } ) ; describe ( 'when destroy() is called' , ( ) => { it ( 'should call peerConnectionHelperRenderer.close()' , ( ) => { sharingSession . destroy ( ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. close ) . toBeCalled ( ) ; } ) ; } ) ; describe ( 'when setOnDeviceConnectedCallback() is called' , ( ) => { it ( 'should set a .onDeviceConnectedCallback same as passed in parameter' , ( ) => { const testCallback = ( _ ) => { } ; sharingSession . setOnDeviceConnectedCallback ( testCallback ) ; expect ( sharingSession . onDeviceConnectedCallback ) . toBe ( testCallback ) ; } ) ; } ) ; describe ( 'when setDesktopCapturerSourceID() is called' , ( ) => { it ( 'should set a .desktopCapturerSourceID and call .webContents.send with proper parameters' , ( ) => { const testID = '2o20d' ; sharingSession . setDesktopCapturerSourceID ( testID ) ; expect ( sharingSession . desktopCapturerSourceID ) . toEqual ( testID ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. webContents . send ) . toBeCalledWith ( 'set-desktop-capturer-source-id' , testID ) ; } ) ; } ) ; describe ( 'when callPeer() is called' , ( ) => { it ( 'should call .webContents.send with proper event name' , ( ) => { sharingSession . callPeer ( ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. webContents . send ) . toBeCalledWith ( 'call-peer' ) ; } ) ; } ) ; describe ( 'when disconnectByHostMachineUser() is called' , ( ) => { it ( 'should call .webContents.send with proper event name' , ( ) => { sharingSession . disconnectByHostMachineUser ( ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. webContents . send ) . toBeCalledWith ( 'disconnect-by-host-machine-user' ) ; } ) ; } ) ; describe ( 'when denyConnectionForPartner() is called' , ( ) => { it ( 'should call .webContents.send with proper event name' , ( ) => { sharingSession . denyConnectionForPartner ( ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. webContents . send ) . toBeCalledWith ( 'deny-connection-for-partner' ) ; } ) ; } ) ; describe ( 'when appLanguageChanged() is called' , ( ) => { it ( 'should call .webContents.send with proper event name' , ( ) => { sharingSession . appLanguageChanged ( ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. webContents . send ) . toBeCalledWith ( 'app-language-changed' ) ; } ) ; } ) ; describe ( 'when appThemeChanged() is called' , ( ) => { it ( 'should call .webContents.send with proper event name' , ( ) => { sharingSession . appThemeChanged ( ) ; expect ( sharingSession . peerConnectionHelperRenderer ?. webContents . send ) . toBeCalledWith ( 'app-color-theme-changed' ) ; } ) ; } ) ; } ) ;