aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2022-05-03 19:47:39 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2022-05-16 00:55:02 +0200
commitd2aa484b600dc0d122bb994b9bb29504ffe4cf12 (patch)
tree1d3e38fdb22f7afe02f1ebcf4b07734761970985 /config
parentrefactor: config file saving and debugging (diff)
downloadsophie-d2aa484b600dc0d122bb994b9bb29504ffe4cf12.tar.gz
sophie-d2aa484b600dc0d122bb994b9bb29504ffe4cf12.tar.zst
sophie-d2aa484b600dc0d122bb994b9bb29504ffe4cf12.zip
build: integration testing support
Run integration tests in an electron environment for the main process. Signed-off-by: Kristóf Marussy <kristof@marussy.com>
Diffstat (limited to 'config')
-rw-r--r--config/electronJestEnvironment.cjs10
-rw-r--r--config/electronJestGlobalSetup.cjs3
-rw-r--r--config/electronJestGlobalTeardown.cjs8
-rw-r--r--config/electronJestSetup.cjs13
-rw-r--r--config/jest.config.base.cjs27
-rw-r--r--config/jest.config.base.js1
-rw-r--r--config/jestEsbuildCjsTransformer.cjs57
-rw-r--r--config/jestEsbuildTransformer.js12
8 files changed, 130 insertions, 1 deletions
diff --git a/config/electronJestEnvironment.cjs b/config/electronJestEnvironment.cjs
new file mode 100644
index 0000000..385761e
--- /dev/null
+++ b/config/electronJestEnvironment.cjs
@@ -0,0 +1,10 @@
1const electron = require('electron');
2const { TestEnvironment } = require('jest-environment-node');
3
4module.exports = class ElectronEnvironment extends TestEnvironment {
5 /** @override */
6 async setup() {
7 await super.setup();
8 this.global.ELECTRON_MODULE = electron;
9 }
10};
diff --git a/config/electronJestGlobalSetup.cjs b/config/electronJestGlobalSetup.cjs
new file mode 100644
index 0000000..c57df68
--- /dev/null
+++ b/config/electronJestGlobalSetup.cjs
@@ -0,0 +1,3 @@
1const { app } = require('electron');
2
3module.exports = () => app.whenReady();
diff --git a/config/electronJestGlobalTeardown.cjs b/config/electronJestGlobalTeardown.cjs
new file mode 100644
index 0000000..f790a4f
--- /dev/null
+++ b/config/electronJestGlobalTeardown.cjs
@@ -0,0 +1,8 @@
1const { app } = require('electron');
2
3/** @type {(globalConfig: import('@jest/types').Config.InitialOptions) => void} */
4module.exports = (globalConfig) => {
5 if (!globalConfig.watch && !globalConfig.watchAll) {
6 app.quit();
7 }
8};
diff --git a/config/electronJestSetup.cjs b/config/electronJestSetup.cjs
new file mode 100644
index 0000000..c53a3f8
--- /dev/null
+++ b/config/electronJestSetup.cjs
@@ -0,0 +1,13 @@
1const electron = /** @type {{ ELECTRON_MODULE: import('electron')}} */ (
2 /** @type {unknown} */ (globalThis)
3).ELECTRON_MODULE;
4
5const { BrowserWindow } = electron;
6
7jest.mock('electron', () => electron);
8
9afterEach(() => {
10 BrowserWindow.getAllWindows().forEach((window) => {
11 window.destroy();
12 });
13});
diff --git a/config/jest.config.base.cjs b/config/jest.config.base.cjs
new file mode 100644
index 0000000..ee85d66
--- /dev/null
+++ b/config/jest.config.base.cjs
@@ -0,0 +1,27 @@
1const path = require('node:path');
2
3/** @type {import('@jest/types').Config.InitialOptions} */
4module.exports = {
5 transform: {
6 '\\.[jt]sx?$': path.join(__dirname, 'jestEsbuildCjsTransformer.cjs'),
7 },
8 testRegex: '(\\.|/)integ\\.spec\\.ts$',
9 transformIgnorePatterns: ['/node_modules/(?!(chalk|lodash-es)/)'],
10 moduleNameMapper: {
11 '^@sophie/(.+)$': path.join(__dirname, '../packages/$1/src/index.ts'),
12 '^(\\.{1,2}/.*)\\.jsx?$': '$1',
13 // Workaround for jest to recognize the vendored dependencies of chalk.
14 '^#ansi-styles$': path.join(
15 __dirname,
16 '../node_modules/chalk/source/vendor/ansi-styles/index.js',
17 ),
18 '^#supports-color$': path.join(
19 __dirname,
20 '../node_modules/chalk/source/vendor/supports-color/index.js',
21 ),
22 },
23 resetMocks: true,
24 restoreMocks: true,
25 testEnvironment: 'node',
26 testPathIgnorePatterns: ['/dist/', '/node_modules/'],
27};
diff --git a/config/jest.config.base.js b/config/jest.config.base.js
index d9865f9..32d2ecb 100644
--- a/config/jest.config.base.js
+++ b/config/jest.config.base.js
@@ -9,6 +9,7 @@ export default {
9 transform: { 9 transform: {
10 '\\.tsx?$': path.join(thisDir, 'jestEsbuildTransformer.js'), 10 '\\.tsx?$': path.join(thisDir, 'jestEsbuildTransformer.js'),
11 }, 11 },
12 testRegex: '((?<!integ)\\.|/)spec\\.tsx?$',
12 extensionsToTreatAsEsm: ['.ts', '.tsx'], 13 extensionsToTreatAsEsm: ['.ts', '.tsx'],
13 moduleNameMapper: { 14 moduleNameMapper: {
14 '^@sophie/(.+)$': path.join(thisDir, '../packages/$1/src/index.ts'), 15 '^@sophie/(.+)$': path.join(thisDir, '../packages/$1/src/index.ts'),
diff --git a/config/jestEsbuildCjsTransformer.cjs b/config/jestEsbuildCjsTransformer.cjs
new file mode 100644
index 0000000..419d7b2
--- /dev/null
+++ b/config/jestEsbuildCjsTransformer.cjs
@@ -0,0 +1,57 @@
1const { readFileSync } = require('node:fs');
2const path = require('node:path');
3
4const { transformSync } = require('esbuild');
5
6const electronVendorsJson = readFileSync(
7 path.join(__dirname, '../.electron-vendors.cache.json'),
8 'utf8',
9);
10
11/** @type {{ node: number; }} */
12// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
13const { node: nodeVersion } = JSON.parse(electronVendorsJson);
14
15/**
16 * @param {string} source
17 * @param {string} filePath
18 * @return {import('@jest/transform').TransformedSource}
19 */
20function process(source, filePath) {
21 /** @type {import('esbuild').Loader} */
22 let loader;
23 if (filePath.endsWith('tsx')) {
24 loader = 'tsx';
25 } else if (filePath.endsWith('ts')) {
26 loader = 'ts';
27 } else {
28 loader = 'js';
29 }
30 const { code, map } = transformSync(source, {
31 loader,
32 sourcefile: filePath,
33 format: 'cjs',
34 target: `node${nodeVersion}`,
35 sourcemap: true,
36 define: {
37 __DEV__: JSON.stringify(false), // For mobx
38 'process.env.NODE_ENV': 'test',
39 'process.env.MODE': 'test',
40 'import.meta.env': JSON.stringify({
41 DEV: false,
42 MODE: 'test',
43 PROD: true,
44 }),
45 },
46 });
47 return {
48 code,
49 map,
50 };
51}
52
53/** @type {import('@jest/transform').Transformer<void>} */
54module.exports = {
55 canInstrument: false,
56 process,
57};
diff --git a/config/jestEsbuildTransformer.js b/config/jestEsbuildTransformer.js
index b6f2fc3..6a4760f 100644
--- a/config/jestEsbuildTransformer.js
+++ b/config/jestEsbuildTransformer.js
@@ -4,7 +4,7 @@ import { node } from './buildConstants.js';
4 4
5/** 5/**
6 * @param {string} source 6 * @param {string} source
7 * @param {import('@jest/types').Config.Path} filePath 7 * @param {string} filePath
8 * @return {Promise<import('@jest/transform').TransformedSource>} 8 * @return {Promise<import('@jest/transform').TransformedSource>}
9 */ 9 */
10async function processAsync(source, filePath) { 10async function processAsync(source, filePath) {
@@ -14,6 +14,16 @@ async function processAsync(source, filePath) {
14 format: 'esm', 14 format: 'esm',
15 target: node, 15 target: node,
16 sourcemap: true, 16 sourcemap: true,
17 define: {
18 __DEV__: JSON.stringify(false), // For mobx
19 'process.env.NODE_ENV': 'test',
20 'process.env.MODE': 'test',
21 'import.meta.env': JSON.stringify({
22 DEV: false,
23 MODE: 'test',
24 PROD: true,
25 }),
26 },
17 }); 27 });
18 return { 28 return {
19 code, 29 code,