diff options
author | Kristóf Marussy <kristof@marussy.com> | 2022-05-03 19:47:39 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2022-05-16 00:55:02 +0200 |
commit | d2aa484b600dc0d122bb994b9bb29504ffe4cf12 (patch) | |
tree | 1d3e38fdb22f7afe02f1ebcf4b07734761970985 /config | |
parent | refactor: config file saving and debugging (diff) | |
download | sophie-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.cjs | 10 | ||||
-rw-r--r-- | config/electronJestGlobalSetup.cjs | 3 | ||||
-rw-r--r-- | config/electronJestGlobalTeardown.cjs | 8 | ||||
-rw-r--r-- | config/electronJestSetup.cjs | 13 | ||||
-rw-r--r-- | config/jest.config.base.cjs | 27 | ||||
-rw-r--r-- | config/jest.config.base.js | 1 | ||||
-rw-r--r-- | config/jestEsbuildCjsTransformer.cjs | 57 | ||||
-rw-r--r-- | config/jestEsbuildTransformer.js | 12 |
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 @@ | |||
1 | const electron = require('electron'); | ||
2 | const { TestEnvironment } = require('jest-environment-node'); | ||
3 | |||
4 | module.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 @@ | |||
1 | const { app } = require('electron'); | ||
2 | |||
3 | module.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 @@ | |||
1 | const { app } = require('electron'); | ||
2 | |||
3 | /** @type {(globalConfig: import('@jest/types').Config.InitialOptions) => void} */ | ||
4 | module.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 @@ | |||
1 | const electron = /** @type {{ ELECTRON_MODULE: import('electron')}} */ ( | ||
2 | /** @type {unknown} */ (globalThis) | ||
3 | ).ELECTRON_MODULE; | ||
4 | |||
5 | const { BrowserWindow } = electron; | ||
6 | |||
7 | jest.mock('electron', () => electron); | ||
8 | |||
9 | afterEach(() => { | ||
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 @@ | |||
1 | const path = require('node:path'); | ||
2 | |||
3 | /** @type {import('@jest/types').Config.InitialOptions} */ | ||
4 | module.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 @@ | |||
1 | const { readFileSync } = require('node:fs'); | ||
2 | const path = require('node:path'); | ||
3 | |||
4 | const { transformSync } = require('esbuild'); | ||
5 | |||
6 | const 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 | ||
13 | const { node: nodeVersion } = JSON.parse(electronVendorsJson); | ||
14 | |||
15 | /** | ||
16 | * @param {string} source | ||
17 | * @param {string} filePath | ||
18 | * @return {import('@jest/transform').TransformedSource} | ||
19 | */ | ||
20 | function 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>} */ | ||
54 | module.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 | */ |
10 | async function processAsync(source, filePath) { | 10 | async 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, |