2021-04-23 16:53:10 +02:00
|
|
|
// This file is for Jest-specific setup only and runs before our Jest tests.
|
2022-09-29 18:39:35 +02:00
|
|
|
|
|
|
|
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 }),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
});
|
2022-09-29 18:39:35 +02:00
|
|
|
|
Expand network controller unit test coverage (#17498)
The network controller has some tests, but they are incomplete and don't
follow our latest best practices for writing unit tests.
This commit greatly increases the amount of test coverage for the API
that we want to retain in NetworkController, in particular the seemingly
myriad paths that the code takes starting from `initializeProvider`,
`resetConnection`, `setRpcTarget`, `setProviderType`,
`rollbackToPreviousProvider`, and `lookupNetwork`.
There were a couple of pieces of logic I noted which don't seem to have
any effect due to being redundant or unreachable, but they also don't
make our lives more difficult, either, so I opted to leave them in.
Co-authored-by: Mark Stacey <markjstacey@gmail.com>
Co-authored-by: Zachary Belford <belfordz66@gmail.com>
2023-02-08 21:10:04 +01:00
|
|
|
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);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-09-29 18:39:35 +02:00
|
|
|
/* eslint-disable-next-line jest/require-top-level-describe */
|
|
|
|
beforeEach(() => {
|
|
|
|
nock.cleanAll();
|
|
|
|
});
|
Expand network controller unit test coverage (#17498)
The network controller has some tests, but they are incomplete and don't
follow our latest best practices for writing unit tests.
This commit greatly increases the amount of test coverage for the API
that we want to retain in NetworkController, in particular the seemingly
myriad paths that the code takes starting from `initializeProvider`,
`resetConnection`, `setRpcTarget`, `setProviderType`,
`rollbackToPreviousProvider`, and `lookupNetwork`.
There were a couple of pieces of logic I noted which don't seem to have
any effect due to being redundant or unreachable, but they also don't
make our lives more difficult, either, so I opted to leave them in.
Co-authored-by: Mark Stacey <markjstacey@gmail.com>
Co-authored-by: Zachary Belford <belfordz66@gmail.com>
2023-02-08 21:10:04 +01:00
|
|
|
|
|
|
|
expect.extend({
|
2023-06-14 17:23:16 +02:00
|
|
|
/**
|
|
|
|
* 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,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
|
Expand network controller unit test coverage (#17498)
The network controller has some tests, but they are incomplete and don't
follow our latest best practices for writing unit tests.
This commit greatly increases the amount of test coverage for the API
that we want to retain in NetworkController, in particular the seemingly
myriad paths that the code takes starting from `initializeProvider`,
`resetConnection`, `setRpcTarget`, `setProviderType`,
`rollbackToPreviousProvider`, and `lookupNetwork`.
There were a couple of pieces of logic I noted which don't seem to have
any effect due to being redundant or unreachable, but they also don't
make our lives more difficult, either, so I opted to leave them in.
Co-authored-by: Mark Stacey <markjstacey@gmail.com>
Co-authored-by: Zachary Belford <belfordz66@gmail.com>
2023-02-08 21:10:04 +01:00
|
|
|
/**
|
|
|
|
* 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,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|