import uuid from 'uuid' ; import { TEST_ROOM_ID , TEST_SHARING_SESSION_ID , TEST_USER , } from './mocks/testVars' ; import PeerConnection from '.' ; import RoomIDService from '../../server/RoomIDService' ; import ConnectedDevicesService from '../ConnectedDevicesService' ; import SharingSessionService from '../SharingSessionService' ; import { process as processMessage } from '../../utils/message' ; import NullSimplePeer from './NullSimplePeer' ; import handleRecieveEncryptedMessage , { handleDeviceIPMessage , } from './handleRecieveEncryptedMessage' ; import DesktopCapturerSourcesService from '../DesktopCapturerSourcesService' ; import getAppTheme from '../../utils/getAppTheme' ; import getAppLanguage from '../../utils/getAppLanguage' ; jest . useFakeTimers ( ) ; jest . mock ( 'simple-peer' ) ; jest . mock ( '../../utils/message' , ( ) => { return { process : jest . fn ( ) } ; } ) ; jest . mock ( 'uuid' , ( ) => { return { v4 : ( ) => '1234kdkd' , } ; } ) ; const TEST_DEVICE_DETAILS_PAYLOAD = { socketID : '123' , deviceType : 'computer' , os : 'Windows' , browser : 'Chrome 72' , deviceScreenWidth : 640 , deviceScreenHeight : 480 , } ; const TEST_DUMMY_ENCRYPTED_MESSAGE_PAYLOAD = ( { fromSocketID : '2411' , } as unknown ) as ReceiveEncryptedMessagePayload ; describe ( 'handleRecieveEncryptedMessage.ts' , ( ) => { let peerConnection ; beforeEach ( ( ) => { peerConnection = new PeerConnection ( TEST_ROOM_ID , TEST_SHARING_SESSION_ID , TEST_USER , { } as RoomIDService , { } as ConnectedDevicesService , { } as SharingSessionService , { } as DesktopCapturerSourcesService ) ; } ) ; afterEach ( ( ) => { jest . clearAllMocks ( ) ; jest . restoreAllMocks ( ) ; } ) ; describe ( 'when handleRecieveEncryptedMessage called properly' , ( ) => { describe ( 'when processed message type is CALL_ACCEPTED' , ( ) => { it ( 'should call peer.signal() with proper signal data' , async ( ) => { const TEST_SIGNAL_DATA = 'a32sdlf' ; processMessage . mockImplementation ( ( ) => { return { type : 'CALL_ACCEPTED' , payload : { signalData : TEST_SIGNAL_DATA , } , } ; } ) ; peerConnection . peer = ( { signal : jest . fn ( ) , } as unknown ) as typeof NullSimplePeer ; await handleRecieveEncryptedMessage ( peerConnection , TEST_DUMMY_ENCRYPTED_MESSAGE_PAYLOAD ) ; expect ( peerConnection . peer . signal ) . toBeCalledWith ( TEST_SIGNAL_DATA ) ; } ) ; } ) ; describe ( 'when processed message type is DEVICE_DETAILS' , ( ) => { it ( 'should call socket.emit() to get partner device IP' , async ( ) => { peerConnection . socket = ( { emit : jest . fn ( ) , } as unknown ) as SocketIOClient . Socket ; processMessage . mockImplementation ( ( ) => { return { type : 'DEVICE_DETAILS' , payload : TEST_DEVICE_DETAILS_PAYLOAD , } ; } ) ; await handleRecieveEncryptedMessage ( peerConnection , TEST_DUMMY_ENCRYPTED_MESSAGE_PAYLOAD ) ; expect ( peerConnection . socket . emit ) . toBeCalledWith ( 'GET_IP_BY_SOCKET_ID' , expect . anything ( ) , expect . anything ( ) ) ; } ) ; } ) ; describe ( 'when processed message type is GET_APP_THEME' , ( ) => { it ( 'should call .sendEncryptedMessage with proper payload' , async ( ) => { peerConnection . sendEncryptedMessage = jest . fn ( ) ; const TEST_GET_APP_THEME_PAYLOAD = { type : 'APP_THEME' , payload : { value : getAppTheme ( ) } , } ; processMessage . mockImplementation ( ( ) => { return { type : 'GET_APP_THEME' , payload : { } , } ; } ) ; await handleRecieveEncryptedMessage ( peerConnection , TEST_DUMMY_ENCRYPTED_MESSAGE_PAYLOAD ) ; expect ( peerConnection . sendEncryptedMessage ) . toBeCalledWith ( TEST_GET_APP_THEME_PAYLOAD ) ; } ) ; } ) ; describe ( 'when processed message type is GET_APP_LANGUAGE' , ( ) => { it ( 'should call .sendEncryptedMessage with proper payload' , async ( ) => { peerConnection . sendEncryptedMessage = jest . fn ( ) ; const TEST_GET_APP_LANGUAGE_PAYLOAD = { type : 'APP_LANGUAGE' , payload : { value : getAppLanguage ( ) } , } ; processMessage . mockImplementation ( ( ) => { return { type : 'GET_APP_LANGUAGE' , payload : { } , } ; } ) ; await handleRecieveEncryptedMessage ( peerConnection , TEST_DUMMY_ENCRYPTED_MESSAGE_PAYLOAD ) ; expect ( peerConnection . sendEncryptedMessage ) . toBeCalledWith ( TEST_GET_APP_LANGUAGE_PAYLOAD ) ; } ) ; } ) ; } ) ; describe ( 'when handleDeviceIPMessage was called properly' , ( ) => { it ( 'should set partnerDeviceDetails with message payload and call device connected callback' , async ( ) => { const TEST_DEVICE_IP = '123.123.123.123' ; const TEST_DEVICE_TO_BE_SET = { deviceIP : TEST_DEVICE_IP , deviceType : TEST_DEVICE_DETAILS_PAYLOAD . deviceType , deviceOS : TEST_DEVICE_DETAILS_PAYLOAD . os , deviceBrowser : TEST_DEVICE_DETAILS_PAYLOAD . browser , deviceScreenWidth : TEST_DEVICE_DETAILS_PAYLOAD . deviceScreenWidth , deviceScreenHeight : TEST_DEVICE_DETAILS_PAYLOAD . deviceScreenHeight , sharingSessionID : peerConnection . sharingSessionID , id : uuid . v4 ( ) , } ; peerConnection . onDeviceConnectedCallback = jest . fn ( ) ; handleDeviceIPMessage ( TEST_DEVICE_IP , peerConnection , { type : 'DEVICE_DETAILS' , payload : TEST_DEVICE_DETAILS_PAYLOAD , } ) ; expect ( peerConnection . partnerDeviceDetails ) . toEqual ( TEST_DEVICE_TO_BE_SET ) ; expect ( peerConnection . onDeviceConnectedCallback ) . toBeCalledWith ( TEST_DEVICE_TO_BE_SET ) ; } ) ; } ) ; } ) ;