node-fastify 5.8.3
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/.markdownlint-cli2.yaml +22 -0
- package/.prettierignore +1 -0
- package/GOVERNANCE.md +4 -0
- package/LICENSE +21 -0
- package/PROJECT_CHARTER.md +126 -0
- package/README.md +423 -0
- package/SECURITY.md +220 -0
- package/SPONSORS.md +24 -0
- package/build/build-error-serializer.js +35 -0
- package/build/build-validation.js +169 -0
- package/build/sync-version.js +11 -0
- package/docs/Guides/Benchmarking.md +60 -0
- package/docs/Guides/Database.md +321 -0
- package/docs/Guides/Delay-Accepting-Requests.md +608 -0
- package/docs/Guides/Detecting-When-Clients-Abort.md +172 -0
- package/docs/Guides/Ecosystem.md +726 -0
- package/docs/Guides/Fluent-Schema.md +127 -0
- package/docs/Guides/Getting-Started.md +620 -0
- package/docs/Guides/Index.md +43 -0
- package/docs/Guides/Migration-Guide-V3.md +287 -0
- package/docs/Guides/Migration-Guide-V4.md +267 -0
- package/docs/Guides/Migration-Guide-V5.md +727 -0
- package/docs/Guides/Plugins-Guide.md +520 -0
- package/docs/Guides/Prototype-Poisoning.md +383 -0
- package/docs/Guides/Recommendations.md +378 -0
- package/docs/Guides/Serverless.md +604 -0
- package/docs/Guides/Style-Guide.md +246 -0
- package/docs/Guides/Testing.md +481 -0
- package/docs/Guides/Write-Plugin.md +103 -0
- package/docs/Guides/Write-Type-Provider.md +34 -0
- package/docs/Reference/ContentTypeParser.md +271 -0
- package/docs/Reference/Decorators.md +436 -0
- package/docs/Reference/Encapsulation.md +194 -0
- package/docs/Reference/Errors.md +377 -0
- package/docs/Reference/HTTP2.md +94 -0
- package/docs/Reference/Hooks.md +958 -0
- package/docs/Reference/Index.md +73 -0
- package/docs/Reference/LTS.md +86 -0
- package/docs/Reference/Lifecycle.md +99 -0
- package/docs/Reference/Logging.md +268 -0
- package/docs/Reference/Middleware.md +79 -0
- package/docs/Reference/Plugins.md +245 -0
- package/docs/Reference/Principles.md +73 -0
- package/docs/Reference/Reply.md +1001 -0
- package/docs/Reference/Request.md +295 -0
- package/docs/Reference/Routes.md +802 -0
- package/docs/Reference/Server.md +2389 -0
- package/docs/Reference/Type-Providers.md +256 -0
- package/docs/Reference/TypeScript.md +1729 -0
- package/docs/Reference/Validation-and-Serialization.md +1130 -0
- package/docs/Reference/Warnings.md +58 -0
- package/docs/index.md +24 -0
- package/docs/resources/encapsulation_context.drawio +1 -0
- package/docs/resources/encapsulation_context.svg +3 -0
- package/eslint.config.js +35 -0
- package/examples/asyncawait.js +38 -0
- package/examples/benchmark/body.json +3 -0
- package/examples/benchmark/hooks-benchmark-async-await.js +44 -0
- package/examples/benchmark/hooks-benchmark.js +52 -0
- package/examples/benchmark/parser.js +47 -0
- package/examples/benchmark/simple.js +30 -0
- package/examples/benchmark/webstream.js +27 -0
- package/examples/hooks.js +91 -0
- package/examples/http2.js +39 -0
- package/examples/https.js +38 -0
- package/examples/parser.js +53 -0
- package/examples/plugin.js +12 -0
- package/examples/route-prefix.js +38 -0
- package/examples/shared-schema.js +38 -0
- package/examples/simple-stream.js +20 -0
- package/examples/simple.js +32 -0
- package/examples/simple.mjs +27 -0
- package/examples/typescript-server.ts +79 -0
- package/examples/use-plugin.js +29 -0
- package/fastify.d.ts +253 -0
- package/fastify.js +985 -0
- package/integration/server.js +29 -0
- package/integration/test.sh +23 -0
- package/lib/config-validator.js +1266 -0
- package/lib/content-type-parser.js +413 -0
- package/lib/content-type.js +160 -0
- package/lib/context.js +98 -0
- package/lib/decorate.js +152 -0
- package/lib/error-handler.js +173 -0
- package/lib/error-serializer.js +134 -0
- package/lib/error-status.js +14 -0
- package/lib/errors.js +516 -0
- package/lib/four-oh-four.js +190 -0
- package/lib/handle-request.js +195 -0
- package/lib/head-route.js +45 -0
- package/lib/hooks.js +429 -0
- package/lib/initial-config-validation.js +37 -0
- package/lib/logger-factory.js +136 -0
- package/lib/logger-pino.js +68 -0
- package/lib/noop-set.js +10 -0
- package/lib/plugin-override.js +90 -0
- package/lib/plugin-utils.js +169 -0
- package/lib/promise.js +23 -0
- package/lib/reply.js +1030 -0
- package/lib/req-id-gen-factory.js +52 -0
- package/lib/request.js +391 -0
- package/lib/route.js +686 -0
- package/lib/schema-controller.js +164 -0
- package/lib/schemas.js +207 -0
- package/lib/server.js +441 -0
- package/lib/symbols.js +71 -0
- package/lib/validation.js +280 -0
- package/lib/warnings.js +57 -0
- package/lib/wrap-thenable.js +84 -0
- package/package.json +225 -0
- package/scripts/validate-ecosystem-links.js +179 -0
- package/test/404s.test.js +2035 -0
- package/test/500s.test.js +422 -0
- package/test/allow-unsafe-regex.test.js +92 -0
- package/test/als.test.js +65 -0
- package/test/async-await.test.js +705 -0
- package/test/async-dispose.test.js +20 -0
- package/test/async_hooks.test.js +52 -0
- package/test/body-limit.test.js +224 -0
- package/test/buffer.test.js +74 -0
- package/test/build/error-serializer.test.js +36 -0
- package/test/build/version.test.js +14 -0
- package/test/build-certificate.js +109 -0
- package/test/bundler/README.md +29 -0
- package/test/bundler/esbuild/bundler-test.js +32 -0
- package/test/bundler/esbuild/package.json +10 -0
- package/test/bundler/esbuild/src/fail-plugin-version.js +14 -0
- package/test/bundler/esbuild/src/index.js +9 -0
- package/test/bundler/webpack/bundler-test.js +32 -0
- package/test/bundler/webpack/package.json +11 -0
- package/test/bundler/webpack/src/fail-plugin-version.js +14 -0
- package/test/bundler/webpack/src/index.js +9 -0
- package/test/bundler/webpack/webpack.config.js +15 -0
- package/test/case-insensitive.test.js +102 -0
- package/test/chainable.test.js +40 -0
- package/test/child-logger-factory.test.js +128 -0
- package/test/client-timeout.test.js +38 -0
- package/test/close-pipelining.test.js +78 -0
- package/test/close.test.js +706 -0
- package/test/conditional-pino.test.js +47 -0
- package/test/connection-timeout.test.js +42 -0
- package/test/constrained-routes.test.js +1138 -0
- package/test/content-length.test.js +174 -0
- package/test/content-parser.test.js +739 -0
- package/test/content-type.test.js +181 -0
- package/test/context-config.test.js +164 -0
- package/test/custom-http-server.test.js +118 -0
- package/test/custom-parser-async.test.js +59 -0
- package/test/custom-parser.0.test.js +701 -0
- package/test/custom-parser.1.test.js +266 -0
- package/test/custom-parser.2.test.js +91 -0
- package/test/custom-parser.3.test.js +208 -0
- package/test/custom-parser.4.test.js +218 -0
- package/test/custom-parser.5.test.js +130 -0
- package/test/custom-querystring-parser.test.js +129 -0
- package/test/decorator.test.js +1330 -0
- package/test/delete.test.js +344 -0
- package/test/diagnostics-channel/404.test.js +49 -0
- package/test/diagnostics-channel/async-delay-request.test.js +65 -0
- package/test/diagnostics-channel/async-request.test.js +64 -0
- package/test/diagnostics-channel/error-before-handler.test.js +35 -0
- package/test/diagnostics-channel/error-request.test.js +53 -0
- package/test/diagnostics-channel/error-status.test.js +123 -0
- package/test/diagnostics-channel/init.test.js +50 -0
- package/test/diagnostics-channel/sync-delay-request.test.js +49 -0
- package/test/diagnostics-channel/sync-request-reply.test.js +51 -0
- package/test/diagnostics-channel/sync-request.test.js +54 -0
- package/test/encapsulated-child-logger-factory.test.js +69 -0
- package/test/encapsulated-error-handler.test.js +237 -0
- package/test/esm/errorCodes.test.mjs +10 -0
- package/test/esm/esm.test.mjs +13 -0
- package/test/esm/index.test.js +8 -0
- package/test/esm/named-exports.mjs +14 -0
- package/test/esm/other.mjs +8 -0
- package/test/esm/plugin.mjs +8 -0
- package/test/fastify-instance.test.js +300 -0
- package/test/find-route.test.js +152 -0
- package/test/fluent-schema.test.js +209 -0
- package/test/genReqId.test.js +426 -0
- package/test/handler-context.test.js +45 -0
- package/test/handler-timeout.test.js +367 -0
- package/test/has-route.test.js +88 -0
- package/test/header-overflow.test.js +55 -0
- package/test/helper.js +496 -0
- package/test/hooks-async.test.js +1099 -0
- package/test/hooks.on-listen.test.js +1162 -0
- package/test/hooks.on-ready.test.js +421 -0
- package/test/hooks.test.js +3578 -0
- package/test/http-methods/copy.test.js +35 -0
- package/test/http-methods/custom-http-methods.test.js +114 -0
- package/test/http-methods/get.test.js +412 -0
- package/test/http-methods/head.test.js +263 -0
- package/test/http-methods/lock.test.js +108 -0
- package/test/http-methods/mkcalendar.test.js +143 -0
- package/test/http-methods/mkcol.test.js +35 -0
- package/test/http-methods/move.test.js +42 -0
- package/test/http-methods/propfind.test.js +136 -0
- package/test/http-methods/proppatch.test.js +105 -0
- package/test/http-methods/report.test.js +142 -0
- package/test/http-methods/search.test.js +233 -0
- package/test/http-methods/trace.test.js +21 -0
- package/test/http-methods/unlock.test.js +38 -0
- package/test/http2/closing.test.js +270 -0
- package/test/http2/constraint.test.js +109 -0
- package/test/http2/head.test.js +34 -0
- package/test/http2/plain.test.js +68 -0
- package/test/http2/secure-with-fallback.test.js +113 -0
- package/test/http2/secure.test.js +67 -0
- package/test/http2/unknown-http-method.test.js +34 -0
- package/test/https/custom-https-server.test.js +58 -0
- package/test/https/https.test.js +136 -0
- package/test/imports.test.js +17 -0
- package/test/inject.test.js +502 -0
- package/test/input-validation.js +335 -0
- package/test/internals/all.test.js +38 -0
- package/test/internals/content-type-parser.test.js +111 -0
- package/test/internals/context.test.js +31 -0
- package/test/internals/decorator.test.js +156 -0
- package/test/internals/errors.test.js +982 -0
- package/test/internals/handle-request.test.js +270 -0
- package/test/internals/hook-runner.test.js +449 -0
- package/test/internals/hooks.test.js +96 -0
- package/test/internals/initial-config.test.js +383 -0
- package/test/internals/logger.test.js +163 -0
- package/test/internals/plugin.test.js +170 -0
- package/test/internals/promise.test.js +63 -0
- package/test/internals/reply-serialize.test.js +714 -0
- package/test/internals/reply.test.js +1920 -0
- package/test/internals/req-id-gen-factory.test.js +133 -0
- package/test/internals/request-validate.test.js +1402 -0
- package/test/internals/request.test.js +506 -0
- package/test/internals/schema-controller-perf.test.js +40 -0
- package/test/internals/server.test.js +91 -0
- package/test/internals/validation.test.js +352 -0
- package/test/issue-4959.test.js +118 -0
- package/test/keep-alive-timeout.test.js +42 -0
- package/test/listen.1.test.js +154 -0
- package/test/listen.2.test.js +113 -0
- package/test/listen.3.test.js +83 -0
- package/test/listen.4.test.js +168 -0
- package/test/listen.5.test.js +122 -0
- package/test/logger/instantiation.test.js +341 -0
- package/test/logger/logger-test-utils.js +47 -0
- package/test/logger/logging.test.js +460 -0
- package/test/logger/options.test.js +579 -0
- package/test/logger/request.test.js +292 -0
- package/test/logger/response.test.js +183 -0
- package/test/logger/tap-parallel-not-ok +0 -0
- package/test/max-requests-per-socket.test.js +113 -0
- package/test/middleware.test.js +37 -0
- package/test/noop-set.test.js +19 -0
- package/test/nullable-validation.test.js +187 -0
- package/test/options.error-handler.test.js +5 -0
- package/test/options.test.js +5 -0
- package/test/output-validation.test.js +140 -0
- package/test/patch.error-handler.test.js +5 -0
- package/test/patch.test.js +5 -0
- package/test/plugin.1.test.js +230 -0
- package/test/plugin.2.test.js +314 -0
- package/test/plugin.3.test.js +287 -0
- package/test/plugin.4.test.js +504 -0
- package/test/plugin.helper.js +8 -0
- package/test/plugin.name.display.js +10 -0
- package/test/post-empty-body.test.js +38 -0
- package/test/pretty-print.test.js +366 -0
- package/test/promises.test.js +125 -0
- package/test/proto-poisoning.test.js +145 -0
- package/test/put.error-handler.test.js +5 -0
- package/test/put.test.js +5 -0
- package/test/register.test.js +184 -0
- package/test/reply-code.test.js +148 -0
- package/test/reply-early-hints.test.js +100 -0
- package/test/reply-error.test.js +815 -0
- package/test/reply-trailers.test.js +445 -0
- package/test/reply-web-stream-locked.test.js +37 -0
- package/test/request-error.test.js +624 -0
- package/test/request-header-host.test.js +339 -0
- package/test/request-id.test.js +118 -0
- package/test/request-timeout.test.js +53 -0
- package/test/route-hooks.test.js +635 -0
- package/test/route-prefix.test.js +904 -0
- package/test/route-shorthand.test.js +48 -0
- package/test/route.1.test.js +259 -0
- package/test/route.2.test.js +100 -0
- package/test/route.3.test.js +213 -0
- package/test/route.4.test.js +127 -0
- package/test/route.5.test.js +211 -0
- package/test/route.6.test.js +306 -0
- package/test/route.7.test.js +406 -0
- package/test/route.8.test.js +225 -0
- package/test/router-options.test.js +1108 -0
- package/test/same-shape.test.js +124 -0
- package/test/schema-examples.test.js +661 -0
- package/test/schema-feature.test.js +2198 -0
- package/test/schema-serialization.test.js +1171 -0
- package/test/schema-special-usage.test.js +1348 -0
- package/test/schema-validation.test.js +1572 -0
- package/test/scripts/validate-ecosystem-links.test.js +339 -0
- package/test/serialize-response.test.js +186 -0
- package/test/server.test.js +347 -0
- package/test/set-error-handler.test.js +69 -0
- package/test/skip-reply-send.test.js +317 -0
- package/test/stream-serializers.test.js +40 -0
- package/test/stream.1.test.js +94 -0
- package/test/stream.2.test.js +129 -0
- package/test/stream.3.test.js +198 -0
- package/test/stream.4.test.js +176 -0
- package/test/stream.5.test.js +188 -0
- package/test/sync-routes.test.js +32 -0
- package/test/throw.test.js +359 -0
- package/test/toolkit.js +63 -0
- package/test/trust-proxy.test.js +162 -0
- package/test/type-provider.test.js +22 -0
- package/test/types/content-type-parser.test-d.ts +72 -0
- package/test/types/decorate-request-reply.test-d.ts +18 -0
- package/test/types/dummy-plugin.ts +9 -0
- package/test/types/errors.test-d.ts +90 -0
- package/test/types/fastify.test-d.ts +352 -0
- package/test/types/hooks.test-d.ts +550 -0
- package/test/types/import.ts +2 -0
- package/test/types/instance.test-d.ts +588 -0
- package/test/types/logger.test-d.ts +277 -0
- package/test/types/plugin.test-d.ts +97 -0
- package/test/types/register.test-d.ts +237 -0
- package/test/types/reply.test-d.ts +254 -0
- package/test/types/request.test-d.ts +188 -0
- package/test/types/route.test-d.ts +553 -0
- package/test/types/schema.test-d.ts +135 -0
- package/test/types/serverFactory.test-d.ts +37 -0
- package/test/types/type-provider.test-d.ts +1213 -0
- package/test/types/using.test-d.ts +17 -0
- package/test/upgrade.test.js +52 -0
- package/test/url-rewriting.test.js +122 -0
- package/test/use-semicolon-delimiter.test.js +168 -0
- package/test/validation-error-handling.test.js +900 -0
- package/test/versioned-routes.test.js +603 -0
- package/test/web-api.test.js +616 -0
- package/test/wrap-thenable.test.js +30 -0
- package/types/content-type-parser.d.ts +75 -0
- package/types/context.d.ts +22 -0
- package/types/errors.d.ts +92 -0
- package/types/hooks.d.ts +875 -0
- package/types/instance.d.ts +609 -0
- package/types/logger.d.ts +107 -0
- package/types/plugin.d.ts +44 -0
- package/types/register.d.ts +42 -0
- package/types/reply.d.ts +81 -0
- package/types/request.d.ts +95 -0
- package/types/route.d.ts +199 -0
- package/types/schema.d.ts +61 -0
- package/types/server-factory.d.ts +19 -0
- package/types/type-provider.d.ts +130 -0
- package/types/utils.d.ts +98 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Fastify Style Guide
|
|
2
|
+
|
|
3
|
+
## Welcome
|
|
4
|
+
|
|
5
|
+
Welcome to *Fastify Style Guide*. This guide is here to provide you with a
|
|
6
|
+
conventional writing style for users writing developer documentation on our Open
|
|
7
|
+
Source framework. Each topic is precise and well explained to help you write
|
|
8
|
+
documentation users can easily understand and implement.
|
|
9
|
+
|
|
10
|
+
## Who is this guide for?
|
|
11
|
+
|
|
12
|
+
This guide is for anyone who loves to build with Fastify or wants to contribute
|
|
13
|
+
to our documentation. You do not need to be an expert in writing technical
|
|
14
|
+
documentation. This guide is here to help you.
|
|
15
|
+
|
|
16
|
+
Visit the [contribute](https://fastify.dev/contribute) page on our website or
|
|
17
|
+
read the
|
|
18
|
+
[CONTRIBUTING.md](https://github.com/fastify/fastify/blob/main/CONTRIBUTING.md)
|
|
19
|
+
file on GitHub to join our Open Source folks.
|
|
20
|
+
|
|
21
|
+
## Before you write
|
|
22
|
+
|
|
23
|
+
You need to know the following:
|
|
24
|
+
|
|
25
|
+
* JavaScript
|
|
26
|
+
* Node.js
|
|
27
|
+
* Git
|
|
28
|
+
* GitHub
|
|
29
|
+
* Markdown
|
|
30
|
+
* HTTP
|
|
31
|
+
* NPM
|
|
32
|
+
|
|
33
|
+
### Consider your Audience
|
|
34
|
+
|
|
35
|
+
Before you start writing, think about your audience. In this case, your audience
|
|
36
|
+
should already know HTTP, JavaScript, NPM, and Node.js. It is necessary to keep
|
|
37
|
+
your readers in mind because they are the ones consuming your content. You want
|
|
38
|
+
to give as much useful information as possible. Consider the vital things they
|
|
39
|
+
need to know and how they can understand them. Use words and references that
|
|
40
|
+
readers can relate to easily. Ask for feedback from the community, it can help
|
|
41
|
+
you write better documentation that focuses on the user and what you want to
|
|
42
|
+
achieve.
|
|
43
|
+
|
|
44
|
+
### Get straight to the point
|
|
45
|
+
|
|
46
|
+
Give your readers a clear and precise action to take. Start with what is most
|
|
47
|
+
important. This way, you can help them find what they need faster. Mostly,
|
|
48
|
+
readers tend to read the first content on a page, and many will not scroll
|
|
49
|
+
further.
|
|
50
|
+
|
|
51
|
+
**Example**
|
|
52
|
+
|
|
53
|
+
Less like this: Colons are very important to register a parametric path. It lets
|
|
54
|
+
the framework know there is a new parameter created. You can place the colon
|
|
55
|
+
before the parameter name so the parametric path can be created.
|
|
56
|
+
|
|
57
|
+
More Like this: To register a parametric path, put a colon before the parameter
|
|
58
|
+
name. Using a colon lets the framework know it is a parametric path and not a
|
|
59
|
+
static path.
|
|
60
|
+
|
|
61
|
+
### Avoid adding video or image content
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
Do not add videos or screenshots to the documentation. It is easier to keep
|
|
65
|
+
under version control. Videos and images will eventually end up becoming
|
|
66
|
+
outdated as new updates keep developing. Instead, make a referral link or a
|
|
67
|
+
YouTube video. You can add links by using `[Title](www.websitename.com)` in the
|
|
68
|
+
markdown.
|
|
69
|
+
|
|
70
|
+
**Example**
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
To learn more about hooks, see [Fastify hooks](https://fastify.dev/docs/latest/Reference/Hooks/).
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Result:
|
|
77
|
+
>To learn more about hooks, see [Fastify
|
|
78
|
+
>hooks](https://fastify.dev/docs/latest/Reference/Hooks/).
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
### Avoid plagiarism
|
|
83
|
+
|
|
84
|
+
Make sure you avoid copying other people's work. Keep it as original as
|
|
85
|
+
possible. You can learn from what they have done and reference where it is from
|
|
86
|
+
if you use a particular quote from their work.
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
## Word Choice
|
|
90
|
+
|
|
91
|
+
There are a few things you need to use and avoid when writing your documentation
|
|
92
|
+
to improve readability for readers and make documentation neat, direct, and
|
|
93
|
+
clean.
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
### When to use the second person "you" as the pronoun
|
|
97
|
+
|
|
98
|
+
When writing articles or guides, your content should communicate directly to
|
|
99
|
+
readers in the second person ("you") addressed form. It is easier to give them
|
|
100
|
+
direct instruction on what to do on a particular topic. To see an example, visit
|
|
101
|
+
the [Plugins Guide](./Plugins-Guide.md).
|
|
102
|
+
|
|
103
|
+
**Example**
|
|
104
|
+
|
|
105
|
+
Less like this: we can use the following plugins.
|
|
106
|
+
|
|
107
|
+
More like this: You can use the following plugins.
|
|
108
|
+
|
|
109
|
+
> According to [Wikipedia](#), ***You*** is usually a second person pronoun.
|
|
110
|
+
> Also, used to refer to an indeterminate person, as a more common alternative
|
|
111
|
+
> to a very formal indefinite pronoun.
|
|
112
|
+
|
|
113
|
+
## When to avoid the second person "you" as the pronoun
|
|
114
|
+
|
|
115
|
+
One of the main rules of formal writing such as reference documentation, or API
|
|
116
|
+
documentation, is to avoid the second person ("you") or directly addressing the
|
|
117
|
+
reader.
|
|
118
|
+
|
|
119
|
+
**Example**
|
|
120
|
+
|
|
121
|
+
Less like this: You can use the following recommendation as an example.
|
|
122
|
+
|
|
123
|
+
More like this: As an example, the following recommendations should be
|
|
124
|
+
referenced.
|
|
125
|
+
|
|
126
|
+
To view a live example, refer to the [Decorators](../Reference/Decorators.md)
|
|
127
|
+
reference document.
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
### Avoid using contractions
|
|
131
|
+
|
|
132
|
+
Contractions are the shortened version of written and spoken forms of a word,
|
|
133
|
+
i.e. using "don't" instead of "do not". Avoid contractions to provide a more
|
|
134
|
+
formal tone.
|
|
135
|
+
|
|
136
|
+
### Avoid using condescending terms
|
|
137
|
+
|
|
138
|
+
Condescending terms are words that include:
|
|
139
|
+
|
|
140
|
+
* Just
|
|
141
|
+
* Easy
|
|
142
|
+
* Simply
|
|
143
|
+
* Basically
|
|
144
|
+
* Obviously
|
|
145
|
+
|
|
146
|
+
The reader may not find it easy to use Fastify's framework and plugins; avoid
|
|
147
|
+
words that make it sound simple, easy, offensive, or insensitive. Not everyone
|
|
148
|
+
who reads the documentation has the same level of understanding.
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
### Starting with a verb
|
|
152
|
+
|
|
153
|
+
Mostly start your description with a verb, which makes it simple and precise for
|
|
154
|
+
the reader to follow. Prefer using present tense because it is easier to read
|
|
155
|
+
and understand than the past or future tense.
|
|
156
|
+
|
|
157
|
+
**Example**
|
|
158
|
+
|
|
159
|
+
Less like this: There is a need for Node.js to be installed before you can be
|
|
160
|
+
able to use Fastify.
|
|
161
|
+
|
|
162
|
+
More like this: Install Node.js to make use of Fastify.
|
|
163
|
+
|
|
164
|
+
### Grammatical moods
|
|
165
|
+
|
|
166
|
+
Grammatical moods are a great way to express your writing. Avoid sounding too
|
|
167
|
+
bossy while making a direct statement. Know when to switch between indicative,
|
|
168
|
+
imperative, and subjunctive moods.
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
**Indicative** - Use when making a factual statement or question.
|
|
172
|
+
|
|
173
|
+
Example: Since there is no testing framework available, "Fastify recommends ways
|
|
174
|
+
to write tests".
|
|
175
|
+
|
|
176
|
+
**Imperative** - Use when giving instructions, actions, commands, or when you
|
|
177
|
+
write your headings.
|
|
178
|
+
|
|
179
|
+
Example: Install dependencies before starting development.
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
**Subjunctive** - Use when making suggestions, hypotheses, or non-factual
|
|
183
|
+
statements.
|
|
184
|
+
|
|
185
|
+
Example: Reading the documentation on our website is recommended to get
|
|
186
|
+
comprehensive knowledge of the framework.
|
|
187
|
+
|
|
188
|
+
### Use **active** voice instead of **passive**
|
|
189
|
+
|
|
190
|
+
Using active voice is a more compact and direct way of conveying your
|
|
191
|
+
documentation.
|
|
192
|
+
|
|
193
|
+
**Example**
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
Passive: The node dependencies and packages are installed by npm.
|
|
197
|
+
|
|
198
|
+
Active: npm installs packages and node dependencies.
|
|
199
|
+
|
|
200
|
+
## Writing Style
|
|
201
|
+
|
|
202
|
+
### Documentation titles
|
|
203
|
+
|
|
204
|
+
When creating a new guide, API, or reference in the `/docs/` directory, use
|
|
205
|
+
short titles that best describe the topic of your documentation. Name your files
|
|
206
|
+
in kebab-cases and avoid Raw or camelCase. To learn more about kebab-case you
|
|
207
|
+
can visit this medium article on [Case
|
|
208
|
+
Styles](https://medium.com/better-programming/string-case-styles-camel-pascal-snake-and-kebab-case-981407998841).
|
|
209
|
+
|
|
210
|
+
**Examples**:
|
|
211
|
+
|
|
212
|
+
>`hook-and-plugins.md`,
|
|
213
|
+
|
|
214
|
+
`adding-test-plugins.md`,
|
|
215
|
+
|
|
216
|
+
`removing-requests.md`.
|
|
217
|
+
|
|
218
|
+
### Hyperlinks
|
|
219
|
+
|
|
220
|
+
Hyperlinks should have a clear title of what they reference. Here is how your
|
|
221
|
+
hyperlink should look:
|
|
222
|
+
|
|
223
|
+
```MD
|
|
224
|
+
<!-- More like this -->
|
|
225
|
+
|
|
226
|
+
// Add clear & brief description
|
|
227
|
+
[Fastify Plugins] (https://fastify.dev/docs/latest/Plugins/)
|
|
228
|
+
|
|
229
|
+
<!--Less like this -->
|
|
230
|
+
|
|
231
|
+
// incomplete description
|
|
232
|
+
[Fastify] (https://fastify.dev/docs/latest/Plugins/)
|
|
233
|
+
|
|
234
|
+
// Adding title in link brackets
|
|
235
|
+
[](https://fastify.dev/docs/latest/Plugins/ "fastify plugin")
|
|
236
|
+
|
|
237
|
+
// Empty title
|
|
238
|
+
[](https://fastify.dev/docs/latest/Plugins/)
|
|
239
|
+
|
|
240
|
+
// Adding links localhost URLs instead of using code strings (``)
|
|
241
|
+
[http://localhost:3000/](http://localhost:3000/)
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Include in your documentation as many essential references as possible, but
|
|
246
|
+
avoid having numerous links when writing for beginners to avoid distractions.
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
<h1 style="text-align: center;">Fastify</h1>
|
|
2
|
+
|
|
3
|
+
# Testing
|
|
4
|
+
<a id="testing"></a>
|
|
5
|
+
|
|
6
|
+
Testing is one of the most important parts of developing an application. Fastify
|
|
7
|
+
is very flexible when it comes to testing and is compatible with most testing
|
|
8
|
+
frameworks (such as [Node Test Runner](https://nodejs.org/api/test.html),
|
|
9
|
+
which is used in the examples below).
|
|
10
|
+
|
|
11
|
+
## Application
|
|
12
|
+
|
|
13
|
+
Let's `cd` into a fresh directory called 'testing-example' and type `npm init
|
|
14
|
+
-y` in our terminal.
|
|
15
|
+
|
|
16
|
+
Run `npm i fastify && npm i pino-pretty -D`
|
|
17
|
+
|
|
18
|
+
### Separating concerns makes testing easy
|
|
19
|
+
|
|
20
|
+
First, we are going to separate our application code from our server code:
|
|
21
|
+
|
|
22
|
+
**app.js**:
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
'use strict'
|
|
26
|
+
|
|
27
|
+
const fastify = require('fastify')
|
|
28
|
+
|
|
29
|
+
function build(opts={}) {
|
|
30
|
+
const app = fastify(opts)
|
|
31
|
+
app.get('/', async function (request, reply) {
|
|
32
|
+
return { hello: 'world' }
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return app
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = build
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**server.js**:
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
'use strict'
|
|
45
|
+
|
|
46
|
+
const server = require('./app')({
|
|
47
|
+
logger: {
|
|
48
|
+
level: 'info',
|
|
49
|
+
transport: {
|
|
50
|
+
target: 'pino-pretty'
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
server.listen({ port: 3000 }, (err, address) => {
|
|
56
|
+
if (err) {
|
|
57
|
+
server.log.error(err)
|
|
58
|
+
process.exit(1)
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Benefits of using fastify.inject()
|
|
64
|
+
|
|
65
|
+
Fastify comes with built-in support for fake HTTP injection thanks to
|
|
66
|
+
[`light-my-request`](https://github.com/fastify/light-my-request).
|
|
67
|
+
|
|
68
|
+
Before introducing any tests, we will use the `.inject` method to make a fake
|
|
69
|
+
request to our route:
|
|
70
|
+
|
|
71
|
+
**app.test.js**:
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
'use strict'
|
|
75
|
+
|
|
76
|
+
const build = require('./app')
|
|
77
|
+
|
|
78
|
+
const test = async () => {
|
|
79
|
+
const app = build()
|
|
80
|
+
|
|
81
|
+
const response = await app.inject({
|
|
82
|
+
method: 'GET',
|
|
83
|
+
url: '/'
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
console.log('status code: ', response.statusCode)
|
|
87
|
+
console.log('body: ', response.body)
|
|
88
|
+
}
|
|
89
|
+
test()
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
First, our code will run inside an asynchronous function, giving us access to
|
|
93
|
+
async/await.
|
|
94
|
+
|
|
95
|
+
`.inject` ensures all registered plugins have booted up and our application is
|
|
96
|
+
ready to test. Finally, we pass the request method we want to use and a route.
|
|
97
|
+
Using await we can store the response without a callback.
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
Run the test file in your terminal `node app.test.js`
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
status code: 200
|
|
105
|
+
body: {"hello":"world"}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
### Testing with HTTP injection
|
|
111
|
+
|
|
112
|
+
Now we can replace our `console.log` calls with actual tests!
|
|
113
|
+
|
|
114
|
+
In your `package.json` change the "test" script to:
|
|
115
|
+
|
|
116
|
+
`"test": "node --test --watch"`
|
|
117
|
+
|
|
118
|
+
**app.test.js**:
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
'use strict'
|
|
122
|
+
|
|
123
|
+
const { test } = require('node:test')
|
|
124
|
+
const build = require('./app')
|
|
125
|
+
|
|
126
|
+
test('requests the "/" route', async t => {
|
|
127
|
+
t.plan(1)
|
|
128
|
+
const app = build()
|
|
129
|
+
|
|
130
|
+
const response = await app.inject({
|
|
131
|
+
method: 'GET',
|
|
132
|
+
url: '/'
|
|
133
|
+
})
|
|
134
|
+
t.assert.strictEqual(response.statusCode, 200, 'returns a status code of 200')
|
|
135
|
+
})
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Finally, run `npm test` in the terminal and see your test results!
|
|
139
|
+
|
|
140
|
+
The `inject` method can do much more than a simple GET request to a URL:
|
|
141
|
+
```js
|
|
142
|
+
fastify.inject({
|
|
143
|
+
method: String,
|
|
144
|
+
url: String,
|
|
145
|
+
query: Object,
|
|
146
|
+
payload: Object,
|
|
147
|
+
headers: Object,
|
|
148
|
+
cookies: Object
|
|
149
|
+
}, (error, response) => {
|
|
150
|
+
// your tests
|
|
151
|
+
})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
`.inject` methods can also be chained by omitting the callback function:
|
|
155
|
+
|
|
156
|
+
```js
|
|
157
|
+
fastify
|
|
158
|
+
.inject()
|
|
159
|
+
.get('/')
|
|
160
|
+
.headers({ foo: 'bar' })
|
|
161
|
+
.query({ foo: 'bar' })
|
|
162
|
+
.end((err, res) => { // the .end call will trigger the request
|
|
163
|
+
console.log(res.payload)
|
|
164
|
+
})
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
or in the promisified version
|
|
168
|
+
|
|
169
|
+
```js
|
|
170
|
+
fastify
|
|
171
|
+
.inject({
|
|
172
|
+
method: String,
|
|
173
|
+
url: String,
|
|
174
|
+
query: Object,
|
|
175
|
+
payload: Object,
|
|
176
|
+
headers: Object,
|
|
177
|
+
cookies: Object
|
|
178
|
+
})
|
|
179
|
+
.then(response => {
|
|
180
|
+
// your tests
|
|
181
|
+
})
|
|
182
|
+
.catch(err => {
|
|
183
|
+
// handle error
|
|
184
|
+
})
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Async await is supported as well!
|
|
188
|
+
```js
|
|
189
|
+
try {
|
|
190
|
+
const res = await fastify.inject({ method: String, url: String, payload: Object, headers: Object })
|
|
191
|
+
// your tests
|
|
192
|
+
} catch (err) {
|
|
193
|
+
// handle error
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### Another Example:
|
|
198
|
+
|
|
199
|
+
**app.js**
|
|
200
|
+
```js
|
|
201
|
+
const Fastify = require('fastify')
|
|
202
|
+
|
|
203
|
+
function buildFastify () {
|
|
204
|
+
const fastify = Fastify()
|
|
205
|
+
|
|
206
|
+
fastify.get('/', function (request, reply) {
|
|
207
|
+
reply.send({ hello: 'world' })
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
return fastify
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
module.exports = buildFastify
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**test.js**
|
|
217
|
+
```js
|
|
218
|
+
const { test } = require('node:test')
|
|
219
|
+
const buildFastify = require('./app')
|
|
220
|
+
|
|
221
|
+
test('GET `/` route', t => {
|
|
222
|
+
t.plan(4)
|
|
223
|
+
|
|
224
|
+
const fastify = buildFastify()
|
|
225
|
+
|
|
226
|
+
// At the end of your tests it is highly recommended to call `.close()`
|
|
227
|
+
// to ensure that all connections to external services get closed.
|
|
228
|
+
t.after(() => fastify.close())
|
|
229
|
+
|
|
230
|
+
fastify.inject({
|
|
231
|
+
method: 'GET',
|
|
232
|
+
url: '/'
|
|
233
|
+
}, (err, response) => {
|
|
234
|
+
t.assert.ifError(err)
|
|
235
|
+
t.assert.strictEqual(response.statusCode, 200)
|
|
236
|
+
t.assert.strictEqual(response.headers['content-type'], 'application/json; charset=utf-8')
|
|
237
|
+
t.assert.deepStrictEqual(response.json(), { hello: 'world' })
|
|
238
|
+
})
|
|
239
|
+
})
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Testing with a running server
|
|
243
|
+
Fastify can also be tested after starting the server with `fastify.listen()` or
|
|
244
|
+
after initializing routes and plugins with `fastify.ready()`.
|
|
245
|
+
|
|
246
|
+
#### Example:
|
|
247
|
+
|
|
248
|
+
Uses **app.js** from the previous example.
|
|
249
|
+
|
|
250
|
+
**test-listen.js** (testing with [`undici`](https://www.npmjs.com/package/undici))
|
|
251
|
+
```js
|
|
252
|
+
const { test } = require('node:test')
|
|
253
|
+
const { Client } = require('undici')
|
|
254
|
+
const buildFastify = require('./app')
|
|
255
|
+
|
|
256
|
+
test('should work with undici', async t => {
|
|
257
|
+
t.plan(2)
|
|
258
|
+
|
|
259
|
+
const fastify = buildFastify()
|
|
260
|
+
|
|
261
|
+
await fastify.listen()
|
|
262
|
+
|
|
263
|
+
const client = new Client(
|
|
264
|
+
'http://localhost:' + fastify.server.address().port, {
|
|
265
|
+
keepAliveTimeout: 10,
|
|
266
|
+
keepAliveMaxTimeout: 10
|
|
267
|
+
}
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
t.after(() => {
|
|
271
|
+
fastify.close()
|
|
272
|
+
client.close()
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
const response = await client.request({ method: 'GET', path: '/' })
|
|
276
|
+
|
|
277
|
+
t.assert.strictEqual(await response.body.text(), '{"hello":"world"}')
|
|
278
|
+
t.assert.strictEqual(response.statusCode, 200)
|
|
279
|
+
})
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Alternatively, starting with Node.js 18,
|
|
283
|
+
[`fetch`](https://nodejs.org/docs/latest-v18.x/api/globals.html#fetch)
|
|
284
|
+
may be used without requiring any extra dependencies:
|
|
285
|
+
|
|
286
|
+
**test-listen.js**
|
|
287
|
+
```js
|
|
288
|
+
const { test } = require('node:test')
|
|
289
|
+
const buildFastify = require('./app')
|
|
290
|
+
|
|
291
|
+
test('should work with fetch', async t => {
|
|
292
|
+
t.plan(3)
|
|
293
|
+
|
|
294
|
+
const fastify = buildFastify()
|
|
295
|
+
|
|
296
|
+
t.after(() => fastify.close())
|
|
297
|
+
|
|
298
|
+
await fastify.listen()
|
|
299
|
+
|
|
300
|
+
const response = await fetch(
|
|
301
|
+
'http://localhost:' + fastify.server.address().port
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
t.assert.strictEqual(response.status, 200)
|
|
305
|
+
t.assert.strictEqual(
|
|
306
|
+
response.headers.get('content-type'),
|
|
307
|
+
'application/json; charset=utf-8'
|
|
308
|
+
)
|
|
309
|
+
const jsonResult = await response.json()
|
|
310
|
+
t.assert.strictEqual(jsonResult.hello, 'world')
|
|
311
|
+
})
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**test-ready.js** (testing with
|
|
315
|
+
[`SuperTest`](https://www.npmjs.com/package/supertest))
|
|
316
|
+
```js
|
|
317
|
+
const { test } = require('node:test')
|
|
318
|
+
const supertest = require('supertest')
|
|
319
|
+
const buildFastify = require('./app')
|
|
320
|
+
|
|
321
|
+
test('GET `/` route', async (t) => {
|
|
322
|
+
const fastify = buildFastify()
|
|
323
|
+
|
|
324
|
+
t.after(() => fastify.close())
|
|
325
|
+
|
|
326
|
+
await fastify.ready()
|
|
327
|
+
|
|
328
|
+
const response = await supertest(fastify.server)
|
|
329
|
+
.get('/')
|
|
330
|
+
.expect(200)
|
|
331
|
+
.expect('Content-Type', 'application/json; charset=utf-8')
|
|
332
|
+
t.assert.deepStrictEqual(response.body, { hello: 'world' })
|
|
333
|
+
})
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### How to inspect node tests
|
|
337
|
+
1. Isolate your test by passing the `{only: true}` option
|
|
338
|
+
```javascript
|
|
339
|
+
test('should ...', {only: true}, t => ...)
|
|
340
|
+
```
|
|
341
|
+
2. Run `node --test`
|
|
342
|
+
```bash
|
|
343
|
+
> node --test --test-only --inspect-brk test/<test-file.test.js>
|
|
344
|
+
```
|
|
345
|
+
- `--test-only` specifies to run tests with the `only` option enabled
|
|
346
|
+
- `--inspect-brk` will launch the node debugger
|
|
347
|
+
3. In VS Code, create and launch a `Node.js: Attach` debug configuration. No
|
|
348
|
+
modification should be necessary.
|
|
349
|
+
|
|
350
|
+
Now you should be able to step through your test file (and the rest of
|
|
351
|
+
`Fastify`) in your code editor.
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
## Plugins
|
|
356
|
+
Let's `cd` into a fresh directory called 'testing-plugin-example' and type
|
|
357
|
+
`npm init -y` in our terminal.
|
|
358
|
+
|
|
359
|
+
Run `npm i fastify fastify-plugin`
|
|
360
|
+
|
|
361
|
+
**plugin/myFirstPlugin.js**:
|
|
362
|
+
|
|
363
|
+
```js
|
|
364
|
+
const fP = require("fastify-plugin")
|
|
365
|
+
|
|
366
|
+
async function myPlugin(fastify, options) {
|
|
367
|
+
fastify.decorateRequest("helloRequest", "Hello World")
|
|
368
|
+
fastify.decorate("helloInstance", "Hello Fastify Instance")
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
module.exports = fP(myPlugin)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
A basic example of a Plugin. See [Plugin Guide](./Plugins-Guide.md)
|
|
375
|
+
|
|
376
|
+
**test/myFirstPlugin.test.js**:
|
|
377
|
+
|
|
378
|
+
```js
|
|
379
|
+
const Fastify = require("fastify");
|
|
380
|
+
const { test } = require("node:test");
|
|
381
|
+
const myPlugin = require("../plugin/myFirstPlugin");
|
|
382
|
+
|
|
383
|
+
test("Test the Plugin Route", async t => {
|
|
384
|
+
// Create a mock fastify application to test the plugin
|
|
385
|
+
const fastify = Fastify()
|
|
386
|
+
|
|
387
|
+
fastify.register(myPlugin)
|
|
388
|
+
|
|
389
|
+
// Add an endpoint of your choice
|
|
390
|
+
fastify.get("/", async (request, reply) => {
|
|
391
|
+
return ({ message: request.helloRequest })
|
|
392
|
+
})
|
|
393
|
+
|
|
394
|
+
// Use fastify.inject to fake a HTTP Request
|
|
395
|
+
const fastifyResponse = await fastify.inject({
|
|
396
|
+
method: "GET",
|
|
397
|
+
url: "/"
|
|
398
|
+
})
|
|
399
|
+
|
|
400
|
+
console.log('status code: ', fastifyResponse.statusCode)
|
|
401
|
+
console.log('body: ', fastifyResponse.body)
|
|
402
|
+
})
|
|
403
|
+
```
|
|
404
|
+
Learn more about [```fastify.inject()```](#benefits-of-using-fastifyinject).
|
|
405
|
+
Run the test file in your terminal `node test/myFirstPlugin.test.js`
|
|
406
|
+
|
|
407
|
+
```sh
|
|
408
|
+
status code: 200
|
|
409
|
+
body: {"message":"Hello World"}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
Now we can replace our `console.log` calls with actual tests!
|
|
413
|
+
|
|
414
|
+
In your `package.json` change the "test" script to:
|
|
415
|
+
|
|
416
|
+
`"test": "node --test --watch"`
|
|
417
|
+
|
|
418
|
+
Create the test for the endpoint.
|
|
419
|
+
|
|
420
|
+
**test/myFirstPlugin.test.js**:
|
|
421
|
+
|
|
422
|
+
```js
|
|
423
|
+
const Fastify = require("fastify");
|
|
424
|
+
const { test } = require("node:test");
|
|
425
|
+
const myPlugin = require("../plugin/myFirstPlugin");
|
|
426
|
+
|
|
427
|
+
test("Test the Plugin Route", async t => {
|
|
428
|
+
// Specifies the number of test
|
|
429
|
+
t.plan(2)
|
|
430
|
+
|
|
431
|
+
const fastify = Fastify()
|
|
432
|
+
|
|
433
|
+
fastify.register(myPlugin)
|
|
434
|
+
|
|
435
|
+
fastify.get("/", async (request, reply) => {
|
|
436
|
+
return ({ message: request.helloRequest })
|
|
437
|
+
})
|
|
438
|
+
|
|
439
|
+
const fastifyResponse = await fastify.inject({
|
|
440
|
+
method: "GET",
|
|
441
|
+
url: "/"
|
|
442
|
+
})
|
|
443
|
+
|
|
444
|
+
t.assert.strictEqual(fastifyResponse.statusCode, 200)
|
|
445
|
+
t.assert.deepStrictEqual(JSON.parse(fastifyResponse.body), { message: "Hello World" })
|
|
446
|
+
})
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Finally, run `npm test` in the terminal and see your test results!
|
|
450
|
+
|
|
451
|
+
Test the ```.decorate()``` and ```.decorateRequest()```.
|
|
452
|
+
|
|
453
|
+
**test/myFirstPlugin.test.js**:
|
|
454
|
+
|
|
455
|
+
```js
|
|
456
|
+
const Fastify = require("fastify");
|
|
457
|
+
const { test }= require("node:test");
|
|
458
|
+
const myPlugin = require("../plugin/myFirstPlugin");
|
|
459
|
+
|
|
460
|
+
test("Test the Plugin Route", async t => {
|
|
461
|
+
t.plan(5)
|
|
462
|
+
const fastify = Fastify()
|
|
463
|
+
|
|
464
|
+
fastify.register(myPlugin)
|
|
465
|
+
|
|
466
|
+
fastify.get("/", async (request, reply) => {
|
|
467
|
+
// Testing the fastify decorators
|
|
468
|
+
t.assert.ifError(request.helloRequest)
|
|
469
|
+
t.assert.ok(request.helloRequest, "Hello World")
|
|
470
|
+
t.assert.ok(fastify.helloInstance, "Hello Fastify Instance")
|
|
471
|
+
return ({ message: request.helloRequest })
|
|
472
|
+
})
|
|
473
|
+
|
|
474
|
+
const fastifyResponse = await fastify.inject({
|
|
475
|
+
method: "GET",
|
|
476
|
+
url: "/"
|
|
477
|
+
})
|
|
478
|
+
t.assert.strictEqual(fastifyResponse.statusCode, 200)
|
|
479
|
+
t.assert.deepStrictEqual(JSON.parse(fastifyResponse.body), { message: "Hello World" })
|
|
480
|
+
})
|
|
481
|
+
```
|