From 4c6d44907802e1c1cdbd1e30906479a5c053b810 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Thu, 22 Oct 2020 16:16:09 -0700 Subject: [PATCH] test: add additional npm specs --- src/renderer/npm.ts | 4 +-- tests/mocks/worker.ts | 20 +++++++++++++ tests/renderer/npm-spec.ts | 59 ++++++++++++++++++++++++++++++++------ 3 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 tests/mocks/worker.ts diff --git a/src/renderer/npm.ts b/src/renderer/npm.ts index e8459d8e5f..837e676df2 100644 --- a/src/renderer/npm.ts +++ b/src/renderer/npm.ts @@ -161,13 +161,13 @@ export function packageRun( return exec(dir, `${packageManager} run ${command}`); } -function decommentWithWorker(input: string): Promise { +export function decommentWithWorker(input: string): Promise { return new Promise((resolve, reject) => { const worker = new Worker('../utils/decomment.ts'); - worker.postMessage(input); worker.onmessage = function (event: MessageEvent) { resolve(event.data); }; + worker.postMessage(input); worker.onerror = function (e) { reject(e); }; diff --git a/tests/mocks/worker.ts b/tests/mocks/worker.ts new file mode 100644 index 0000000000..9305a7420f --- /dev/null +++ b/tests/mocks/worker.ts @@ -0,0 +1,20 @@ +import * as decomment from 'decomment'; + +export default class MockWorker { + public onmessage: (msg: any) => any; + public onmessageerror: () => any; + public onerror: () => any; + public addEventListener: () => any; + public removeEventListener: () => any; + public dispatchEvent: () => any; + public terminate: () => any; + constructor() { + this.onmessage = () => { + /*no-op*/ + }; + } + + public postMessage(input: string) { + this.onmessage({ data: decomment(input) }); + } +} diff --git a/tests/renderer/npm-spec.ts b/tests/renderer/npm-spec.ts index 6fe019c3a9..5180478f43 100644 --- a/tests/renderer/npm-spec.ts +++ b/tests/renderer/npm-spec.ts @@ -1,4 +1,8 @@ +import { mocked } from 'ts-jest/utils'; +import * as decomment from 'decomment'; + import { + findModules, findModulesInEditors, getIsPackageManagerInstalled, installModules, @@ -6,7 +10,8 @@ import { } from '../../src/renderer/npm'; import { exec } from '../../src/utils/exec'; import { overridePlatform, resetPlatform } from '../utils'; - +import MockDecommentWorker from '../mocks/worker'; +jest.mock('decomment'); jest.mock('../../src/utils/exec'); jest.mock('../../src/utils/import', () => ({ fancyImport: async (_p: string) => { @@ -14,10 +19,10 @@ jest.mock('../../src/utils/import', () => ({ }, })); -describe('npm', () => { - const mockMain = ` - const say = require('say'); +window.Worker = MockDecommentWorker; +describe('npm', () => { + const mockBuiltins = ` function hello() { const electron = require('electron'); const originalFs = require('original-fs'); @@ -26,6 +31,20 @@ describe('npm', () => { } `; + const mockPackages = ` + const cow = require('cow'); + const say = require('say'); + `; + + const mockComments = ` + // const cow = require('cow'); + /* const say = require('say'); */ + /** + * const hello = require('hello'); + * const world = require('world'); + */ + `; + describe('getIsPackageManagerInstalled()', () => { describe('npm()', () => { beforeEach(() => { @@ -150,17 +169,39 @@ describe('npm', () => { }); }); + describe('findModules()', () => { + it('returns required modules in a JS file', async () => { + mocked(decomment).mockReturnValue(mockPackages); + const modules = await findModules(mockPackages); + expect(modules).toEqual(['cow', 'say']); + }); + + it('ignores node and electron builtins', async () => { + mocked(decomment).mockReturnValue(mockBuiltins); + const modules = await findModules(mockBuiltins); + expect(modules).toHaveLength(0); + }); + + it('ignores commented modules', async () => { + mocked(decomment).mockReturnValue(''); + const modules = await findModules(mockComments); + expect(modules).toHaveLength(0); + }); + }); + describe('findModulesInEditors()', () => { - it('finds modules, ignoring node and electron builtins', async () => { + it('installs modules across all JavaScript files only once', async () => { + mocked(decomment).mockReturnValue(mockPackages); const result = await findModulesInEditors({ html: '', - main: mockMain, - renderer: '', - preload: '', + main: mockPackages, + renderer: mockPackages, + preload: mockPackages, css: '', }); - expect(result).toEqual(['say']); + expect(result).toHaveLength(2); + expect(result).toEqual(['cow', 'say']); }); });