@knapsack-pro/jest
Version:
Knapsack Pro Jest splits Jest tests across CI nodes and makes sure that tests will run in optimal time on each CI node.
48 lines (47 loc) • 2.06 kB
JavaScript
import { KnapsackProCore, KnapsackProLogger, } from '@knapsack-pro/core';
import { v4 as uuidv4 } from 'uuid';
import { EnvConfig } from './env-config.js';
import { TestFilesFinder } from './test-files-finder.js';
import { JestCLI } from './jest-cli.js';
const jestImport = await import('jest');
const jest = jestImport.default ?? jestImport;
const clientName = '@knapsack-pro/jest';
const clientVersion = '9.0.0-rc.1';
const jestCLIOptions = JestCLI.argvToOptions();
const knapsackProLogger = new KnapsackProLogger();
knapsackProLogger.debug(`Jest CLI options:\n${KnapsackProLogger.objectInspect(jestCLIOptions)}`);
EnvConfig.loadEnvironmentVariables();
const projectPath = process.cwd();
const testFilesToExecute = () => TestFilesFinder.allTestFiles();
const knapsackPro = new KnapsackProCore(clientName, clientVersion, testFilesToExecute);
const onSuccess = async (queueTestFiles) => {
const testFilePaths = queueTestFiles.map((testFile) => testFile.path);
const jestCLICoverage = EnvConfig.coverageDirectory
? { coverageDirectory: `${EnvConfig.coverageDirectory}/${uuidv4()}` }
: {};
const { results: { success: isTestSuiteGreen, testResults }, } = await jest.runCLI({
...jestCLIOptions,
...jestCLICoverage,
runTestsByPath: true,
_: testFilePaths,
$0: 'jest',
}, [projectPath]);
const recordedTestFiles = testResults.map(({ testFilePath, perfStats: { start, end }, }) => {
const path = process.platform === 'win32'
? testFilePath.replace(`${projectPath}\\`, '').replace(/\\/g, '/')
: testFilePath.replace(`${projectPath}/`, '');
const timeExecutionMiliseconds = end - start;
const timeExecution = timeExecutionMiliseconds > 0 ? timeExecutionMiliseconds / 1000 : 0.0;
return {
path,
time_execution: timeExecution,
};
});
return {
recordedTestFiles,
isTestSuiteGreen,
};
};
const onError = () => { };
knapsackPro.runQueueMode(onSuccess, onError);