-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjest.setup.js
More file actions
144 lines (127 loc) · 3.27 KB
/
jest.setup.js
File metadata and controls
144 lines (127 loc) · 3.27 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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom'
// Polyfills for Node.js environment
import { TextDecoder, TextEncoder } from 'util'
Object.assign(global, { TextDecoder, TextEncoder })
// Fetch polyfill for tests
import 'whatwg-fetch'
// MSW will be imported in individual tests that need it
// Mock environment variables
process.env.NEXT_PUBLIC_API_BASE_URL = 'http://localhost:3005'
process.env.NEXT_PUBLIC_PRIVY_APP_ID = 'test-privy-app-id'
process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY = 'test-turnstile-key'
// Mock window.matchMedia
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation(query => ({
matches: false,
media: query,
onchange: null,
addListener: jest.fn(), // deprecated
removeListener: jest.fn(), // deprecated
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
})),
})
// Mock IntersectionObserver
global.IntersectionObserver = class IntersectionObserver {
constructor() {}
disconnect() {}
observe() {}
unobserve() {}
takeRecords() {
return []
}
}
// Mock ResizeObserver
global.ResizeObserver = class ResizeObserver {
constructor() {}
disconnect() {}
observe() {}
unobserve() {}
}
// Mock next/navigation
jest.mock('next/navigation', () => ({
useRouter() {
return {
push: jest.fn(),
replace: jest.fn(),
prefetch: jest.fn(),
back: jest.fn(),
pathname: '/',
query: {},
asPath: '/',
}
},
useSearchParams() {
return new URLSearchParams()
},
usePathname() {
return '/'
},
useParams() {
return {}
},
}))
// Mock next/image
jest.mock('next/image', () => ({
__esModule: true,
default: ({ src, alt, ...props }) => {
// eslint-disable-next-line jsx-a11y/alt-text, @next/next/no-img-element
return <img src={src} alt={alt} {...props} />
},
}))
// Mock cookies-next
jest.mock('cookies-next', () => ({
getCookie: jest.fn(),
setCookie: jest.fn(),
deleteCookie: jest.fn(),
hasCookie: jest.fn(),
}))
// Mock OKX Connect to avoid ESM issues
jest.mock('@okxconnect/universal-provider', () => ({
OKXUniversalProvider: jest.fn(() => ({
connect: jest.fn(),
disconnect: jest.fn(),
signMessage: jest.fn(),
request: jest.fn(),
})),
}))
// Mock useOKXApp hook
jest.mock('@/hooks/auth-providers/useOKXApp', () => ({
useOKXApp: () => ({
connect: jest.fn().mockResolvedValue({ publicKey: 'test-public-key' }),
disconnect: jest.fn().mockResolvedValue(undefined),
signMessage: jest.fn().mockResolvedValue('test-signature'),
publicKey: null,
isConnecting: false,
isSigning: false,
lastSignature: null,
error: null,
}),
}))
// Suppress console errors in tests (optional)
const originalError = console.error
beforeAll(() => {
console.error = (...args) => {
if (
typeof args[0] === 'string' &&
args[0].includes('Warning: ReactDOM.render')
) {
return
}
originalError.call(console, ...args)
}
})
afterAll(() => {
console.error = originalError
})
// Global test utilities
global.sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms))
// Mock fetch globally
global.fetch = jest.fn()
// Reset mocks after each test
afterEach(() => {
jest.clearAllMocks()
})