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,11 +1,10 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
const test = t.test
|
|
3
|
+
const { test } = require('node:test')
|
|
5
4
|
const Fastify = require('../fastify')
|
|
6
5
|
|
|
7
|
-
test('Should register a host constrained route', t => {
|
|
8
|
-
t.plan(
|
|
6
|
+
test('Should register a host constrained route', async t => {
|
|
7
|
+
t.plan(4)
|
|
9
8
|
const fastify = Fastify()
|
|
10
9
|
|
|
11
10
|
fastify.route({
|
|
@@ -17,40 +16,41 @@ test('Should register a host constrained route', t => {
|
|
|
17
16
|
}
|
|
18
17
|
})
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
t.
|
|
29
|
-
t.
|
|
30
|
-
}
|
|
19
|
+
{
|
|
20
|
+
const res = await fastify.inject({
|
|
21
|
+
method: 'GET',
|
|
22
|
+
url: '/',
|
|
23
|
+
headers: {
|
|
24
|
+
host: 'fastify.dev'
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'world' })
|
|
28
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
29
|
+
}
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
t.equal(res.statusCode, 404)
|
|
41
|
-
})
|
|
31
|
+
{
|
|
32
|
+
const res = await fastify.inject({
|
|
33
|
+
method: 'GET',
|
|
34
|
+
url: '/',
|
|
35
|
+
headers: {
|
|
36
|
+
host: 'example.com'
|
|
37
|
+
}
|
|
38
|
+
})
|
|
42
39
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
40
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
{
|
|
44
|
+
const res = await fastify.inject({
|
|
45
|
+
method: 'GET',
|
|
46
|
+
url: '/'
|
|
47
|
+
})
|
|
48
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
49
|
+
}
|
|
50
50
|
})
|
|
51
51
|
|
|
52
|
-
test('Should register the same route with host constraints', t => {
|
|
53
|
-
t.plan(
|
|
52
|
+
test('Should register the same route with host constraints', async t => {
|
|
53
|
+
t.plan(5)
|
|
54
54
|
const fastify = Fastify()
|
|
55
55
|
|
|
56
56
|
fastify.route({
|
|
@@ -71,44 +71,45 @@ test('Should register the same route with host constraints', t => {
|
|
|
71
71
|
}
|
|
72
72
|
})
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
t.
|
|
83
|
-
t.
|
|
84
|
-
}
|
|
74
|
+
{
|
|
75
|
+
const res = await fastify.inject({
|
|
76
|
+
method: 'GET',
|
|
77
|
+
url: '/',
|
|
78
|
+
headers: {
|
|
79
|
+
host: 'fastify.dev'
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
83
|
+
t.assert.strictEqual(res.payload, 'fastify.dev')
|
|
84
|
+
}
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
t.equal(res.statusCode, 200)
|
|
95
|
-
t.equal(res.payload, 'example.com')
|
|
96
|
-
})
|
|
86
|
+
{
|
|
87
|
+
const res = await fastify.inject({
|
|
88
|
+
method: 'GET',
|
|
89
|
+
url: '/',
|
|
90
|
+
headers: {
|
|
91
|
+
host: 'example.com'
|
|
92
|
+
}
|
|
93
|
+
})
|
|
97
94
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
95
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
96
|
+
t.assert.strictEqual(res.payload, 'example.com')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
{
|
|
100
|
+
const res = await fastify.inject({
|
|
101
|
+
method: 'GET',
|
|
102
|
+
url: '/',
|
|
103
|
+
headers: {
|
|
104
|
+
host: 'fancy.ca'
|
|
105
|
+
}
|
|
106
|
+
})
|
|
107
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
108
|
+
}
|
|
108
109
|
})
|
|
109
110
|
|
|
110
|
-
test('Should allow registering custom constrained routes', t => {
|
|
111
|
-
t.plan(
|
|
111
|
+
test('Should allow registering custom constrained routes', async t => {
|
|
112
|
+
t.plan(5)
|
|
112
113
|
|
|
113
114
|
const constraint = {
|
|
114
115
|
name: 'secret',
|
|
@@ -145,44 +146,44 @@ test('Should allow registering custom constrained routes', t => {
|
|
|
145
146
|
}
|
|
146
147
|
})
|
|
147
148
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
t.
|
|
157
|
-
t.
|
|
158
|
-
}
|
|
149
|
+
{
|
|
150
|
+
const res = await fastify.inject({
|
|
151
|
+
method: 'GET',
|
|
152
|
+
url: '/',
|
|
153
|
+
headers: {
|
|
154
|
+
'X-Secret': 'alpha'
|
|
155
|
+
}
|
|
156
|
+
})
|
|
157
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from alpha' })
|
|
158
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
159
|
+
}
|
|
159
160
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
t.
|
|
169
|
-
t.
|
|
170
|
-
}
|
|
161
|
+
{
|
|
162
|
+
const res = await fastify.inject({
|
|
163
|
+
method: 'GET',
|
|
164
|
+
url: '/',
|
|
165
|
+
headers: {
|
|
166
|
+
'X-Secret': 'beta'
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from beta' })
|
|
170
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
171
|
+
}
|
|
171
172
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
t.
|
|
181
|
-
}
|
|
173
|
+
{
|
|
174
|
+
const res = await fastify.inject({
|
|
175
|
+
method: 'GET',
|
|
176
|
+
url: '/',
|
|
177
|
+
headers: {
|
|
178
|
+
'X-Secret': 'gamma'
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
182
|
+
}
|
|
182
183
|
})
|
|
183
184
|
|
|
184
|
-
test('Should allow registering custom constrained routes outside constructor', t => {
|
|
185
|
-
t.plan(
|
|
185
|
+
test('Should allow registering custom constrained routes outside constructor', async t => {
|
|
186
|
+
t.plan(5)
|
|
186
187
|
|
|
187
188
|
const constraint = {
|
|
188
189
|
name: 'secret',
|
|
@@ -220,43 +221,44 @@ test('Should allow registering custom constrained routes outside constructor', t
|
|
|
220
221
|
}
|
|
221
222
|
})
|
|
222
223
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
t.same(JSON.parse(res.payload), { hello: 'from alpha' })
|
|
232
|
-
t.equal(res.statusCode, 200)
|
|
233
|
-
})
|
|
224
|
+
{
|
|
225
|
+
const res = await fastify.inject({
|
|
226
|
+
method: 'GET',
|
|
227
|
+
url: '/',
|
|
228
|
+
headers: {
|
|
229
|
+
'X-Secret': 'alpha'
|
|
230
|
+
}
|
|
231
|
+
})
|
|
234
232
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
headers: {
|
|
239
|
-
'X-Secret': 'beta'
|
|
240
|
-
}
|
|
241
|
-
}, (err, res) => {
|
|
242
|
-
t.error(err)
|
|
243
|
-
t.same(JSON.parse(res.payload), { hello: 'from beta' })
|
|
244
|
-
t.equal(res.statusCode, 200)
|
|
245
|
-
})
|
|
233
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from alpha' })
|
|
234
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
235
|
+
}
|
|
246
236
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
t.
|
|
256
|
-
|
|
237
|
+
{
|
|
238
|
+
const res = await fastify.inject({
|
|
239
|
+
method: 'GET',
|
|
240
|
+
url: '/',
|
|
241
|
+
headers: {
|
|
242
|
+
'X-Secret': 'beta'
|
|
243
|
+
}
|
|
244
|
+
})
|
|
245
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from beta' })
|
|
246
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
{
|
|
250
|
+
const res = await fastify.inject({
|
|
251
|
+
method: 'GET',
|
|
252
|
+
url: '/',
|
|
253
|
+
headers: {
|
|
254
|
+
'X-Secret': 'gamma'
|
|
255
|
+
}
|
|
256
|
+
})
|
|
257
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
258
|
+
}
|
|
257
259
|
})
|
|
258
260
|
|
|
259
|
-
test('Custom constrained routes registered also for HEAD method generated by fastify', t => {
|
|
261
|
+
test('Custom constrained routes registered also for HEAD method generated by fastify', (t, done) => {
|
|
260
262
|
t.plan(3)
|
|
261
263
|
|
|
262
264
|
const constraint = {
|
|
@@ -292,13 +294,14 @@ test('Custom constrained routes registered also for HEAD method generated by fas
|
|
|
292
294
|
'X-Secret': 'mySecret'
|
|
293
295
|
}
|
|
294
296
|
}, (err, res) => {
|
|
295
|
-
t.
|
|
296
|
-
t.
|
|
297
|
-
t.
|
|
297
|
+
t.assert.ifError(err)
|
|
298
|
+
t.assert.deepStrictEqual(res.headers['content-length'], '31')
|
|
299
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
300
|
+
done()
|
|
298
301
|
})
|
|
299
302
|
})
|
|
300
303
|
|
|
301
|
-
test('Custom constrained routes registered with addConstraintStrategy apply also for HEAD method generated by fastify', t => {
|
|
304
|
+
test('Custom constrained routes registered with addConstraintStrategy apply also for HEAD method generated by fastify', (t, done) => {
|
|
302
305
|
t.plan(3)
|
|
303
306
|
|
|
304
307
|
const constraint = {
|
|
@@ -335,13 +338,14 @@ test('Custom constrained routes registered with addConstraintStrategy apply also
|
|
|
335
338
|
'X-Secret': 'mySecret'
|
|
336
339
|
}
|
|
337
340
|
}, (err, res) => {
|
|
338
|
-
t.
|
|
339
|
-
t.
|
|
340
|
-
t.
|
|
341
|
+
t.assert.ifError(err)
|
|
342
|
+
t.assert.deepStrictEqual(res.headers['content-length'], '31')
|
|
343
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
344
|
+
done()
|
|
341
345
|
})
|
|
342
346
|
})
|
|
343
347
|
|
|
344
|
-
test('Add a constraint strategy after fastify instance was started', t => {
|
|
348
|
+
test('Add a constraint strategy after fastify instance was started', (t, done) => {
|
|
345
349
|
t.plan(4)
|
|
346
350
|
|
|
347
351
|
const constraint = {
|
|
@@ -371,14 +375,14 @@ test('Add a constraint strategy after fastify instance was started', t => {
|
|
|
371
375
|
method: 'GET',
|
|
372
376
|
url: '/'
|
|
373
377
|
}, (err, res) => {
|
|
374
|
-
t.
|
|
375
|
-
t.
|
|
376
|
-
t.
|
|
378
|
+
t.assert.ifError(err)
|
|
379
|
+
t.assert.deepStrictEqual(res.payload, 'ok')
|
|
380
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
377
381
|
|
|
378
|
-
t.throws(
|
|
379
|
-
() => fastify.addConstraintStrategy(constraint)
|
|
380
|
-
'Cannot add constraint strategy when fastify instance is already started!'
|
|
382
|
+
t.assert.throws(
|
|
383
|
+
() => fastify.addConstraintStrategy(constraint)
|
|
381
384
|
)
|
|
385
|
+
done()
|
|
382
386
|
})
|
|
383
387
|
})
|
|
384
388
|
|
|
@@ -403,9 +407,9 @@ test('Add a constraint strategy should throw an error if there already exist cus
|
|
|
403
407
|
const fastify = Fastify()
|
|
404
408
|
|
|
405
409
|
fastify.addConstraintStrategy(constraint)
|
|
406
|
-
t.throws(
|
|
410
|
+
t.assert.throws(
|
|
407
411
|
() => fastify.addConstraintStrategy(constraint),
|
|
408
|
-
|
|
412
|
+
/^Error: There already exists a custom constraint with the name secret.$/
|
|
409
413
|
)
|
|
410
414
|
})
|
|
411
415
|
|
|
@@ -430,7 +434,7 @@ test('Add a constraint strategy shouldn\'t throw an error if default constraint
|
|
|
430
434
|
const fastify = Fastify()
|
|
431
435
|
fastify.addConstraintStrategy(constraint)
|
|
432
436
|
|
|
433
|
-
t.
|
|
437
|
+
t.assert.ok(true)
|
|
434
438
|
})
|
|
435
439
|
|
|
436
440
|
test('Add a constraint strategy should throw an error if default constraint with the same name is used', t => {
|
|
@@ -462,9 +466,9 @@ test('Add a constraint strategy should throw an error if default constraint with
|
|
|
462
466
|
}
|
|
463
467
|
})
|
|
464
468
|
|
|
465
|
-
t.throws(
|
|
469
|
+
t.assert.throws(
|
|
466
470
|
() => fastify.addConstraintStrategy(constraint),
|
|
467
|
-
|
|
471
|
+
/^Error: There already exists a route with version constraint.$/
|
|
468
472
|
)
|
|
469
473
|
})
|
|
470
474
|
|
|
@@ -473,8 +477,8 @@ test('The hasConstraintStrategy should return false for default constraints unti
|
|
|
473
477
|
|
|
474
478
|
const fastify = Fastify()
|
|
475
479
|
|
|
476
|
-
t.
|
|
477
|
-
t.
|
|
480
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('version'), false)
|
|
481
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('host'), false)
|
|
478
482
|
|
|
479
483
|
fastify.route({
|
|
480
484
|
method: 'GET',
|
|
@@ -485,8 +489,8 @@ test('The hasConstraintStrategy should return false for default constraints unti
|
|
|
485
489
|
}
|
|
486
490
|
})
|
|
487
491
|
|
|
488
|
-
t.
|
|
489
|
-
t.
|
|
492
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('version'), false)
|
|
493
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('host'), true)
|
|
490
494
|
|
|
491
495
|
fastify.route({
|
|
492
496
|
method: 'GET',
|
|
@@ -497,8 +501,8 @@ test('The hasConstraintStrategy should return false for default constraints unti
|
|
|
497
501
|
}
|
|
498
502
|
})
|
|
499
503
|
|
|
500
|
-
t.
|
|
501
|
-
t.
|
|
504
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('version'), true)
|
|
505
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('host'), true)
|
|
502
506
|
})
|
|
503
507
|
|
|
504
508
|
test('The hasConstraintStrategy should return true if there already exist a custom constraint with the same name', t => {
|
|
@@ -521,13 +525,13 @@ test('The hasConstraintStrategy should return true if there already exist a cust
|
|
|
521
525
|
|
|
522
526
|
const fastify = Fastify()
|
|
523
527
|
|
|
524
|
-
t.
|
|
528
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('secret'), false)
|
|
525
529
|
fastify.addConstraintStrategy(constraint)
|
|
526
|
-
t.
|
|
530
|
+
t.assert.strictEqual(fastify.hasConstraintStrategy('secret'), true)
|
|
527
531
|
})
|
|
528
532
|
|
|
529
|
-
test('Should allow registering an unconstrained route after a constrained route', t => {
|
|
530
|
-
t.plan(
|
|
533
|
+
test('Should allow registering an unconstrained route after a constrained route', async t => {
|
|
534
|
+
t.plan(4)
|
|
531
535
|
const fastify = Fastify()
|
|
532
536
|
|
|
533
537
|
fastify.route({
|
|
@@ -547,32 +551,32 @@ test('Should allow registering an unconstrained route after a constrained route'
|
|
|
547
551
|
}
|
|
548
552
|
})
|
|
549
553
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
t.
|
|
559
|
-
t.
|
|
560
|
-
}
|
|
554
|
+
{
|
|
555
|
+
const res = await fastify.inject({
|
|
556
|
+
method: 'GET',
|
|
557
|
+
url: '/',
|
|
558
|
+
headers: {
|
|
559
|
+
host: 'fastify.dev'
|
|
560
|
+
}
|
|
561
|
+
})
|
|
562
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from fastify.dev' })
|
|
563
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
564
|
+
}
|
|
561
565
|
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
t.
|
|
571
|
-
t.
|
|
572
|
-
}
|
|
566
|
+
{
|
|
567
|
+
const res = await fastify.inject({
|
|
568
|
+
method: 'GET',
|
|
569
|
+
url: '/',
|
|
570
|
+
headers: {
|
|
571
|
+
host: 'example.com'
|
|
572
|
+
}
|
|
573
|
+
})
|
|
574
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from any other domain' })
|
|
575
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
576
|
+
}
|
|
573
577
|
})
|
|
574
578
|
|
|
575
|
-
test('Should allow registering constrained routes in a prefixed plugin', t => {
|
|
579
|
+
test('Should allow registering constrained routes in a prefixed plugin', (t, done) => {
|
|
576
580
|
t.plan(3)
|
|
577
581
|
|
|
578
582
|
const fastify = Fastify()
|
|
@@ -595,13 +599,14 @@ test('Should allow registering constrained routes in a prefixed plugin', t => {
|
|
|
595
599
|
host: 'fastify.dev'
|
|
596
600
|
}
|
|
597
601
|
}, (err, res) => {
|
|
598
|
-
t.
|
|
599
|
-
t.
|
|
600
|
-
t.
|
|
602
|
+
t.assert.ifError(err)
|
|
603
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { ok: true })
|
|
604
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
605
|
+
done()
|
|
601
606
|
})
|
|
602
607
|
})
|
|
603
608
|
|
|
604
|
-
test('Should allow registering a constrained GET route after a constrained HEAD route', t => {
|
|
609
|
+
test('Should allow registering a constrained GET route after a constrained HEAD route', (t, done) => {
|
|
605
610
|
t.plan(3)
|
|
606
611
|
const fastify = Fastify()
|
|
607
612
|
|
|
@@ -631,13 +636,14 @@ test('Should allow registering a constrained GET route after a constrained HEAD
|
|
|
631
636
|
host: 'fastify.dev'
|
|
632
637
|
}
|
|
633
638
|
}, (err, res) => {
|
|
634
|
-
t.
|
|
635
|
-
t.
|
|
636
|
-
t.
|
|
639
|
+
t.assert.ifError(err)
|
|
640
|
+
t.assert.deepStrictEqual(res.payload, 'custom HEAD response')
|
|
641
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
642
|
+
done()
|
|
637
643
|
})
|
|
638
644
|
})
|
|
639
645
|
|
|
640
|
-
test('Should allow registering a constrained GET route after an unconstrained HEAD route', t => {
|
|
646
|
+
test('Should allow registering a constrained GET route after an unconstrained HEAD route', (t, done) => {
|
|
641
647
|
t.plan(3)
|
|
642
648
|
const fastify = Fastify()
|
|
643
649
|
|
|
@@ -667,9 +673,10 @@ test('Should allow registering a constrained GET route after an unconstrained HE
|
|
|
667
673
|
host: 'fastify.dev'
|
|
668
674
|
}
|
|
669
675
|
}, (err, res) => {
|
|
670
|
-
t.
|
|
671
|
-
t.
|
|
672
|
-
t.
|
|
676
|
+
t.assert.ifError(err)
|
|
677
|
+
t.assert.deepStrictEqual(res.headers['content-length'], '41')
|
|
678
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
679
|
+
done()
|
|
673
680
|
})
|
|
674
681
|
})
|
|
675
682
|
|
|
@@ -702,7 +709,7 @@ test('Will not try to re-createprefixed HEAD route if it already exists and expo
|
|
|
702
709
|
|
|
703
710
|
await fastify.ready()
|
|
704
711
|
|
|
705
|
-
t.ok(true)
|
|
712
|
+
t.assert.ok(true)
|
|
706
713
|
})
|
|
707
714
|
|
|
708
715
|
test('allows separate constrained and unconstrained HEAD routes', async (t) => {
|
|
@@ -744,7 +751,7 @@ test('allows separate constrained and unconstrained HEAD routes', async (t) => {
|
|
|
744
751
|
|
|
745
752
|
await fastify.ready()
|
|
746
753
|
|
|
747
|
-
t.ok(true)
|
|
754
|
+
t.assert.ok(true)
|
|
748
755
|
})
|
|
749
756
|
|
|
750
757
|
test('allow async constraints', async (t) => {
|
|
@@ -787,17 +794,17 @@ test('allow async constraints', async (t) => {
|
|
|
787
794
|
|
|
788
795
|
{
|
|
789
796
|
const { statusCode, payload } = await fastify.inject({ method: 'GET', path: '/', headers: { 'X-Secret': 'alpha' } })
|
|
790
|
-
t.
|
|
791
|
-
t.
|
|
797
|
+
t.assert.deepStrictEqual(JSON.parse(payload), { hello: 'from alpha' })
|
|
798
|
+
t.assert.strictEqual(statusCode, 200)
|
|
792
799
|
}
|
|
793
800
|
{
|
|
794
801
|
const { statusCode, payload } = await fastify.inject({ method: 'GET', path: '/', headers: { 'X-Secret': 'beta' } })
|
|
795
|
-
t.
|
|
796
|
-
t.
|
|
802
|
+
t.assert.deepStrictEqual(JSON.parse(payload), { hello: 'from beta' })
|
|
803
|
+
t.assert.strictEqual(statusCode, 200)
|
|
797
804
|
}
|
|
798
805
|
{
|
|
799
806
|
const { statusCode } = await fastify.inject({ method: 'GET', path: '/', headers: { 'X-Secret': 'gamma' } })
|
|
800
|
-
t.
|
|
807
|
+
t.assert.strictEqual(statusCode, 404)
|
|
801
808
|
}
|
|
802
809
|
})
|
|
803
810
|
|
|
@@ -841,28 +848,28 @@ test('error in async constraints', async (t) => {
|
|
|
841
848
|
|
|
842
849
|
{
|
|
843
850
|
const { statusCode, payload } = await fastify.inject({ method: 'GET', path: '/', headers: { 'X-Secret': 'alpha' } })
|
|
844
|
-
t.
|
|
845
|
-
t.
|
|
851
|
+
t.assert.deepStrictEqual(JSON.parse(payload), { error: 'Internal Server Error', message: 'Unexpected error from async constraint', statusCode: 500 })
|
|
852
|
+
t.assert.strictEqual(statusCode, 500)
|
|
846
853
|
}
|
|
847
854
|
{
|
|
848
855
|
const { statusCode, payload } = await fastify.inject({ method: 'GET', path: '/', headers: { 'X-Secret': 'beta' } })
|
|
849
|
-
t.
|
|
850
|
-
t.
|
|
856
|
+
t.assert.deepStrictEqual(JSON.parse(payload), { error: 'Internal Server Error', message: 'Unexpected error from async constraint', statusCode: 500 })
|
|
857
|
+
t.assert.strictEqual(statusCode, 500)
|
|
851
858
|
}
|
|
852
859
|
{
|
|
853
860
|
const { statusCode, payload } = await fastify.inject({ method: 'GET', path: '/', headers: { 'X-Secret': 'gamma' } })
|
|
854
|
-
t.
|
|
855
|
-
t.
|
|
861
|
+
t.assert.deepStrictEqual(JSON.parse(payload), { error: 'Internal Server Error', message: 'Unexpected error from async constraint', statusCode: 500 })
|
|
862
|
+
t.assert.strictEqual(statusCode, 500)
|
|
856
863
|
}
|
|
857
864
|
{
|
|
858
865
|
const { statusCode, payload } = await fastify.inject({ method: 'GET', path: '/' })
|
|
859
|
-
t.
|
|
860
|
-
t.
|
|
866
|
+
t.assert.deepStrictEqual(JSON.parse(payload), { error: 'Internal Server Error', message: 'Unexpected error from async constraint', statusCode: 500 })
|
|
867
|
+
t.assert.strictEqual(statusCode, 500)
|
|
861
868
|
}
|
|
862
869
|
})
|
|
863
870
|
|
|
864
|
-
test('Allow regex constraints in routes', t => {
|
|
865
|
-
t.plan(
|
|
871
|
+
test('Allow regex constraints in routes', async t => {
|
|
872
|
+
t.plan(3)
|
|
866
873
|
|
|
867
874
|
const fastify = Fastify()
|
|
868
875
|
|
|
@@ -875,26 +882,26 @@ test('Allow regex constraints in routes', t => {
|
|
|
875
882
|
}
|
|
876
883
|
})
|
|
877
884
|
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
t.
|
|
887
|
-
t.
|
|
888
|
-
}
|
|
885
|
+
{
|
|
886
|
+
const res = await fastify.inject({
|
|
887
|
+
method: 'GET',
|
|
888
|
+
url: '/',
|
|
889
|
+
headers: {
|
|
890
|
+
host: 'dev.fastify.dev'
|
|
891
|
+
}
|
|
892
|
+
})
|
|
893
|
+
t.assert.deepStrictEqual(JSON.parse(res.payload), { hello: 'from fastify dev domain' })
|
|
894
|
+
t.assert.strictEqual(res.statusCode, 200)
|
|
895
|
+
}
|
|
889
896
|
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
t.
|
|
899
|
-
}
|
|
897
|
+
{
|
|
898
|
+
const res = await fastify.inject({
|
|
899
|
+
method: 'GET',
|
|
900
|
+
url: '/',
|
|
901
|
+
headers: {
|
|
902
|
+
host: 'google.com'
|
|
903
|
+
}
|
|
904
|
+
})
|
|
905
|
+
t.assert.strictEqual(res.statusCode, 404)
|
|
906
|
+
}
|
|
900
907
|
})
|