mirror of
https://github.com/pavlobu/deskreen.git
synced 2025-05-18 08:20:10 -07:00
311 lines
10 KiB
TypeScript
311 lines
10 KiB
TypeScript
import path from 'path';
|
|
import { DesktopCapturerSource } from 'electron';
|
|
import DesktopCapturerSources, { getSourceTypeFromSourceID } from '.';
|
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
import Logger from '../../utils/LoggerWithFilePrefix';
|
|
import DesktopCapturerSourceType from './DesktopCapturerSourceType';
|
|
|
|
jest.useFakeTimers();
|
|
jest.mock('../../utils/LoggerWithFilePrefix'); // Logger is now a mock constructor
|
|
jest.mock('.', () => ({
|
|
__esModule: true, // this property makes it work
|
|
default: jest.fn(),
|
|
getSourceTypeFromSourceID: jest.requireActual('.').getSourceTypeFromSourceID,
|
|
}));
|
|
const testScreenSource1Name = 'screen:1234';
|
|
const testScreenSource2Name = 'screen:4321';
|
|
const testWindowSource1Name = 'window:1234';
|
|
const testWindowSource2Name = 'window:4321';
|
|
const testScreenSource1 = {
|
|
type: DesktopCapturerSourceType.SCREEN,
|
|
source: ({
|
|
id: 'screen:adfe2',
|
|
display_id: '82392',
|
|
} as unknown) as DesktopCapturerSource,
|
|
};
|
|
const testScreenSource2 = {
|
|
type: DesktopCapturerSourceType.SCREEN,
|
|
source: ({
|
|
id: 'screen:adfe212',
|
|
display_id: '123234',
|
|
} as unknown) as DesktopCapturerSource,
|
|
};
|
|
const testWindowSource1 = {
|
|
type: DesktopCapturerSourceType.WINDOW,
|
|
source: ({
|
|
id: 'window:a42323',
|
|
display_id: '82392',
|
|
} as unknown) as DesktopCapturerSource,
|
|
};
|
|
const testWindowSource2 = {
|
|
type: DesktopCapturerSourceType.WINDOW,
|
|
source: ({
|
|
id: 'window:adfe83292',
|
|
display_id: '123234',
|
|
} as unknown) as DesktopCapturerSource,
|
|
};
|
|
jest.mock('electron', () => {
|
|
// eslint-disable-next-line global-require
|
|
const testScreenSource1a = ({
|
|
id: 'screen:adfe2',
|
|
display_id: '82392',
|
|
} as unknown) as DesktopCapturerSource;
|
|
const testScreenSource2a = ({
|
|
id: 'screen:adfe212',
|
|
display_id: '123234',
|
|
} as unknown) as DesktopCapturerSource;
|
|
const testWindowSource1a = ({
|
|
id: 'window:a42323',
|
|
display_id: '82392',
|
|
} as unknown) as DesktopCapturerSource;
|
|
const testWindowSource2a = ({
|
|
id: 'window:adfe83292',
|
|
display_id: '123234',
|
|
} as unknown) as DesktopCapturerSource;
|
|
return {
|
|
// __esModule: true,
|
|
desktopCapturer: {
|
|
getSources: () => {
|
|
return new Promise((resolve) => {
|
|
resolve([
|
|
testScreenSource1a,
|
|
testWindowSource1a,
|
|
testScreenSource2a,
|
|
testWindowSource2a,
|
|
]);
|
|
});
|
|
},
|
|
},
|
|
};
|
|
});
|
|
|
|
describe('DesktopCapturerSourcesService tests', () => {
|
|
let desktopCapturerService: DesktopCapturerSources;
|
|
|
|
beforeEach(() => {
|
|
// Clear all instances and calls to constructor and all methods:
|
|
// @ts-ignore
|
|
Logger.mockClear();
|
|
// @ts-ignore
|
|
DesktopCapturerSources.mockClear();
|
|
jest.clearAllMocks();
|
|
jest.restoreAllMocks();
|
|
});
|
|
|
|
describe('when DesktopCapturerSourcesService was created properly', () => {
|
|
it('should create logger properly', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
|
|
expect(Logger).toHaveBeenCalledTimes(1);
|
|
expect(Logger).toHaveBeenCalledWith(path.join(__dirname, 'index.ts'));
|
|
});
|
|
|
|
it('should call startRefreshDesktopCapturerSourcesLoop', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
desktopCapturerService.startRefreshDesktopCapturerSourcesLoop = jest.fn();
|
|
|
|
desktopCapturerService.constructor();
|
|
|
|
expect(
|
|
desktopCapturerService.startRefreshDesktopCapturerSourcesLoop
|
|
).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('should call refreshDesktopCapturerSources multiple times', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
|
|
desktopCapturerService.refreshDesktopCapturerSources = jest.fn();
|
|
|
|
for (let i = 1; i < 5; i += 1) {
|
|
jest.advanceTimersByTime(6000);
|
|
|
|
expect(
|
|
desktopCapturerService.refreshDesktopCapturerSources
|
|
).toHaveBeenCalledTimes(i);
|
|
}
|
|
});
|
|
|
|
it('should call startPollForInactiveListenersLoop', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
desktopCapturerService.startPollForInactiveListenersLoop = jest.fn();
|
|
|
|
desktopCapturerService.constructor();
|
|
|
|
expect(
|
|
desktopCapturerService.startPollForInactiveListenersLoop
|
|
).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
describe('when .getSourcesMap was called', () => {
|
|
it('should return a sources map object', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
|
|
const res = desktopCapturerService.getSourcesMap();
|
|
|
|
expect(desktopCapturerService.sources).toBe(res);
|
|
});
|
|
});
|
|
|
|
describe('when .getScreenSources was called', () => {
|
|
it('should return sources array which are of type SCREEN only', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
desktopCapturerService.sources.set(
|
|
testScreenSource1Name,
|
|
testScreenSource1
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testScreenSource2Name,
|
|
testScreenSource2
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testWindowSource1Name,
|
|
testWindowSource1
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testWindowSource2Name,
|
|
testWindowSource2
|
|
);
|
|
|
|
const res = desktopCapturerService.getScreenSources();
|
|
|
|
expect(res).toEqual([
|
|
testScreenSource1.source,
|
|
testScreenSource2.source,
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('when .getAppWindowSources was called', () => {
|
|
it('should return sources array which are of type WINDOW only', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
desktopCapturerService.sources.set(
|
|
testScreenSource1Name,
|
|
testScreenSource1
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testScreenSource2Name,
|
|
testScreenSource2
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testWindowSource1Name,
|
|
testWindowSource1
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testWindowSource2Name,
|
|
testWindowSource2
|
|
);
|
|
|
|
const res = desktopCapturerService.getAppWindowSources();
|
|
|
|
expect(res).toEqual([
|
|
testWindowSource1.source,
|
|
testWindowSource2.source,
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('when .getSourceDisplayIDBySourceID was called', () => {
|
|
it('should return proper source display_id string', () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
desktopCapturerService.sources.set(
|
|
testScreenSource1Name,
|
|
testScreenSource1
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testScreenSource2Name,
|
|
testScreenSource2
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testWindowSource1Name,
|
|
testWindowSource1
|
|
);
|
|
desktopCapturerService.sources.set(
|
|
testWindowSource2Name,
|
|
testWindowSource2
|
|
);
|
|
|
|
const res = desktopCapturerService.getSourceDisplayIDByDisplayCapturerSourceID(
|
|
testScreenSource1.source.id
|
|
);
|
|
|
|
expect(res).toEqual(testScreenSource1.source.display_id);
|
|
});
|
|
});
|
|
|
|
describe('when .getDesktopCapturerSources was called', () => {
|
|
it('should resolve with proper map of screen sources', async () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
const testSourcesMap = new Map<string, DesktopCapturerSourceWithType>();
|
|
testSourcesMap.set(testScreenSource1.source.id, testScreenSource1);
|
|
testSourcesMap.set(testScreenSource2.source.id, testScreenSource2);
|
|
testSourcesMap.set(testWindowSource1.source.id, testWindowSource1);
|
|
testSourcesMap.set(testWindowSource2.source.id, testWindowSource2);
|
|
|
|
const res = await desktopCapturerService.getDesktopCapturerSources();
|
|
|
|
expect(res).toEqual(testSourcesMap);
|
|
});
|
|
});
|
|
|
|
describe('when .refreshDesktopCapturerSources was called', () => {
|
|
it('should call proper methods to check whether windows are closed and screens disconnected', async () => {
|
|
const DesktopCapturerSourcesClass = jest.requireActual('.')
|
|
.default as DesktopCapturerSources;
|
|
// @ts-ignore
|
|
desktopCapturerService = new DesktopCapturerSourcesClass();
|
|
desktopCapturerService.checkForClosedWindows = jest.fn();
|
|
desktopCapturerService.checkForScreensDisconnected = jest.fn();
|
|
desktopCapturerService.constructor();
|
|
|
|
await desktopCapturerService.refreshDesktopCapturerSources();
|
|
|
|
expect(desktopCapturerService.checkForClosedWindows).toBeCalled();
|
|
expect(desktopCapturerService.checkForScreensDisconnected).toBeCalled();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('getSourceTypeFromSourceID tests', () => {
|
|
it('should return proper source type depending on input type', () => {
|
|
const testWindowSource = 'window:1234';
|
|
const testScreenSource = 'screen:4321';
|
|
|
|
expect(getSourceTypeFromSourceID(testWindowSource)).toBe(
|
|
DesktopCapturerSourceType.WINDOW
|
|
);
|
|
expect(getSourceTypeFromSourceID(testScreenSource)).toBe(
|
|
DesktopCapturerSourceType.SCREEN
|
|
);
|
|
});
|
|
});
|