fastify 5.0.0 → 5.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/.borp.yaml +3 -0
- package/.vscode/settings.json +22 -0
- package/README.md +12 -7
- package/docs/Guides/Database.md +15 -15
- package/docs/Guides/Detecting-When-Clients-Abort.md +28 -28
- package/docs/Guides/Ecosystem.md +14 -15
- package/docs/Guides/Index.md +1 -1
- package/docs/Guides/Migration-Guide-V4.md +11 -11
- package/docs/Guides/Migration-Guide-V5.md +133 -9
- package/docs/Guides/Plugins-Guide.md +1 -1
- package/docs/Guides/Prototype-Poisoning.md +3 -3
- package/docs/Guides/Recommendations.md +9 -9
- package/docs/Guides/Serverless.md +5 -5
- package/docs/Guides/Testing.md +58 -57
- package/docs/Guides/Write-Plugin.md +2 -2
- package/docs/Guides/Write-Type-Provider.md +3 -3
- package/docs/Reference/ContentTypeParser.md +4 -4
- package/docs/Reference/Decorators.md +2 -2
- package/docs/Reference/Errors.md +3 -3
- package/docs/Reference/Hooks.md +7 -7
- package/docs/Reference/LTS.md +8 -0
- package/docs/Reference/Logging.md +5 -4
- package/docs/Reference/Reply.md +55 -58
- package/docs/Reference/Request.md +49 -42
- package/docs/Reference/Routes.md +16 -13
- package/docs/Reference/Server.md +32 -28
- package/docs/Reference/TypeScript.md +9 -9
- package/docs/Reference/Validation-and-Serialization.md +5 -5
- package/examples/typescript-server.ts +1 -1
- package/fastify.d.ts +14 -5
- package/fastify.js +8 -6
- package/lib/contentTypeParser.js +9 -7
- package/lib/context.js +1 -2
- package/lib/error-handler.js +9 -9
- package/lib/errors.js +1 -1
- package/lib/fourOhFour.js +1 -1
- package/lib/hooks.js +4 -1
- package/lib/{logger.js → logger-factory.js} +70 -122
- package/lib/logger-pino.js +68 -0
- package/lib/pluginOverride.js +1 -1
- package/lib/pluginUtils.js +2 -2
- package/lib/reply.js +4 -5
- package/lib/request.js +16 -9
- package/lib/route.js +23 -22
- package/lib/validation.js +2 -2
- package/package.json +13 -15
- package/test/404s.test.js +675 -629
- package/test/500s.test.js +72 -63
- package/test/{allowUnsafeRegex.test.js → allow-unsafe-regex.test.js} +30 -26
- package/test/als.test.js +48 -45
- package/test/async-await.test.js +148 -134
- package/test/async-dispose.test.js +4 -5
- package/test/async_hooks.test.js +30 -28
- package/test/{bodyLimit.test.js → body-limit.test.js} +61 -58
- package/test/buffer.test.js +9 -10
- package/test/build/error-serializer.test.js +3 -4
- package/test/build/version.test.js +2 -3
- package/test/build-certificate.js +1 -1
- package/test/bundler/README.md +5 -5
- package/test/bundler/esbuild/bundler-test.js +10 -9
- package/test/bundler/webpack/bundler-test.js +10 -9
- package/test/case-insensitive.test.js +31 -28
- package/test/chainable.test.js +4 -5
- package/test/check.test.js +8 -10
- package/test/{childLoggerFactory.test.js → child-logger-factory.test.js} +56 -19
- package/test/client-timeout.test.js +5 -5
- package/test/close-pipelining.test.js +6 -8
- package/test/conditional-pino.test.js +47 -0
- package/test/{connectionTimeout.test.js → connection-timeout.test.js} +10 -11
- package/test/constrained-routes.test.js +243 -236
- package/test/content-length.test.js +53 -68
- package/test/content-parser.test.js +186 -158
- package/test/content-type.test.js +8 -9
- package/test/context-config.test.js +44 -54
- package/test/custom-http-server.test.js +16 -20
- package/test/custom-parser.5.test.js +32 -32
- package/test/diagnostics-channel/404.test.js +15 -15
- package/test/diagnostics-channel/async-delay-request.test.js +25 -25
- package/test/diagnostics-channel/async-request.test.js +24 -24
- package/test/diagnostics-channel/error-before-handler.test.js +4 -5
- package/test/diagnostics-channel/error-request.test.js +19 -19
- package/test/diagnostics-channel/error-status.test.js +8 -8
- package/test/diagnostics-channel/init.test.js +6 -7
- package/test/diagnostics-channel/sync-delay-request.test.js +16 -16
- package/test/diagnostics-channel/sync-request-reply.test.js +16 -16
- package/test/diagnostics-channel/sync-request.test.js +19 -19
- package/test/encapsulated-child-logger-factory.test.js +8 -8
- package/test/encapsulated-error-handler.test.js +20 -20
- package/test/esm/errorCodes.test.mjs +5 -5
- package/test/esm/esm.test.mjs +3 -3
- package/test/esm/named-exports.mjs +3 -3
- package/test/esm/other.mjs +2 -2
- package/test/fastify-instance.test.js +33 -34
- package/test/{findRoute.test.js → find-route.test.js} +11 -10
- package/test/fluent-schema.test.js +33 -36
- package/test/handler-context.test.js +11 -11
- package/test/has-route.test.js +12 -15
- package/test/header-overflow.test.js +13 -12
- package/test/hooks.on-ready.test.js +2 -2
- package/test/hooks.test.js +25 -25
- package/test/http-methods/copy.test.js +22 -24
- package/test/http-methods/custom-http-methods.test.js +24 -21
- package/test/http-methods/get.test.js +97 -84
- package/test/http-methods/head.test.js +63 -57
- package/test/http-methods/lock.test.js +21 -20
- package/test/http-methods/mkcalendar.test.js +31 -27
- package/test/http-methods/mkcol.test.js +10 -10
- package/test/http-methods/move.test.js +11 -11
- package/test/http-methods/propfind.test.js +32 -27
- package/test/http-methods/proppatch.test.js +21 -19
- package/test/http-methods/report.test.js +32 -27
- package/test/http-methods/search.test.js +52 -47
- package/test/http-methods/trace.test.js +3 -4
- package/test/http-methods/unlock.test.js +10 -10
- package/test/http2/closing.test.js +50 -58
- package/test/http2/constraint.test.js +47 -50
- package/test/http2/head.test.js +18 -19
- package/test/http2/missing-http2-module.test.js +4 -5
- package/test/http2/plain.test.js +31 -31
- package/test/http2/secure-with-fallback.test.js +61 -61
- package/test/http2/secure.test.js +28 -31
- package/test/http2/unknown-http-method.test.js +13 -14
- package/test/https/custom-https-server.test.js +6 -7
- package/test/https/https.test.js +78 -78
- package/test/imports.test.js +5 -6
- package/test/internals/all.test.js +8 -11
- package/test/internals/{contentTypeParser.test.js → content-type-parser.test.js} +5 -6
- package/test/internals/context.test.js +9 -11
- package/test/internals/decorator.test.js +20 -21
- package/test/internals/errors.test.js +427 -427
- package/test/internals/{handleRequest.test.js → handle-request.test.js} +53 -42
- package/test/internals/{hookRunner.test.js → hook-runner.test.js} +99 -100
- package/test/internals/hooks.test.js +31 -35
- package/test/internals/{initialConfig.test.js → initial-config.test.js} +92 -80
- package/test/internals/logger.test.js +28 -28
- package/test/internals/plugin.test.js +17 -18
- package/test/internals/reply-serialize.test.js +106 -106
- package/test/internals/reply.test.js +620 -585
- package/test/internals/{reqIdGenFactory.test.js → req-id-gen-factory.test.js} +31 -31
- package/test/internals/request-validate.test.js +218 -221
- package/test/internals/request.test.js +225 -107
- package/test/internals/server.test.js +15 -12
- package/test/internals/validation.test.js +35 -36
- package/test/{keepAliveTimeout.test.js → keep-alive-timeout.test.js} +9 -10
- package/test/listen.5.test.js +9 -9
- package/test/{maxRequestsPerSocket.test.js → max-requests-per-socket.test.js} +30 -30
- package/test/middleware.test.js +4 -5
- package/test/noop-set.test.js +5 -5
- package/test/post-empty-body.test.js +18 -11
- package/test/pretty-print.test.js +59 -49
- package/test/proto-poisoning.test.js +42 -37
- package/test/reply-code.test.js +34 -32
- package/test/{reply-earlyHints.test.js → reply-early-hints.test.js} +21 -19
- package/test/request-error.test.js +122 -0
- package/test/request-header-host.test.js +339 -0
- package/test/request-id.test.js +31 -25
- package/test/{requestTimeout.test.js → request-timeout.test.js} +11 -11
- package/test/route.1.test.js +79 -72
- package/test/route.2.test.js +17 -16
- package/test/route.3.test.js +32 -27
- package/test/route.4.test.js +21 -25
- package/test/route.5.test.js +45 -64
- package/test/route.6.test.js +70 -89
- package/test/route.7.test.js +61 -65
- package/test/route.8.test.js +80 -18
- package/test/router-options.test.js +80 -77
- package/test/same-shape.test.js +5 -5
- package/test/schema-examples.test.js +72 -38
- package/test/serialize-response.test.js +9 -10
- package/test/server.test.js +75 -78
- package/test/set-error-handler.test.js +2 -3
- package/test/stream-serializers.test.js +10 -7
- package/test/sync-routes.test.js +18 -18
- package/test/test-reporter.mjs +68 -0
- package/test/trust-proxy.test.js +51 -45
- package/test/type-provider.test.js +8 -6
- package/test/types/content-type-parser.test-d.ts +1 -1
- package/test/types/fastify.test-d.ts +16 -4
- package/test/types/hooks.test-d.ts +2 -1
- package/test/types/instance.test-d.ts +13 -13
- package/test/types/logger.test-d.ts +2 -2
- package/test/types/plugin.test-d.ts +17 -9
- package/test/types/register.test-d.ts +22 -6
- package/test/types/reply.test-d.ts +1 -1
- package/test/types/route.test-d.ts +34 -4
- package/test/types/serverFactory.test-d.ts +1 -1
- package/test/types/type-provider.test-d.ts +1 -1
- package/test/url-rewriting.test.js +35 -38
- package/test/{useSemicolonDelimiter.test.js → use-semicolon-delimiter.test.js} +30 -30
- package/test/validation-error-handling.test.js +259 -285
- package/test/versioned-routes.test.js +126 -113
- package/test/web-api.test.js +48 -37
- package/test/{wrapThenable.test.js → wrap-thenable.test.js} +10 -9
- package/types/hooks.d.ts +2 -1
- package/types/instance.d.ts +9 -2
- package/types/register.d.ts +12 -3
- package/types/reply.d.ts +1 -1
- package/types/request.d.ts +2 -6
- package/types/serverFactory.d.ts +3 -3
- package/types/utils.d.ts +13 -5
- package/test/types/import.js +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { test, before } = require('
|
|
3
|
+
const { test, before } = require('node:test')
|
|
4
4
|
const helper = require('./helper')
|
|
5
5
|
const Fastify = require('..')
|
|
6
6
|
const sget = require('simple-get').concat
|
|
@@ -15,7 +15,7 @@ before(async function () {
|
|
|
15
15
|
[localhost] = await helper.getLoopbackHost()
|
|
16
16
|
})
|
|
17
17
|
|
|
18
|
-
test('Should register a versioned route', t => {
|
|
18
|
+
test('Should register a versioned route (inject)', (t, done) => {
|
|
19
19
|
t.plan(11)
|
|
20
20
|
const fastify = Fastify()
|
|
21
21
|
|
|
@@ -35,9 +35,9 @@ test('Should register a versioned route', t => {
|
|
|
35
35
|
'Accept-Version': '1.x'
|
|
36
36
|
}
|
|
37
37
|
}, (err, res) => {
|
|
38
|
-
t.
|
|
39
|
-
t.
|
|
40
|
-
t.
|
|
38
|
+
t.assert.ifError(err)
|
|
39
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
40
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
41
41
|
})
|
|
42
42
|
|
|
43
43
|
fastify.inject({
|
|
@@ -47,9 +47,9 @@ test('Should register a versioned route', t => {
|
|
|
47
47
|
'Accept-Version': '1.2.x'
|
|
48
48
|
}
|
|
49
49
|
}, (err, res) => {
|
|
50
|
-
t.
|
|
51
|
-
t.
|
|
52
|
-
t.
|
|
50
|
+
t.assert.ifError(err)
|
|
51
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
52
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
53
53
|
})
|
|
54
54
|
|
|
55
55
|
fastify.inject({
|
|
@@ -59,9 +59,9 @@ test('Should register a versioned route', t => {
|
|
|
59
59
|
'Accept-Version': '1.2.0'
|
|
60
60
|
}
|
|
61
61
|
}, (err, res) => {
|
|
62
|
-
t.
|
|
63
|
-
t.
|
|
64
|
-
t.
|
|
62
|
+
t.assert.ifError(err)
|
|
63
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
64
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
65
65
|
})
|
|
66
66
|
|
|
67
67
|
fastify.inject({
|
|
@@ -71,12 +71,13 @@ test('Should register a versioned route', t => {
|
|
|
71
71
|
'Accept-Version': '1.2.1'
|
|
72
72
|
}
|
|
73
73
|
}, (err, res) => {
|
|
74
|
-
t.
|
|
75
|
-
t.
|
|
74
|
+
t.assert.ifError(err)
|
|
75
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
76
|
+
done()
|
|
76
77
|
})
|
|
77
78
|
})
|
|
78
79
|
|
|
79
|
-
test('Should register a versioned route via route constraints', t => {
|
|
80
|
+
test('Should register a versioned route via route constraints', (t, done) => {
|
|
80
81
|
t.plan(6)
|
|
81
82
|
const fastify = Fastify()
|
|
82
83
|
|
|
@@ -96,9 +97,9 @@ test('Should register a versioned route via route constraints', t => {
|
|
|
96
97
|
'Accept-Version': '1.x'
|
|
97
98
|
}
|
|
98
99
|
}, (err, res) => {
|
|
99
|
-
t.
|
|
100
|
-
t.
|
|
101
|
-
t.
|
|
100
|
+
t.assert.ifError(err)
|
|
101
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
102
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
102
103
|
})
|
|
103
104
|
|
|
104
105
|
fastify.inject({
|
|
@@ -108,13 +109,14 @@ test('Should register a versioned route via route constraints', t => {
|
|
|
108
109
|
'Accept-Version': '1.2.x'
|
|
109
110
|
}
|
|
110
111
|
}, (err, res) => {
|
|
111
|
-
t.
|
|
112
|
-
t.
|
|
113
|
-
t.
|
|
112
|
+
t.assert.ifError(err)
|
|
113
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
114
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
115
|
+
done()
|
|
114
116
|
})
|
|
115
117
|
})
|
|
116
118
|
|
|
117
|
-
test('Should register the same route with different versions', t => {
|
|
119
|
+
test('Should register the same route with different versions', (t, done) => {
|
|
118
120
|
t.plan(8)
|
|
119
121
|
const fastify = Fastify()
|
|
120
122
|
|
|
@@ -143,9 +145,9 @@ test('Should register the same route with different versions', t => {
|
|
|
143
145
|
'Accept-Version': '1.x'
|
|
144
146
|
}
|
|
145
147
|
}, (err, res) => {
|
|
146
|
-
t.
|
|
147
|
-
t.
|
|
148
|
-
t.
|
|
148
|
+
t.assert.ifError(err)
|
|
149
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
150
|
+
t.assert.strictEqual(res.payload, '1.3.0')
|
|
149
151
|
})
|
|
150
152
|
|
|
151
153
|
fastify.inject({
|
|
@@ -155,9 +157,9 @@ test('Should register the same route with different versions', t => {
|
|
|
155
157
|
'Accept-Version': '1.2.x'
|
|
156
158
|
}
|
|
157
159
|
}, (err, res) => {
|
|
158
|
-
t.
|
|
159
|
-
t.
|
|
160
|
-
t.
|
|
160
|
+
t.assert.ifError(err)
|
|
161
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
162
|
+
t.assert.strictEqual(res.payload, '1.2.0')
|
|
161
163
|
})
|
|
162
164
|
|
|
163
165
|
fastify.inject({
|
|
@@ -167,12 +169,13 @@ test('Should register the same route with different versions', t => {
|
|
|
167
169
|
'Accept-Version': '2.x'
|
|
168
170
|
}
|
|
169
171
|
}, (err, res) => {
|
|
170
|
-
t.
|
|
171
|
-
t.
|
|
172
|
+
t.assert.ifError(err)
|
|
173
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
174
|
+
done()
|
|
172
175
|
})
|
|
173
176
|
})
|
|
174
177
|
|
|
175
|
-
test('The versioned route should take precedence', t => {
|
|
178
|
+
test('The versioned route should take precedence', (t, done) => {
|
|
176
179
|
t.plan(3)
|
|
177
180
|
const fastify = Fastify()
|
|
178
181
|
|
|
@@ -200,13 +203,14 @@ test('The versioned route should take precedence', t => {
|
|
|
200
203
|
'Accept-Version': '1.x'
|
|
201
204
|
}
|
|
202
205
|
}, (err, res) => {
|
|
203
|
-
t.
|
|
204
|
-
t.
|
|
205
|
-
t.
|
|
206
|
+
t.assert.ifError(err)
|
|
207
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
208
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
209
|
+
done()
|
|
206
210
|
})
|
|
207
211
|
})
|
|
208
212
|
|
|
209
|
-
test('Versioned route but not version header should return a 404', t => {
|
|
213
|
+
test('Versioned route but not version header should return a 404', (t, done) => {
|
|
210
214
|
t.plan(2)
|
|
211
215
|
const fastify = Fastify()
|
|
212
216
|
|
|
@@ -223,12 +227,13 @@ test('Versioned route but not version header should return a 404', t => {
|
|
|
223
227
|
method: 'GET',
|
|
224
228
|
url: '/'
|
|
225
229
|
}, (err, res) => {
|
|
226
|
-
t.
|
|
227
|
-
t.
|
|
230
|
+
t.assert.ifError(err)
|
|
231
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
232
|
+
done()
|
|
228
233
|
})
|
|
229
234
|
})
|
|
230
235
|
|
|
231
|
-
test('Should register a versioned route', t => {
|
|
236
|
+
test('Should register a versioned route (server)', (t, done) => {
|
|
232
237
|
t.plan(6)
|
|
233
238
|
const fastify = Fastify()
|
|
234
239
|
|
|
@@ -242,8 +247,8 @@ test('Should register a versioned route', t => {
|
|
|
242
247
|
})
|
|
243
248
|
|
|
244
249
|
fastify.listen({ port: 0 }, err => {
|
|
245
|
-
t.
|
|
246
|
-
t.
|
|
250
|
+
t.assert.ifError(err)
|
|
251
|
+
t.after(() => { fastify.close() })
|
|
247
252
|
|
|
248
253
|
sget({
|
|
249
254
|
method: 'GET',
|
|
@@ -252,25 +257,26 @@ test('Should register a versioned route', t => {
|
|
|
252
257
|
'Accept-Version': '1.x'
|
|
253
258
|
}
|
|
254
259
|
}, (err, response, body) => {
|
|
255
|
-
t.
|
|
256
|
-
t.
|
|
257
|
-
t.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
260
|
+
t.assert.ifError(err)
|
|
261
|
+
t.assert.strictEqual(response.statusCode, 200)
|
|
262
|
+
t.assert.deepStrictEqual(JSON.parse(body), { hello: 'world' })
|
|
263
|
+
|
|
264
|
+
sget({
|
|
265
|
+
method: 'GET',
|
|
266
|
+
url: 'http://localhost:' + fastify.server.address().port,
|
|
267
|
+
headers: {
|
|
268
|
+
'Accept-Version': '2.x'
|
|
269
|
+
}
|
|
270
|
+
}, (err, response, body) => {
|
|
271
|
+
t.assert.ifError(err)
|
|
272
|
+
t.assert.strictEqual(response.statusCode, 404)
|
|
273
|
+
done()
|
|
274
|
+
})
|
|
269
275
|
})
|
|
270
276
|
})
|
|
271
277
|
})
|
|
272
278
|
|
|
273
|
-
test('Shorthand route declaration', t => {
|
|
279
|
+
test('Shorthand route declaration', (t, done) => {
|
|
274
280
|
t.plan(5)
|
|
275
281
|
const fastify = Fastify()
|
|
276
282
|
|
|
@@ -285,9 +291,9 @@ test('Shorthand route declaration', t => {
|
|
|
285
291
|
'Accept-Version': '1.x'
|
|
286
292
|
}
|
|
287
293
|
}, (err, res) => {
|
|
288
|
-
t.
|
|
289
|
-
t.
|
|
290
|
-
t.
|
|
294
|
+
t.assert.ifError(err)
|
|
295
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
296
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
291
297
|
})
|
|
292
298
|
|
|
293
299
|
fastify.inject({
|
|
@@ -297,27 +303,28 @@ test('Shorthand route declaration', t => {
|
|
|
297
303
|
'Accept-Version': '1.2.1'
|
|
298
304
|
}
|
|
299
305
|
}, (err, res) => {
|
|
300
|
-
t.
|
|
301
|
-
t.
|
|
306
|
+
t.assert.ifError(err)
|
|
307
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
308
|
+
done()
|
|
302
309
|
})
|
|
303
310
|
})
|
|
304
311
|
|
|
305
|
-
test('The not found handler should not erase the Accept-Version header', t => {
|
|
312
|
+
test('The not found handler should not erase the Accept-Version header', (t, done) => {
|
|
306
313
|
t.plan(13)
|
|
307
314
|
const fastify = Fastify()
|
|
308
315
|
|
|
309
316
|
fastify.addHook('onRequest', function (req, reply, done) {
|
|
310
|
-
t.
|
|
317
|
+
t.assert.deepStrictEqual(req.headers['accept-version'], '2.x')
|
|
311
318
|
done()
|
|
312
319
|
})
|
|
313
320
|
|
|
314
321
|
fastify.addHook('preValidation', function (req, reply, done) {
|
|
315
|
-
t.
|
|
322
|
+
t.assert.deepStrictEqual(req.headers['accept-version'], '2.x')
|
|
316
323
|
done()
|
|
317
324
|
})
|
|
318
325
|
|
|
319
326
|
fastify.addHook('preHandler', function (req, reply, done) {
|
|
320
|
-
t.
|
|
327
|
+
t.assert.deepStrictEqual(req.headers['accept-version'], '2.x')
|
|
321
328
|
done()
|
|
322
329
|
})
|
|
323
330
|
|
|
@@ -331,14 +338,14 @@ test('The not found handler should not erase the Accept-Version header', t => {
|
|
|
331
338
|
})
|
|
332
339
|
|
|
333
340
|
fastify.setNotFoundHandler(function (req, reply) {
|
|
334
|
-
t.
|
|
341
|
+
t.assert.deepStrictEqual(req.headers['accept-version'], '2.x')
|
|
335
342
|
// we check if the symbol is exposed on key or not
|
|
336
343
|
for (const key in req.headers) {
|
|
337
|
-
t.
|
|
344
|
+
t.assert.deepStrictEqual(typeof key, 'string')
|
|
338
345
|
}
|
|
339
346
|
|
|
340
347
|
for (const key of Object.keys(req.headers)) {
|
|
341
|
-
t.
|
|
348
|
+
t.assert.deepStrictEqual(typeof key, 'string')
|
|
342
349
|
}
|
|
343
350
|
|
|
344
351
|
reply.code(404).send('not found handler')
|
|
@@ -351,13 +358,14 @@ test('The not found handler should not erase the Accept-Version header', t => {
|
|
|
351
358
|
'Accept-Version': '2.x'
|
|
352
359
|
}
|
|
353
360
|
}, (err, res) => {
|
|
354
|
-
t.
|
|
355
|
-
t.
|
|
356
|
-
t.
|
|
361
|
+
t.assert.ifError(err)
|
|
362
|
+
t.assert.deepStrictEqual(res.payload, 'not found handler')
|
|
363
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
364
|
+
done()
|
|
357
365
|
})
|
|
358
366
|
})
|
|
359
367
|
|
|
360
|
-
test('Bad accept version (inject)', t => {
|
|
368
|
+
test('Bad accept version (inject)', (t, done) => {
|
|
361
369
|
t.plan(4)
|
|
362
370
|
const fastify = Fastify()
|
|
363
371
|
|
|
@@ -377,8 +385,8 @@ test('Bad accept version (inject)', t => {
|
|
|
377
385
|
'Accept-Version': 'a.b.c'
|
|
378
386
|
}
|
|
379
387
|
}, (err, res) => {
|
|
380
|
-
t.
|
|
381
|
-
t.
|
|
388
|
+
t.assert.ifError(err)
|
|
389
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
382
390
|
})
|
|
383
391
|
|
|
384
392
|
fastify.inject({
|
|
@@ -388,12 +396,13 @@ test('Bad accept version (inject)', t => {
|
|
|
388
396
|
'Accept-Version': 12
|
|
389
397
|
}
|
|
390
398
|
}, (err, res) => {
|
|
391
|
-
t.
|
|
392
|
-
t.
|
|
399
|
+
t.assert.ifError(err)
|
|
400
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
401
|
+
done()
|
|
393
402
|
})
|
|
394
403
|
})
|
|
395
404
|
|
|
396
|
-
test('Bad accept version (server)', t => {
|
|
405
|
+
test('Bad accept version (server)', (t, done) => {
|
|
397
406
|
t.plan(5)
|
|
398
407
|
const fastify = Fastify()
|
|
399
408
|
|
|
@@ -407,8 +416,8 @@ test('Bad accept version (server)', t => {
|
|
|
407
416
|
})
|
|
408
417
|
|
|
409
418
|
fastify.listen({ port: 0 }, err => {
|
|
410
|
-
t.
|
|
411
|
-
t.
|
|
419
|
+
t.assert.ifError(err)
|
|
420
|
+
t.after(() => { fastify.close() })
|
|
412
421
|
|
|
413
422
|
sget({
|
|
414
423
|
method: 'GET',
|
|
@@ -417,24 +426,25 @@ test('Bad accept version (server)', t => {
|
|
|
417
426
|
'Accept-Version': 'a.b.c'
|
|
418
427
|
}
|
|
419
428
|
}, (err, response, body) => {
|
|
420
|
-
t.
|
|
421
|
-
t.
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
429
|
+
t.assert.ifError(err)
|
|
430
|
+
t.assert.strictEqual(response.statusCode, 404)
|
|
431
|
+
|
|
432
|
+
sget({
|
|
433
|
+
method: 'GET',
|
|
434
|
+
url: 'http://localhost:' + fastify.server.address().port,
|
|
435
|
+
headers: {
|
|
436
|
+
'Accept-Version': 12
|
|
437
|
+
}
|
|
438
|
+
}, (err, response, body) => {
|
|
439
|
+
t.assert.ifError(err)
|
|
440
|
+
t.assert.strictEqual(response.statusCode, 404)
|
|
441
|
+
done()
|
|
442
|
+
})
|
|
433
443
|
})
|
|
434
444
|
})
|
|
435
445
|
})
|
|
436
446
|
|
|
437
|
-
test('test log stream', t => {
|
|
447
|
+
test('test log stream', (t, done) => {
|
|
438
448
|
t.plan(3)
|
|
439
449
|
const stream = split(JSON.parse)
|
|
440
450
|
const fastify = Fastify({
|
|
@@ -449,8 +459,8 @@ test('test log stream', t => {
|
|
|
449
459
|
})
|
|
450
460
|
|
|
451
461
|
fastify.listen({ port: 0, host: localhost }, err => {
|
|
452
|
-
t.
|
|
453
|
-
t.
|
|
462
|
+
t.assert.ifError(err)
|
|
463
|
+
t.after(() => { fastify.close() })
|
|
454
464
|
|
|
455
465
|
http.get({
|
|
456
466
|
host: fastify.server.address().hostname,
|
|
@@ -464,16 +474,17 @@ test('test log stream', t => {
|
|
|
464
474
|
|
|
465
475
|
stream.once('data', listenAtLogLine => {
|
|
466
476
|
stream.once('data', line => {
|
|
467
|
-
t.
|
|
477
|
+
t.assert.strictEqual(line.req.version, '1.x')
|
|
468
478
|
stream.once('data', line => {
|
|
469
|
-
t.
|
|
479
|
+
t.assert.strictEqual(line.req.version, '1.x')
|
|
480
|
+
done()
|
|
470
481
|
})
|
|
471
482
|
})
|
|
472
483
|
})
|
|
473
484
|
})
|
|
474
485
|
})
|
|
475
486
|
|
|
476
|
-
test('Should register a versioned route with custom versioning strategy', t => {
|
|
487
|
+
test('Should register a versioned route with custom versioning strategy', (t, done) => {
|
|
477
488
|
t.plan(8)
|
|
478
489
|
|
|
479
490
|
const customVersioning = {
|
|
@@ -523,9 +534,9 @@ test('Should register a versioned route with custom versioning strategy', t => {
|
|
|
523
534
|
Accept: 'application/vnd.example.api+json;version=2'
|
|
524
535
|
}
|
|
525
536
|
}, (err, res) => {
|
|
526
|
-
t.
|
|
527
|
-
t.
|
|
528
|
-
t.
|
|
537
|
+
t.assert.ifError(err)
|
|
538
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from route v2' })
|
|
539
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
529
540
|
})
|
|
530
541
|
|
|
531
542
|
fastify.inject({
|
|
@@ -535,9 +546,9 @@ test('Should register a versioned route with custom versioning strategy', t => {
|
|
|
535
546
|
Accept: 'application/vnd.example.api+json;version=3'
|
|
536
547
|
}
|
|
537
548
|
}, (err, res) => {
|
|
538
|
-
t.
|
|
539
|
-
t.
|
|
540
|
-
t.
|
|
549
|
+
t.assert.ifError(err)
|
|
550
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from route v3' })
|
|
551
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
541
552
|
})
|
|
542
553
|
|
|
543
554
|
fastify.inject({
|
|
@@ -547,12 +558,13 @@ test('Should register a versioned route with custom versioning strategy', t => {
|
|
|
547
558
|
Accept: 'application/vnd.example.api+json;version=4'
|
|
548
559
|
}
|
|
549
560
|
}, (err, res) => {
|
|
550
|
-
t.
|
|
551
|
-
t.
|
|
561
|
+
t.assert.ifError(err)
|
|
562
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
563
|
+
done()
|
|
552
564
|
})
|
|
553
565
|
})
|
|
554
566
|
|
|
555
|
-
test('Vary header check (for documentation example)', t => {
|
|
567
|
+
test('Vary header check (for documentation example)', (t, done) => {
|
|
556
568
|
t.plan(8)
|
|
557
569
|
const fastify = Fastify()
|
|
558
570
|
fastify.addHook('onSend', async (req, reply) => {
|
|
@@ -589,19 +601,20 @@ test('Vary header check (for documentation example)', t => {
|
|
|
589
601
|
'Accept-Version': '1.x'
|
|
590
602
|
}
|
|
591
603
|
}, (err, res) => {
|
|
592
|
-
t.
|
|
593
|
-
t.
|
|
594
|
-
t.
|
|
595
|
-
t.
|
|
604
|
+
t.assert.ifError(err)
|
|
605
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
606
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
607
|
+
t.assert.strictEqual(res.headers.vary, 'Accept-Version')
|
|
596
608
|
})
|
|
597
609
|
|
|
598
610
|
fastify.inject({
|
|
599
611
|
method: 'GET',
|
|
600
612
|
url: '/'
|
|
601
613
|
}, (err, res) => {
|
|
602
|
-
t.
|
|
603
|
-
t.
|
|
604
|
-
t.
|
|
605
|
-
t.
|
|
614
|
+
t.assert.ifError(err)
|
|
615
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
616
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
617
|
+
t.assert.strictEqual(res.headers.vary, undefined)
|
|
618
|
+
done()
|
|
606
619
|
})
|
|
607
620
|
})
|