1
0
mirror of https://github.com/pavlobu/deskreen.git synced 2025-05-19 00:40:11 -07:00
deskreen/app/features/PeerConnection/handlePeerOnData.spec.ts
2021-02-11 01:23:43 +02:00

205 lines
6.7 KiB
TypeScript

/* eslint-disable @typescript-eslint/ban-ts-comment */
import handlePeerOnData from './handlePeerOnData';
import getDesktopSourceStreamBySourceID from './getDesktopSourceStreamBySourceID';
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 DesktopCapturerSourceType from '../DesktopCapturerSourcesService/DesktopCapturerSourceType';
import NullSimplePeer from './NullSimplePeer';
import prepareDataMessageToSendScreenSourceType from './prepareDataMessageToSendScreenSourceType';
import DesktopCapturerSourcesService from '../DesktopCapturerSourcesService';
jest.useFakeTimers();
jest.mock('simple-peer');
jest.mock('./getDesktopSourceStreamBySourceID', () => {
return jest.fn();
});
const TEST_DATA_SET_VIDEO_QUALITY_05 = `
{
"type": "set_video_quality",
"payload": {
"value": 0.5
}
}
`;
const TEST_DATA_GET_SHARING_SOURCE_TYPE = `
{
"type": "get_sharing_source_type",
"payload": {
}
}
`;
describe('handlePeerOnData callback', () => {
let peerConnection: PeerConnection;
beforeEach(() => {
peerConnection = new PeerConnection(
TEST_ROOM_ID,
TEST_SHARING_SESSION_ID,
TEST_USER,
{} as RoomIDService,
{} as ConnectedDevicesService,
{} as SharingSessionService,
{} as DesktopCapturerSourcesService
);
peerConnection.desktopCapturerSourceID = DesktopCapturerSourceType.SCREEN;
});
afterEach(() => {
jest.clearAllMocks();
jest.restoreAllMocks();
});
describe('when handlePeerOnData called properly', () => {
describe('when handlePeerOnData called with set_video_quality data and when sharing source is SCREEN', () => {
it('should create new stream', () => {
handlePeerOnData(peerConnection, TEST_DATA_SET_VIDEO_QUALITY_05);
expect(getDesktopSourceStreamBySourceID).toBeCalled();
});
it('should call replaceTrack() on peer', async () => {
// @ts-ignore
getDesktopSourceStreamBySourceID.mockImplementation(
() =>
(({
getVideoTracks: () => [{ stop: jest.fn() }],
} as unknown) as MediaStream)
);
peerConnection.localStream = ({
getVideoTracks: () => [{ stop: jest.fn() }],
} as unknown) as MediaStream;
peerConnection.peer = ({
replaceTrack: jest.fn(),
} as unknown) as typeof NullSimplePeer;
await handlePeerOnData(peerConnection, TEST_DATA_SET_VIDEO_QUALITY_05);
expect(peerConnection.peer.replaceTrack).toBeCalled();
});
it('should call .stop() on old track to clear memory', async () => {
// @ts-ignore
getDesktopSourceStreamBySourceID.mockImplementation(
() =>
(({
getVideoTracks: () => [{ stop: jest.fn() }],
} as unknown) as MediaStream)
);
const oldTrackStopFunctionMock = jest.fn();
peerConnection.localStream = ({
getVideoTracks: () => [{ stop: oldTrackStopFunctionMock }],
} as unknown) as MediaStream;
peerConnection.peer = ({
replaceTrack: jest.fn(),
} as unknown) as typeof NullSimplePeer;
await handlePeerOnData(peerConnection, TEST_DATA_SET_VIDEO_QUALITY_05);
expect(oldTrackStopFunctionMock).toBeCalled();
});
});
describe('when handlePeerOnData called with set_video_quality data and when sharing source is WINDOW', () => {
it('should NOT create new stream', () => {
peerConnection.desktopCapturerSourceID =
DesktopCapturerSourceType.WINDOW;
handlePeerOnData(peerConnection, TEST_DATA_SET_VIDEO_QUALITY_05);
expect(getDesktopSourceStreamBySourceID).not.toBeCalled();
});
it('should NOT call replaceTrack() on peer', async () => {
peerConnection.desktopCapturerSourceID =
DesktopCapturerSourceType.WINDOW;
// @ts-ignore
getDesktopSourceStreamBySourceID.mockImplementation(
() =>
(({
getVideoTracks: () => [{ stop: jest.fn() }],
} as unknown) as MediaStream)
);
peerConnection.localStream = ({
getVideoTracks: () => [{ stop: jest.fn() }],
} as unknown) as MediaStream;
peerConnection.peer = ({
replaceTrack: jest.fn(),
} as unknown) as typeof NullSimplePeer;
await handlePeerOnData(peerConnection, TEST_DATA_SET_VIDEO_QUALITY_05);
expect(peerConnection.peer.replaceTrack).not.toBeCalled();
});
it('should NOT call .stop() on old track to clear memory', async () => {
peerConnection.desktopCapturerSourceID =
DesktopCapturerSourceType.WINDOW;
// @ts-ignore
getDesktopSourceStreamBySourceID.mockImplementation(
() =>
(({
getVideoTracks: () => [{ stop: jest.fn() }],
} as unknown) as MediaStream)
);
const oldTrackStopFunctionMock = jest.fn();
peerConnection.localStream = ({
getVideoTracks: () => [{ stop: oldTrackStopFunctionMock }],
} as unknown) as MediaStream;
peerConnection.peer = ({
replaceTrack: jest.fn(),
} as unknown) as typeof NullSimplePeer;
await handlePeerOnData(peerConnection, TEST_DATA_SET_VIDEO_QUALITY_05);
expect(oldTrackStopFunctionMock).not.toBeCalled();
});
});
describe('when handlePeerOnData called with get_sharing_source_type data', () => {
describe('when sharing source type is SCREEN', () => {
it('should call peer.send() with proper data', () => {
peerConnection.peer = ({
send: jest.fn(),
} as unknown) as typeof NullSimplePeer;
handlePeerOnData(peerConnection, TEST_DATA_GET_SHARING_SOURCE_TYPE);
expect(peerConnection.peer.send).toBeCalledWith(
prepareDataMessageToSendScreenSourceType(
DesktopCapturerSourceType.SCREEN
)
);
});
});
describe('when sharing source type is WINDOW', () => {
it('should call peer.send() with proper data', () => {
peerConnection.desktopCapturerSourceID =
DesktopCapturerSourceType.WINDOW;
peerConnection.peer = ({
send: jest.fn(),
} as unknown) as typeof NullSimplePeer;
handlePeerOnData(peerConnection, TEST_DATA_GET_SHARING_SOURCE_TYPE);
expect(peerConnection.peer.send).toBeCalledWith(
prepareDataMessageToSendScreenSourceType(
DesktopCapturerSourceType.WINDOW
)
);
});
});
});
});
});