Skip to content

Commit

Permalink
add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
erickzhao committed Jan 23, 2025
1 parent 7fb741f commit 9ff3634
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 13 deletions.
4 changes: 3 additions & 1 deletion packages/api/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@
"@electron-forge/maker-squirrel": "7.6.0",
"@electron-forge/maker-wix": "7.6.0",
"@electron-forge/maker-zip": "7.6.0",
"@electron-forge/template-fixture": "file:./spec/fixture/electron-forge-template-fixture",
"@electron-forge/test-utils": "7.6.0",
"@types/interpret": "^1.1.1",
"@types/progress": "^2.0.5",
"@types/rechoir": "^0.6.1",
"cross-env": "^7.0.2",
"electron-forge-template-fixture-two": "file:./spec/fixture/electron-forge-template-fixture",
"electron-installer-common": "^0.10.2",
"vitest": "^2.1.6",
"yaml-hook": "^1.0.0"
Expand Down Expand Up @@ -49,8 +51,8 @@
"filenamify": "^4.1.0",
"find-up": "^5.0.0",
"fs-extra": "^10.0.0",
"got": "^11.8.5",
"global-directory": "^4.0.1",
"got": "^11.8.5",
"interpret": "^3.1.1",
"listr2": "^7.0.2",
"lodash": "^4.17.20",
Expand Down
57 changes: 57 additions & 0 deletions packages/api/core/spec/fast/find-template.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import path from 'node:path';

import { describe, expect, it, vi } from 'vitest';

import { findTemplate } from '../../src/api/init-scripts/find-template';

describe('findTemplate', () => {
/**
* Note: this test suite does not mock `require.resolve`. Instead, it uses
* fixture dependencies defined in this module's package.json file to
* actually resolve a local template.
*
* If you modify the fixtures, you may need to re-run `yarn install` in order
* for the fixtures to be installed in your local `node_modules`.
*/
describe('local modules', () => {
it('should find an @electron-forge/template based on name', async () => {
await expect(findTemplate('fixture')).resolves.toEqual({ name: 'electron-forge-template-fixture' });
});
it('should find an @electron-forge/template based on name', async () => {
await expect(findTemplate('fixture-two')).resolves.toEqual({ name: 'electron-forge-template-fixture' });
});
it('should find an @electron-forge/template based on name', async () => {
await expect(findTemplate('electron-forge-template-fixture-two')).resolves.toEqual({ name: 'electron-forge-template-fixture' });
});
});

/**
* For global modules, we re-route the global NPM `node_modules` directory to
* a folder in our fixture directory. Note that the folder _needs_ to be called
* `node_modules` in order for the `require.resolve` custom path to work.
*/
describe('global modules', () => {
vi.mock(import('global-directory'), async (importOriginal) => {
const mod = await importOriginal();
return {
default: {
...mod.default,
npm: {
...mod.default.npm,
packages: path.resolve(__dirname, '..', 'fixture', 'global-stub', 'node_modules'),
},
},
};
});
it('should find an @electron-forge/template based on name', async () => {
await expect(findTemplate('global')).resolves.toEqual({ name: 'electron-forge-template-fixture-global' });
});
it('should find an electron-forge-template based on name', async () => {
await expect(findTemplate('global-two')).resolves.toEqual({ name: 'electron-forge-template-fixture-global' });
});
});

it('should error if there are no valid templates', async () => {
await expect(findTemplate('non-existent-template')).rejects.toThrowError('Failed to locate custom template: "non-existent-template".');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = { name: 'electron-forge-template-fixture' };
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"main": "index.js",
"type": "commonjs",
"version": "13.3.7"
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 17 additions & 12 deletions packages/api/core/src/api/init-scripts/find-template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,31 @@ import { PossibleModule } from '../../util/import-search';

const d = debug('electron-forge:init:find-template');

enum TemplateType {
global = 'global',
local = 'local',
}

export const findTemplate = async (template: string): Promise<ForgeTemplate> => {
let templateModulePath!: string;
const resolveTemplateTypes = [
['global', `electron-forge-template-${template}`],
['global', `@electron-forge/template-${template}`],
['local', `electron-forge-template-${template}`],
['local', `@electron-forge/template-${template}`],
['local', template],
[TemplateType.global, `electron-forge-template-${template}`],
[TemplateType.global, `@electron-forge/template-${template}`],
[TemplateType.local, `electron-forge-template-${template}`],
[TemplateType.local, `@electron-forge/template-${template}`],
[TemplateType.global, template],
[TemplateType.local, template],
];
let foundTemplate = false;
// eslint-disable-next-line
const { default: globalDirectory } = await import('global-directory');
for (const [templateType, moduleName] of resolveTemplateTypes) {
try {
d(`Trying ${templateType} template: ${moduleName}`);
if (templateType === 'global') {
templateModulePath = require.resolve(moduleName, { paths: [globalDirectory.npm.packages, globalDirectory.yarn.packages] });
if (templateType === TemplateType.global) {
templateModulePath = require.resolve(moduleName, {
paths: [globalDirectory.npm.packages, globalDirectory.yarn.packages],
});
} else {
// local
templateModulePath = require.resolve(moduleName);
}
foundTemplate = true;
Expand All @@ -38,8 +44,7 @@ export const findTemplate = async (template: string): Promise<ForgeTemplate> =>

d(`found template module at: ${templateModulePath}`);

// eslint-disable-next-line @typescript-eslint/no-require-imports
const templateModule: PossibleModule<ForgeTemplate> = require(templateModulePath);
const templateModule: PossibleModule<ForgeTemplate> = await import(templateModulePath);

return templateModule.default || templateModule;
return templateModule.default ?? templateModule;
};
6 changes: 6 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -855,6 +855,9 @@
dependencies:
fast-check "^3.12.0"

"@electron-forge/template-fixture@file:./packages/api/core/spec/fixture/electron-forge-template-fixture":
version "13.3.7"

"@electron/asar@^3.0.3", "@electron/asar@^3.2.1", "@electron/asar@^3.2.7":
version "3.2.10"
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.10.tgz#615cf346b734b23cafa4e0603551010bd0e50aa8"
Expand Down Expand Up @@ -5536,6 +5539,9 @@ ejs@^3.1.7:
dependencies:
jake "^10.8.5"

"electron-forge-template-fixture-two@file:./packages/api/core/spec/fixture/electron-forge-template-fixture":
version "13.3.7"

electron-installer-common@^0.10.0, electron-installer-common@^0.10.2:
version "0.10.3"
resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444"
Expand Down

0 comments on commit 9ff3634

Please sign in to comment.