1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-25 03:20:23 +01:00
metamask-extension/test/e2e/run-e2e-test.js
Mark Stacey 6c50587878
Add flag to update E2E snapshots (#20514)
The E2E test scripts now have a flag for updating E2E test snapshots.
The flag has been documented as well. This makes it easier to update
snapshots and raises visbility of this feature.
2023-08-17 13:32:45 -02:30

143 lines
3.8 KiB
JavaScript

const { promises: fs } = require('fs');
const path = require('path');
const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers');
const { runInShell } = require('../../development/lib/run-command');
const { exitWithError } = require('../../development/lib/exit-with-error');
const { retry } = require('../../development/lib/retry');
async function main() {
const { argv } = yargs(hideBin(process.argv))
.usage(
'$0 [options] <e2e-test-path>',
'Run a single E2E test, with a variable number of retries.',
(_yargs) =>
_yargs
.option('browser', {
default: process.env.SELENIUM_BROWSER,
description: `Set the browser used; either 'chrome' or 'firefox'.`,
type: 'string',
choices: ['chrome', 'firefox'],
})
.option('debug', {
default: process.env.E2E_DEBUG === 'true',
description:
'Run tests in debug mode, logging each driver interaction',
type: 'boolean',
})
.option('retries', {
default: 0,
description:
'Set how many times the test should be retried upon failure.',
type: 'number',
})
.option('retry-until-failure', {
default: false,
description: 'Retries until the test fails',
type: 'boolean',
})
.option('leave-running', {
default: false,
description:
'Leaves the browser running after a test fails, along with anything else that the test used (ganache, the test dapp, etc.)',
type: 'boolean',
})
.option('update-snapshot', {
alias: 'u',
default: false,
description: 'Update E2E snapshots',
type: 'boolean',
})
.positional('e2e-test-path', {
describe: 'The path for the E2E test to run.',
type: 'string',
normalize: true,
}),
)
.strict()
.help('help');
const {
browser,
debug,
e2eTestPath,
retries,
retryUntilFailure,
leaveRunning,
updateSnapshot,
} = argv;
if (!browser) {
exitWithError(
`"The browser must be set, via the '--browser' flag or the SELENIUM_BROWSER environment variable`,
);
return;
} else if (browser !== process.env.SELENIUM_BROWSER) {
process.env.SELENIUM_BROWSER = browser;
}
try {
const stat = await fs.stat(e2eTestPath);
if (!stat.isFile()) {
exitWithError('Test path must be a file');
return;
}
} catch (error) {
if (error.code === 'ENOENT') {
exitWithError('Test path specified does not exist');
return;
} else if (error.code === 'EACCES') {
exitWithError(
'Access to test path is forbidden by file access permissions',
);
return;
}
throw error;
}
const testFileName = path.basename(e2eTestPath);
if (debug) {
process.env.E2E_DEBUG = 'true';
}
let testTimeoutInMilliseconds = 80 * 1000;
let exit = '--exit';
if (leaveRunning) {
process.env.E2E_LEAVE_RUNNING = 'true';
testTimeoutInMilliseconds = 0;
exit = '--no-exit';
}
if (updateSnapshot) {
process.env.UPDATE_SNAPSHOTS = 'true';
}
const configFile = path.join(__dirname, '.mocharc.js');
const extraArgs = process.env.E2E_ARGS?.split(' ') || [];
const dir = 'test/test-results/e2e';
fs.mkdir(dir, { recursive: true });
await retry({ retries, retryUntilFailure }, async () => {
await runInShell(
'yarn',
[
'mocha',
`--config=${configFile}`,
`--timeout=${testTimeoutInMilliseconds}`,
'--reporter=xunit',
...extraArgs,
e2eTestPath,
exit,
],
`${dir}/${testFileName}.xml`,
);
});
}
main().catch((error) => {
exitWithError(error);
});