odac 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/rules/coding.md +27 -0
- package/.agent/rules/memory.md +33 -0
- package/.agent/rules/project.md +30 -0
- package/.agent/rules/workflow.md +16 -0
- package/.github/workflows/release.yml +42 -1
- package/.github/workflows/test-coverage.yml +6 -5
- package/.github/workflows/test-publish.yml +36 -0
- package/.husky/pre-commit +10 -0
- package/.husky/pre-push +13 -0
- package/.releaserc.js +3 -3
- package/CHANGELOG.md +67 -0
- package/README.md +16 -0
- package/bin/odac.js +182 -40
- package/client/odac.js +10 -4
- package/docs/backend/01-overview/03-development-server.md +38 -45
- package/docs/backend/02-structure/01-typical-project-layout.md +59 -26
- package/docs/backend/03-config/00-configuration-overview.md +6 -6
- package/docs/backend/03-config/01-database-connection.md +2 -2
- package/docs/backend/03-config/02-static-route-mapping-optional.md +1 -1
- package/docs/backend/03-config/03-request-timeout.md +1 -1
- package/docs/backend/03-config/04-environment-variables.md +4 -4
- package/docs/backend/03-config/05-early-hints.md +2 -2
- package/docs/backend/04-routing/03-api-and-data-routes.md +18 -0
- package/docs/backend/04-routing/07-cron-jobs.md +17 -1
- package/docs/backend/05-controllers/01-how-to-build-a-controller.md +48 -3
- package/docs/backend/05-controllers/03-controller-classes.md +40 -20
- package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +17 -0
- package/docs/backend/07-views/10-styling-and-tailwind.md +93 -0
- package/docs/backend/08-database/01-getting-started.md +2 -2
- package/docs/backend/10-authentication/03-register.md +1 -1
- package/docs/backend/10-authentication/04-odac-register-forms.md +2 -2
- package/docs/backend/10-authentication/05-session-management.md +15 -1
- package/docs/backend/10-authentication/06-odac-login-forms.md +2 -2
- package/docs/backend/10-authentication/07-magic-links.md +1 -1
- package/docs/index.json +5 -1
- package/jest.config.js +1 -1
- package/package.json +9 -5
- package/src/Auth.js +58 -23
- package/src/Config.js +7 -7
- package/src/Env.js +3 -1
- package/src/Ipc.js +7 -0
- package/src/Lang.js +9 -2
- package/src/Odac.js +44 -35
- package/src/Request.js +1 -1
- package/src/Route/Cron.js +58 -17
- package/src/Route/Internal.js +1 -1
- package/src/Route.js +282 -99
- package/src/Server.js +40 -3
- package/src/Storage.js +4 -0
- package/src/Token.js +6 -4
- package/src/Validator.js +1 -1
- package/src/Var.js +22 -6
- package/src/View/EarlyHints.js +43 -33
- package/src/View/Form.js +17 -11
- package/src/View.js +62 -6
- package/template/package.json +3 -1
- package/template/view/content/home.html +3 -3
- package/template/view/head/main.html +2 -2
- package/test/Client.test.js +168 -0
- package/test/Config.test.js +112 -0
- package/test/Lang.test.js +92 -0
- package/test/Odac.test.js +86 -0
- package/test/{framework/middleware.test.js → Route/Middleware.test.js} +2 -2
- package/test/{framework/Route.test.js → Route.test.js} +1 -1
- package/test/{framework/View → View}/EarlyHints.test.js +1 -1
- package/test/{framework/WebSocket.test.js → WebSocket.test.js} +2 -2
- package/test/scripts/check-coverage.js +4 -4
- package/test/cli/Cli.test.js +0 -36
- package/test/core/Commands.test.js +0 -538
- package/test/core/Config.test.js +0 -1432
- package/test/core/Lang.test.js +0 -250
- package/test/core/Odac.test.js +0 -234
- package/test/core/Process.test.js +0 -156
- package/test/server/Api.test.js +0 -647
- package/test/server/DNS.test.js +0 -2050
- package/test/server/DNS.test.js.bak +0 -2084
- package/test/server/Hub.test.js +0 -497
- package/test/server/Log.test.js +0 -73
- package/test/server/Mail.account.test_.js +0 -460
- package/test/server/Mail.init.test_.js +0 -411
- package/test/server/Mail.test_.js +0 -1340
- package/test/server/SSL.test_.js +0 -1491
- package/test/server/Server.test.js +0 -765
- package/test/server/Service.test_.js +0 -1127
- package/test/server/Subdomain.test.js +0 -440
- package/test/server/Web/Firewall.test.js +0 -175
- package/test/server/Web/Proxy.test.js +0 -397
- package/test/server/Web.test.js +0 -1494
- package/test/server/__mocks__/acme-client.js +0 -17
- package/test/server/__mocks__/bcrypt.js +0 -50
- package/test/server/__mocks__/child_process.js +0 -389
- package/test/server/__mocks__/crypto.js +0 -432
- package/test/server/__mocks__/fs.js +0 -450
- package/test/server/__mocks__/globalOdac.js +0 -227
- package/test/server/__mocks__/http.js +0 -575
- package/test/server/__mocks__/https.js +0 -272
- package/test/server/__mocks__/index.js +0 -249
- package/test/server/__mocks__/mail/server.js +0 -100
- package/test/server/__mocks__/mail/smtp.js +0 -31
- package/test/server/__mocks__/mailparser.js +0 -81
- package/test/server/__mocks__/net.js +0 -369
- package/test/server/__mocks__/node-forge.js +0 -328
- package/test/server/__mocks__/os.js +0 -320
- package/test/server/__mocks__/path.js +0 -291
- package/test/server/__mocks__/selfsigned.js +0 -8
- package/test/server/__mocks__/server/src/mail/server.js +0 -100
- package/test/server/__mocks__/server/src/mail/smtp.js +0 -31
- package/test/server/__mocks__/smtp-server.js +0 -106
- package/test/server/__mocks__/sqlite3.js +0 -394
- package/test/server/__mocks__/testFactories.js +0 -299
- package/test/server/__mocks__/testHelpers.js +0 -363
- package/test/server/__mocks__/tls.js +0 -229
- /package/template/{config.json → odac.json} +0 -0
|
@@ -1,575 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mock implementation of the http module for server tests
|
|
3
|
-
* Provides comprehensive mocking of HTTP server and client operations
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const {createMockEventEmitter} = require('./testHelpers')
|
|
7
|
-
const {createMockRequest, createMockResponse} = require('./testFactories')
|
|
8
|
-
|
|
9
|
-
// Track active servers
|
|
10
|
-
const activeServers = new Map()
|
|
11
|
-
let nextServerId = 1
|
|
12
|
-
|
|
13
|
-
const createMockIncomingMessage = (options = {}) => {
|
|
14
|
-
const message = createMockEventEmitter()
|
|
15
|
-
|
|
16
|
-
Object.assign(message, {
|
|
17
|
-
// HTTP properties
|
|
18
|
-
httpVersion: options.httpVersion || '1.1',
|
|
19
|
-
httpVersionMajor: options.httpVersionMajor || 1,
|
|
20
|
-
httpVersionMinor: options.httpVersionMinor || 1,
|
|
21
|
-
complete: false,
|
|
22
|
-
|
|
23
|
-
// Request properties
|
|
24
|
-
url: options.url || '/',
|
|
25
|
-
method: options.method || 'GET',
|
|
26
|
-
statusCode: options.statusCode,
|
|
27
|
-
statusMessage: options.statusMessage,
|
|
28
|
-
|
|
29
|
-
// Headers
|
|
30
|
-
headers: options.headers || {},
|
|
31
|
-
rawHeaders: options.rawHeaders || [],
|
|
32
|
-
trailers: {},
|
|
33
|
-
rawTrailers: [],
|
|
34
|
-
|
|
35
|
-
// Connection info
|
|
36
|
-
connection: {
|
|
37
|
-
remoteAddress: options.remoteAddress || '127.0.0.1',
|
|
38
|
-
remotePort: options.remotePort || 12345,
|
|
39
|
-
localAddress: options.localAddress || '127.0.0.1',
|
|
40
|
-
localPort: options.localPort || 80
|
|
41
|
-
},
|
|
42
|
-
socket: options.socket || null,
|
|
43
|
-
|
|
44
|
-
// Stream properties
|
|
45
|
-
readable: true,
|
|
46
|
-
readableEnded: false,
|
|
47
|
-
|
|
48
|
-
// Methods
|
|
49
|
-
setTimeout: jest.fn((msecs, callback) => {
|
|
50
|
-
if (callback) {
|
|
51
|
-
message.once('timeout', callback)
|
|
52
|
-
}
|
|
53
|
-
return message
|
|
54
|
-
}),
|
|
55
|
-
|
|
56
|
-
// Test helpers
|
|
57
|
-
__simulateData: chunk => {
|
|
58
|
-
if (message.readable) {
|
|
59
|
-
message.emit('data', Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
__simulateEnd: () => {
|
|
64
|
-
message.complete = true
|
|
65
|
-
message.readableEnded = true
|
|
66
|
-
message.emit('end')
|
|
67
|
-
},
|
|
68
|
-
|
|
69
|
-
__simulateError: error => {
|
|
70
|
-
message.emit('error', error)
|
|
71
|
-
}
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
return message
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const createMockServerResponse = (options = {}) => {
|
|
78
|
-
const response = createMockEventEmitter()
|
|
79
|
-
|
|
80
|
-
Object.assign(response, {
|
|
81
|
-
// Response properties
|
|
82
|
-
statusCode: 200,
|
|
83
|
-
statusMessage: 'OK',
|
|
84
|
-
headersSent: false,
|
|
85
|
-
finished: false,
|
|
86
|
-
|
|
87
|
-
// Headers
|
|
88
|
-
headers: {},
|
|
89
|
-
|
|
90
|
-
// Connection
|
|
91
|
-
connection: options.connection || null,
|
|
92
|
-
socket: options.socket || null,
|
|
93
|
-
|
|
94
|
-
// Stream properties
|
|
95
|
-
writable: true,
|
|
96
|
-
writableEnded: false,
|
|
97
|
-
|
|
98
|
-
// Methods
|
|
99
|
-
writeHead: jest.fn((statusCode, statusMessage, headers) => {
|
|
100
|
-
if (typeof statusMessage === 'object') {
|
|
101
|
-
headers = statusMessage
|
|
102
|
-
statusMessage = undefined
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
response.statusCode = statusCode
|
|
106
|
-
if (statusMessage) {
|
|
107
|
-
response.statusMessage = statusMessage
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (headers) {
|
|
111
|
-
Object.entries(headers).forEach(([name, value]) => {
|
|
112
|
-
response.setHeader(name, value)
|
|
113
|
-
})
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
response.headersSent = true
|
|
117
|
-
return response
|
|
118
|
-
}),
|
|
119
|
-
|
|
120
|
-
setHeader: jest.fn((name, value) => {
|
|
121
|
-
if (response.headersSent) {
|
|
122
|
-
throw new Error('Cannot set headers after they are sent to the client')
|
|
123
|
-
}
|
|
124
|
-
response.headers[name.toLowerCase()] = value
|
|
125
|
-
return response
|
|
126
|
-
}),
|
|
127
|
-
|
|
128
|
-
getHeader: jest.fn(name => {
|
|
129
|
-
return response.headers[name.toLowerCase()]
|
|
130
|
-
}),
|
|
131
|
-
|
|
132
|
-
getHeaders: jest.fn(() => {
|
|
133
|
-
return {...response.headers}
|
|
134
|
-
}),
|
|
135
|
-
|
|
136
|
-
getHeaderNames: jest.fn(() => {
|
|
137
|
-
return Object.keys(response.headers)
|
|
138
|
-
}),
|
|
139
|
-
|
|
140
|
-
hasHeader: jest.fn(name => {
|
|
141
|
-
return name.toLowerCase() in response.headers
|
|
142
|
-
}),
|
|
143
|
-
|
|
144
|
-
removeHeader: jest.fn(name => {
|
|
145
|
-
delete response.headers[name.toLowerCase()]
|
|
146
|
-
return response
|
|
147
|
-
}),
|
|
148
|
-
|
|
149
|
-
write: jest.fn((chunk, encoding, callback) => {
|
|
150
|
-
if (!response.writable) {
|
|
151
|
-
const error = new Error('Cannot write to finished response')
|
|
152
|
-
if (callback) callback(error)
|
|
153
|
-
return false
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (!response.headersSent) {
|
|
157
|
-
response.writeHead(response.statusCode)
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (typeof encoding === 'function') {
|
|
161
|
-
callback = encoding
|
|
162
|
-
encoding = 'utf8'
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (callback) {
|
|
166
|
-
setTimeout(callback, 0)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return true
|
|
170
|
-
}),
|
|
171
|
-
|
|
172
|
-
end: jest.fn((data, encoding, callback) => {
|
|
173
|
-
if (data) {
|
|
174
|
-
response.write(data, encoding)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
if (typeof encoding === 'function') {
|
|
178
|
-
callback = encoding
|
|
179
|
-
}
|
|
180
|
-
if (typeof data === 'function') {
|
|
181
|
-
callback = data
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
response.finished = true
|
|
185
|
-
response.writable = false
|
|
186
|
-
response.writableEnded = true
|
|
187
|
-
|
|
188
|
-
setTimeout(() => {
|
|
189
|
-
response.emit('finish')
|
|
190
|
-
if (callback) callback()
|
|
191
|
-
}, 0)
|
|
192
|
-
|
|
193
|
-
return response
|
|
194
|
-
}),
|
|
195
|
-
|
|
196
|
-
setTimeout: jest.fn((msecs, callback) => {
|
|
197
|
-
if (callback) {
|
|
198
|
-
response.once('timeout', callback)
|
|
199
|
-
}
|
|
200
|
-
return response
|
|
201
|
-
}),
|
|
202
|
-
|
|
203
|
-
// Test helpers
|
|
204
|
-
__simulateError: error => {
|
|
205
|
-
response.emit('error', error)
|
|
206
|
-
}
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
return response
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const createMockServer = (options = {}) => {
|
|
213
|
-
const server = createMockEventEmitter()
|
|
214
|
-
const serverId = nextServerId++
|
|
215
|
-
|
|
216
|
-
Object.assign(server, {
|
|
217
|
-
// Server properties
|
|
218
|
-
listening: false,
|
|
219
|
-
maxHeadersCount: null,
|
|
220
|
-
timeout: 120000,
|
|
221
|
-
keepAliveTimeout: 5000,
|
|
222
|
-
headersTimeout: 60000,
|
|
223
|
-
requestTimeout: 0,
|
|
224
|
-
|
|
225
|
-
// Methods
|
|
226
|
-
listen: jest.fn((port, hostname, backlog, callback) => {
|
|
227
|
-
// Handle different argument patterns
|
|
228
|
-
if (typeof port === 'function') {
|
|
229
|
-
callback = port
|
|
230
|
-
port = 0
|
|
231
|
-
} else if (typeof hostname === 'function') {
|
|
232
|
-
callback = hostname
|
|
233
|
-
hostname = undefined
|
|
234
|
-
} else if (typeof backlog === 'function') {
|
|
235
|
-
callback = backlog
|
|
236
|
-
backlog = undefined
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
server._port = port || 80
|
|
240
|
-
server._hostname = hostname || '0.0.0.0'
|
|
241
|
-
server.listening = true
|
|
242
|
-
|
|
243
|
-
if (callback) {
|
|
244
|
-
server.once('listening', callback)
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
setTimeout(() => {
|
|
248
|
-
server.emit('listening')
|
|
249
|
-
}, 0)
|
|
250
|
-
|
|
251
|
-
return server
|
|
252
|
-
}),
|
|
253
|
-
|
|
254
|
-
close: jest.fn(callback => {
|
|
255
|
-
server.listening = false
|
|
256
|
-
|
|
257
|
-
if (callback) {
|
|
258
|
-
server.once('close', callback)
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
setTimeout(() => {
|
|
262
|
-
server.emit('close')
|
|
263
|
-
}, 0)
|
|
264
|
-
|
|
265
|
-
activeServers.delete(serverId)
|
|
266
|
-
return server
|
|
267
|
-
}),
|
|
268
|
-
|
|
269
|
-
address: jest.fn(() => {
|
|
270
|
-
if (!server.listening) return null
|
|
271
|
-
return {
|
|
272
|
-
address: server._hostname || '0.0.0.0',
|
|
273
|
-
family: 'IPv4',
|
|
274
|
-
port: server._port || 80
|
|
275
|
-
}
|
|
276
|
-
}),
|
|
277
|
-
|
|
278
|
-
setTimeout: jest.fn((msecs, callback) => {
|
|
279
|
-
server.timeout = msecs
|
|
280
|
-
if (callback) {
|
|
281
|
-
server.on('timeout', callback)
|
|
282
|
-
}
|
|
283
|
-
return server
|
|
284
|
-
}),
|
|
285
|
-
|
|
286
|
-
// Test helpers
|
|
287
|
-
__simulateRequest: (requestOptions = {}, responseOptions = {}) => {
|
|
288
|
-
if (!server.listening) {
|
|
289
|
-
throw new Error('Server is not listening')
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
const req = createMockIncomingMessage({
|
|
293
|
-
url: '/',
|
|
294
|
-
method: 'GET',
|
|
295
|
-
headers: {host: 'localhost'},
|
|
296
|
-
...requestOptions
|
|
297
|
-
})
|
|
298
|
-
|
|
299
|
-
const res = createMockServerResponse(responseOptions)
|
|
300
|
-
|
|
301
|
-
setTimeout(() => {
|
|
302
|
-
server.emit('request', req, res)
|
|
303
|
-
}, 0)
|
|
304
|
-
|
|
305
|
-
return {req, res}
|
|
306
|
-
},
|
|
307
|
-
|
|
308
|
-
__simulateError: error => {
|
|
309
|
-
server.emit('error', error)
|
|
310
|
-
}
|
|
311
|
-
})
|
|
312
|
-
|
|
313
|
-
activeServers.set(serverId, server)
|
|
314
|
-
return server
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const createMockClientRequest = (options = {}) => {
|
|
318
|
-
const request = createMockEventEmitter()
|
|
319
|
-
|
|
320
|
-
Object.assign(request, {
|
|
321
|
-
// Request properties
|
|
322
|
-
method: options.method || 'GET',
|
|
323
|
-
path: options.path || '/',
|
|
324
|
-
host: options.host || 'localhost',
|
|
325
|
-
port: options.port || 80,
|
|
326
|
-
|
|
327
|
-
// State
|
|
328
|
-
aborted: false,
|
|
329
|
-
finished: false,
|
|
330
|
-
|
|
331
|
-
// Stream properties
|
|
332
|
-
writable: true,
|
|
333
|
-
writableEnded: false,
|
|
334
|
-
|
|
335
|
-
// Methods
|
|
336
|
-
write: jest.fn((chunk, encoding, callback) => {
|
|
337
|
-
if (!request.writable) {
|
|
338
|
-
const error = new Error('Cannot write to finished request')
|
|
339
|
-
if (callback) callback(error)
|
|
340
|
-
return false
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
if (typeof encoding === 'function') {
|
|
344
|
-
callback = encoding
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (callback) {
|
|
348
|
-
setTimeout(callback, 0)
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
return true
|
|
352
|
-
}),
|
|
353
|
-
|
|
354
|
-
end: jest.fn((data, encoding, callback) => {
|
|
355
|
-
if (data) {
|
|
356
|
-
request.write(data, encoding)
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
if (typeof encoding === 'function') {
|
|
360
|
-
callback = encoding
|
|
361
|
-
}
|
|
362
|
-
if (typeof data === 'function') {
|
|
363
|
-
callback = data
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
request.finished = true
|
|
367
|
-
request.writable = false
|
|
368
|
-
request.writableEnded = true
|
|
369
|
-
|
|
370
|
-
// Simulate response
|
|
371
|
-
setTimeout(() => {
|
|
372
|
-
const response = createMockIncomingMessage({
|
|
373
|
-
statusCode: 200,
|
|
374
|
-
statusMessage: 'OK',
|
|
375
|
-
headers: {'content-type': 'text/plain'}
|
|
376
|
-
})
|
|
377
|
-
|
|
378
|
-
request.emit('response', response)
|
|
379
|
-
|
|
380
|
-
// Simulate response data
|
|
381
|
-
setTimeout(() => {
|
|
382
|
-
response.__simulateData('Mock response data')
|
|
383
|
-
response.__simulateEnd()
|
|
384
|
-
}, 0)
|
|
385
|
-
|
|
386
|
-
if (callback) callback()
|
|
387
|
-
}, 0)
|
|
388
|
-
|
|
389
|
-
return request
|
|
390
|
-
}),
|
|
391
|
-
|
|
392
|
-
abort: jest.fn(() => {
|
|
393
|
-
request.aborted = true
|
|
394
|
-
request.emit('abort')
|
|
395
|
-
return request
|
|
396
|
-
}),
|
|
397
|
-
|
|
398
|
-
setTimeout: jest.fn((timeout, callback) => {
|
|
399
|
-
if (callback) {
|
|
400
|
-
request.once('timeout', callback)
|
|
401
|
-
}
|
|
402
|
-
return request
|
|
403
|
-
}),
|
|
404
|
-
|
|
405
|
-
setHeader: jest.fn((name, value) => {
|
|
406
|
-
// Mock implementation
|
|
407
|
-
return request
|
|
408
|
-
}),
|
|
409
|
-
|
|
410
|
-
getHeader: jest.fn(name => {
|
|
411
|
-
// Mock implementation
|
|
412
|
-
return undefined
|
|
413
|
-
}),
|
|
414
|
-
|
|
415
|
-
removeHeader: jest.fn(name => {
|
|
416
|
-
// Mock implementation
|
|
417
|
-
return request
|
|
418
|
-
}),
|
|
419
|
-
|
|
420
|
-
// Test helpers
|
|
421
|
-
__simulateError: error => {
|
|
422
|
-
request.emit('error', error)
|
|
423
|
-
},
|
|
424
|
-
|
|
425
|
-
__simulateResponse: (responseOptions = {}) => {
|
|
426
|
-
const response = createMockIncomingMessage({
|
|
427
|
-
statusCode: 200,
|
|
428
|
-
statusMessage: 'OK',
|
|
429
|
-
...responseOptions
|
|
430
|
-
})
|
|
431
|
-
|
|
432
|
-
setTimeout(() => {
|
|
433
|
-
request.emit('response', response)
|
|
434
|
-
}, 0)
|
|
435
|
-
|
|
436
|
-
return response
|
|
437
|
-
}
|
|
438
|
-
})
|
|
439
|
-
|
|
440
|
-
return request
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
const http = {
|
|
444
|
-
// Server creation
|
|
445
|
-
createServer: jest.fn((options, requestListener) => {
|
|
446
|
-
if (typeof options === 'function') {
|
|
447
|
-
requestListener = options
|
|
448
|
-
options = {}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
const server = createMockServer(options)
|
|
452
|
-
|
|
453
|
-
if (requestListener) {
|
|
454
|
-
server.on('request', requestListener)
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
return server
|
|
458
|
-
}),
|
|
459
|
-
|
|
460
|
-
// Client requests
|
|
461
|
-
request: jest.fn((options, callback) => {
|
|
462
|
-
if (typeof options === 'string') {
|
|
463
|
-
options = new URL(options)
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
const req = createMockClientRequest(options)
|
|
467
|
-
|
|
468
|
-
if (callback) {
|
|
469
|
-
req.once('response', callback)
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
return req
|
|
473
|
-
}),
|
|
474
|
-
|
|
475
|
-
get: jest.fn((options, callback) => {
|
|
476
|
-
const req = http.request(options, callback)
|
|
477
|
-
req.end()
|
|
478
|
-
return req
|
|
479
|
-
}),
|
|
480
|
-
|
|
481
|
-
// Classes
|
|
482
|
-
Server: jest.fn(function (options, requestListener) {
|
|
483
|
-
return createMockServer(options, requestListener)
|
|
484
|
-
}),
|
|
485
|
-
|
|
486
|
-
IncomingMessage: jest.fn(function (socket) {
|
|
487
|
-
return createMockIncomingMessage({socket})
|
|
488
|
-
}),
|
|
489
|
-
|
|
490
|
-
ServerResponse: jest.fn(function (req) {
|
|
491
|
-
return createMockServerResponse({connection: req?.connection})
|
|
492
|
-
}),
|
|
493
|
-
|
|
494
|
-
ClientRequest: jest.fn(function (options) {
|
|
495
|
-
return createMockClientRequest(options)
|
|
496
|
-
}),
|
|
497
|
-
|
|
498
|
-
// Constants
|
|
499
|
-
METHODS: [
|
|
500
|
-
'ACL',
|
|
501
|
-
'BIND',
|
|
502
|
-
'CHECKOUT',
|
|
503
|
-
'CONNECT',
|
|
504
|
-
'COPY',
|
|
505
|
-
'DELETE',
|
|
506
|
-
'GET',
|
|
507
|
-
'HEAD',
|
|
508
|
-
'LINK',
|
|
509
|
-
'LOCK',
|
|
510
|
-
'M-SEARCH',
|
|
511
|
-
'MERGE',
|
|
512
|
-
'MKACTIVITY',
|
|
513
|
-
'MKCALENDAR',
|
|
514
|
-
'MKCOL',
|
|
515
|
-
'MOVE',
|
|
516
|
-
'NOTIFY',
|
|
517
|
-
'OPTIONS',
|
|
518
|
-
'PATCH',
|
|
519
|
-
'POST',
|
|
520
|
-
'PROPFIND',
|
|
521
|
-
'PROPPATCH',
|
|
522
|
-
'PURGE',
|
|
523
|
-
'PUT',
|
|
524
|
-
'REBIND',
|
|
525
|
-
'REPORT',
|
|
526
|
-
'SEARCH',
|
|
527
|
-
'SOURCE',
|
|
528
|
-
'SUBSCRIBE',
|
|
529
|
-
'TRACE',
|
|
530
|
-
'UNBIND',
|
|
531
|
-
'UNLINK',
|
|
532
|
-
'UNLOCK',
|
|
533
|
-
'UNSUBSCRIBE'
|
|
534
|
-
],
|
|
535
|
-
|
|
536
|
-
STATUS_CODES: {
|
|
537
|
-
100: 'Continue',
|
|
538
|
-
101: 'Switching Protocols',
|
|
539
|
-
200: 'OK',
|
|
540
|
-
201: 'Created',
|
|
541
|
-
202: 'Accepted',
|
|
542
|
-
204: 'No Content',
|
|
543
|
-
300: 'Multiple Choices',
|
|
544
|
-
301: 'Moved Permanently',
|
|
545
|
-
302: 'Found',
|
|
546
|
-
304: 'Not Modified',
|
|
547
|
-
400: 'Bad Request',
|
|
548
|
-
401: 'Unauthorized',
|
|
549
|
-
403: 'Forbidden',
|
|
550
|
-
404: 'Not Found',
|
|
551
|
-
405: 'Method Not Allowed',
|
|
552
|
-
500: 'Internal Server Error',
|
|
553
|
-
501: 'Not Implemented',
|
|
554
|
-
502: 'Bad Gateway',
|
|
555
|
-
503: 'Service Unavailable'
|
|
556
|
-
},
|
|
557
|
-
|
|
558
|
-
// Global agent
|
|
559
|
-
globalAgent: {
|
|
560
|
-
maxSockets: Infinity,
|
|
561
|
-
maxFreeSockets: 256,
|
|
562
|
-
timeout: 0,
|
|
563
|
-
keepAlive: false,
|
|
564
|
-
keepAliveMsecs: 1000
|
|
565
|
-
},
|
|
566
|
-
|
|
567
|
-
// Test helpers
|
|
568
|
-
__getActiveServers: () => new Map(activeServers),
|
|
569
|
-
__clearAll: () => {
|
|
570
|
-
activeServers.clear()
|
|
571
|
-
nextServerId = 1
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
module.exports = http
|