Repository navigation
Expand file tree
/
Copy pathjest.setup.js
More file actions
138 lines (122 loc) · 3.29 KB
/
Copy pathjest.setup.js
File metadata and controls
138 lines (122 loc) · 3.29 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
// Learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom'
// Polyfills for jsdom environment (required for MSW)
import { TextEncoder, TextDecoder } from 'util'
import { ReadableStream } from 'stream/web'
global.TextEncoder = TextEncoder
global.TextDecoder = TextDecoder
global.ReadableStream = ReadableStream
// Polyfill Headers first (needed by Request and Response)
global.Headers = class Headers {
constructor(init = {}) {
this._headers = new Map()
if (init) {
if (init instanceof Headers) {
init._headers.forEach((value, key) => {
this._headers.set(key, value)
})
} else if (typeof init === 'object') {
Object.entries(init).forEach(([key, value]) => {
this._headers.set(key.toLowerCase(), value)
})
}
}
}
get(name) {
const value = this._headers.get(name.toLowerCase())
return value !== undefined ? value : null
}
set(name, value) {
this._headers.set(name.toLowerCase(), value)
}
has(name) {
return this._headers.has(name.toLowerCase())
}
forEach(callback) {
this._headers.forEach(callback)
}
}
// Polyfill Request
global.Request = class Request {
constructor(url, init = {}) {
this.url = url
this.method = init.method || 'GET'
this.headers = init.headers instanceof global.Headers ? init.headers : new global.Headers(init.headers || {})
this.body = init.body
this._bodyInit = init.body
}
async json() {
return JSON.parse(this._bodyInit)
}
// Standard Request API; routes that must size-check or parse the body themselves use it.
async text() {
return this._bodyInit == null ? '' : String(this._bodyInit)
}
}
// Polyfill Response
global.Response = class Response {
constructor(body, init = {}) {
this.body = body
this.status = init.status || 200
this.ok = this.status >= 200 && this.status < 300
this.statusText = init.statusText || 'OK'
this.headers = new global.Headers(init.headers || {})
}
static json(data, init = {}) {
return new Response(JSON.stringify(data), {
...init,
headers: {
'content-type': 'application/json',
...init.headers,
},
})
}
async json() {
return JSON.parse(this.body)
}
async text() {
return this.body
}
}
// Mock next/navigation for testing
jest.mock('next/navigation', () => ({
useRouter() {
return {
push: jest.fn(),
replace: jest.fn(),
prefetch: jest.fn(),
back: jest.fn(),
pathname: '/',
query: {},
asPath: '/',
}
},
usePathname() {
return '/'
},
useSearchParams() {
return new URLSearchParams()
},
}))
// Mock window.matchMedia (guard: not available in @jest-environment node tests)
if (typeof window !== 'undefined') 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 localStorage
const localStorageMock = {
getItem: jest.fn(),
setItem: jest.fn(),
removeItem: jest.fn(),
clear: jest.fn(),
}
global.localStorage = localStorageMock