forked from Uniswap/interface
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetupTests.ts
More file actions
103 lines (90 loc) · 3.44 KB
/
Copy pathsetupTests.ts
File metadata and controls
103 lines (90 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import '@testing-library/jest-dom' // jest custom assertions
import 'jest-styled-components' // adds style diffs to snapshot tests
import type { createPopper } from '@popperjs/core'
import { useWeb3React } from '@web3-react/core'
import failOnConsole from 'jest-fail-on-console'
import ResizeObserver from 'resize-observer-polyfill'
import { Readable } from 'stream'
import { mocked } from 'test-utils/mocked'
import { TextDecoder, TextEncoder } from 'util'
window.open = jest.fn()
window.getComputedStyle = jest.fn()
if (typeof global.TextEncoder === 'undefined') {
global.ReadableStream = Readable as unknown as typeof globalThis.ReadableStream
global.TextEncoder = TextEncoder
global.TextDecoder = TextDecoder as typeof global.TextDecoder
}
global.ResizeObserver = ResizeObserver
// Sets origin to the production origin, because some tests depend on this.
// This prevents each test file from needing to set this manually.
global.origin = 'https://app.uniswap.org'
global.matchMedia =
global.matchMedia ||
function () {
return {
matches: false,
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
}
}
jest.mock('@popperjs/core', () => {
const core = jest.requireActual('@popperjs/core')
return {
...core,
createPopper: (...args: Parameters<typeof createPopper>) => {
const [referenceElement, popperElement, options = {}] = args
// Prevent popper from making state updates asynchronously.
// This is necessary to avoid warnings during tests, as popper will asynchronously update state outside of test setup.
options?.modifiers?.push({
name: 'synchronousUpdate',
enabled: true,
phase: 'beforeMain',
effect: (state) => {
state.instance.update = () => {
state.instance.forceUpdate()
return Promise.resolve(state.instance.state)
}
},
})
return core.createPopper(referenceElement, popperElement, options)
},
}
})
jest.mock('@web3-react/core', () => {
const web3React = jest.requireActual('@web3-react/core')
const { Empty } = jest.requireActual('@web3-react/empty')
return {
...web3React,
initializeConnector: () =>
web3React.initializeConnector(
(actions: Parameters<typeof web3React.initializeConnector>[0]) => new Empty(actions)
),
useWeb3React: jest.fn(),
}
})
// Mocks are configured to reset between tests (by CRA), so they must be set in a beforeEach.
beforeEach(() => {
// Mock window.getComputedStyle, because it is otherwise too computationally expensive to unit test.
// Not mocking this results in multi-second tests when using popper.js.
mocked(window.getComputedStyle).mockImplementation(() => new CSSStyleDeclaration())
// Mock useWeb3React to return a chainId of 1 by default.
mocked(useWeb3React).mockReturnValue({ chainId: 1 } as ReturnType<typeof useWeb3React>)
})
/**
* Fail tests if anything is logged to the console. This keeps the console clean and ensures test output stays readable.
* If something should log to the console, it should be stubbed and asserted:
* @example
* beforeEach(() => jest.spyOn(console, 'error').mockReturnsValue())
* it('should log an error', () => {
* example()
* expect(console.error).toHaveBeenCalledWith(expect.any(Error))
* })
*/
failOnConsole({
shouldFailOnAssert: true,
shouldFailOnDebug: true,
shouldFailOnError: true,
shouldFailOnInfo: true,
shouldFailOnLog: true,
shouldFailOnWarn: true,
})