1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-01 13:47:06 +01:00
metamask-extension/test/jest/setup.js

133 lines
3.7 KiB
JavaScript
Raw Normal View History

// This file is for Jest-specific setup only and runs before our Jest tests.
import nock from 'nock';
Increase Jest unit test coverage for the Swaps feature to ~25% (#10900) * Swaps: Show a network name dynamically in a tooltip * Replace “Ethereum” with “$1”, change “Test” to “Testnet” * Replace 이더리움 with $1 * Translate network names, use ‘Ethereum’ by default if a translation is not available yet * Reorder messages to resolve ESLint issues * Add a snapshot test for the FeeCard component, increase Jest threshold * Enable snapshot testing into external .snap files in ESLint * Add the “networkNameEthereum” key in ko/messages.json, remove default “Ethereum” value * Throw an error if chain ID is not supported by the Swaps feature * Use string literals when calling the `t` fn, * Watch Jest tests silently (no React warnings in terminal, only errors) * Add @testing-library/jest-dom, import it before running Jest tests * Add snapshot testing of Swaps’ React components for happy paths, increase minimum threshold for Jest * Add the test/jest folder for Jest setup and shared functions, use it in Swaps Jest tests * Fix ESLint issues, update linting config * Enable ESLint for .snap files (Jest snapshots), throw an error if a snapshot is bigger than 50 lines * Don’t run lint:fix for .snap files * Move `createProps` outside of `describe` blocks, move store creation inside tests * Use translations instead of keys, update a rendering function to load translations * Make sure all Jest snapshots are shorter than 50 lines (default limit) * Add / update props for Swaps tests * Fix React warnings when running tests for Swaps
2021-04-21 21:34:35 +02:00
import '@testing-library/jest-dom';
2022-08-23 19:57:55 +02:00
jest.mock('webextension-polyfill', () => {
return {
runtime: {
getManifest: () => ({ manifest_version: 2 }),
},
};
});
const UNRESOLVED = Symbol('timedOut');
// Store this in case it gets stubbed later
const originalSetTimeout = global.setTimeout;
const TIME_TO_WAIT_UNTIL_UNRESOLVED = 100;
/**
* Produces a sort of dummy promise which can be used in conjunction with a
* "real" promise to determine whether the "real" promise was ever resolved. If
* the promise that is produced by this function resolves first, then the other
* one must be unresolved.
*
* @param {number} duration - How long to wait before resolving the promise returned by
* this function.
* @returns A promise that resolves to a symbol.
*/
function treatUnresolvedAfter(duration) {
return new Promise((resolve) => {
originalSetTimeout(resolve, duration, UNRESOLVED);
});
}
/* eslint-disable-next-line jest/require-top-level-describe */
beforeEach(() => {
nock.cleanAll();
});
expect.extend({
/**
* Tests that the given promise is fulfilled within a certain amount of time
* (which is the default time that Jest tests wait before timing out as
* configured in the Jest configuration file).
*
* Inspired by <https://stackoverflow.com/a/68409467/260771>.
*
* @param {Promise<any>} promise - The promise to test.
* @returns The result of the matcher.
*/
async toBeFulfilled(promise) {
if (this.isNot) {
throw new Error(
"Using `.not.toBeFulfilled(...)` is not supported. Use `.rejects` to test the promise's rejection value instead.",
);
}
let rejectionValue = UNRESOLVED;
try {
await promise;
} catch (e) {
rejectionValue = e;
}
if (rejectionValue !== UNRESOLVED) {
return {
message: () =>
`Expected promise to be fulfilled, but it was rejected with ${rejectionValue}.`,
pass: false,
};
}
return {
message: () =>
'This message should not be displayed as it is for the negative case, which will never happen.',
pass: true,
};
},
/**
* Tests that the given promise is never fulfilled or rejected past a certain
* amount of time (which is the default time that Jest tests wait before
* timing out as configured in the Jest configuration file).
*
* Inspired by <https://stackoverflow.com/a/68409467/260771>.
*
* @param {Promise<any>} promise - The promise to test.
* @returns The result of the matcher.
*/
async toNeverResolve(promise) {
if (this.isNot) {
throw new Error(
'Using `.not.toNeverResolve(...)` is not supported. ' +
'You probably want to either `await` the promise and test its ' +
'resolution value or use `.rejects` to test its rejection value instead.',
);
}
let resolutionValue;
let rejectionValue;
try {
resolutionValue = await Promise.race([
promise,
treatUnresolvedAfter(TIME_TO_WAIT_UNTIL_UNRESOLVED),
]);
} catch (e) {
rejectionValue = e;
}
return resolutionValue === UNRESOLVED
? {
message: () =>
`Expected promise to resolve after ${TIME_TO_WAIT_UNTIL_UNRESOLVED}ms, but it did not`,
pass: true,
}
: {
message: () => {
return `Expected promise to never resolve after ${TIME_TO_WAIT_UNTIL_UNRESOLVED}ms, but it ${
rejectionValue
? `was rejected with ${rejectionValue}`
: `resolved with ${resolutionValue}`
}`;
},
pass: false,
};
},
});
// Setup window.prompt
global.prompt = () => undefined;