From a03abe678afd45e9d139e13c9d17a569c2853547 Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Sat, 16 Mar 2024 05:38:17 -0300 Subject: src/hero.mjs: interceptors.contentType(): Generate body from status when missing --- src/hero.mjs | 18 +++++++++++++----- tests/js/hero.mjs | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/hero.mjs b/src/hero.mjs index 5169284..b378887 100644 --- a/src/hero.mjs +++ b/src/hero.mjs @@ -71,15 +71,23 @@ export const interceptorsFn = ({ }, contentType: async (req, next) => { const response = await next(req); - const [mimeType, body] = typeof response.body === "string" ? - ["text/html", response.body] : - ["application/json", JSON.stringify(response.body) || ""]; + const { status, body, headers } = response; + assert.equal(typeof status, "number"); + const mappings = { + string: () => [ "text/html", body ], + undefined: () => [ "text/plain", http.STATUS_CODES[status] + "\n" ], + FALLBACK: () => [ "application/json", JSON.stringify(body) ], + }; + const type = typeof body; + assert.notEqual(type, "FALLBACK"); + const [mimeType, renderedBody] = + (mappings[type] || mappings.FALLBACK)(); return { ...response, - body, + body: renderedBody, headers: { "Content-Type": mimeType, - "Content-Length": Buffer.byteLength(body), + "Content-Length": Buffer.byteLength(renderedBody), ...(response.headers || {}) }, }; diff --git a/tests/js/hero.mjs b/tests/js/hero.mjs index 1c34738..8d8f811 100644 --- a/tests/js/hero.mjs +++ b/tests/js/hero.mjs @@ -247,7 +247,7 @@ const test_interceptorsFn = async t => { assert.deepEqual( contents.map(o => u.dissoc(o, "timings")), [ - { ...req, type: "in-request" }, + { ...req, type: "in-request" }, { id: req.id, status, type: "in-response" }, ], ); @@ -261,20 +261,31 @@ const test_interceptorsFn = async t => { t.start("interceptorsFn().contentType()"); await t.test("empty values", async () => { + await assert.rejects( + async () => await interceptorsFn().contentType({}, next), + assert.AssertionError, + ); assert.deepEqual( - await interceptorsFn().contentType({}, next), + await interceptorsFn().contentType({ + status: 202, + }, next), { - body: "", + status: 202, + body: "Accepted\n", headers: { - "Content-Type": "application/json", - "Content-Length": 0, + "Content-Type": "text/plain", + "Content-Length": 9, }, }, ); assert.deepEqual( - await interceptorsFn().contentType({ body: "" }, next), + await interceptorsFn().contentType({ + status: 200, + body: "", + }, next), { + status: 200, body: "", headers: { "Content-Type": "text/html", @@ -286,8 +297,12 @@ const test_interceptorsFn = async t => { await t.test("body values", async () => { assert.deepEqual( - await interceptorsFn().contentType({ body: { a: 1 }}, next), + await interceptorsFn().contentType({ + status: 201, + body: { a: 1 }, + }, next), { + status: 201, body: `{"a":1}`, headers: { "Content-Type": "application/json", @@ -297,8 +312,12 @@ const test_interceptorsFn = async t => { ); assert.deepEqual( - await interceptorsFn().contentType({ body: "
" }, next), + await interceptorsFn().contentType({ + status: 200, + body: "
", + }, next), { + status: 200, body: "
", headers: { "Content-Type": "text/html", @@ -311,6 +330,7 @@ const test_interceptorsFn = async t => { await t.test("header values preference", async () => { assert.deepEqual( await interceptorsFn().contentType({ + status: 503, body: "", headers: { "Content-Type": "we have preference", @@ -318,6 +338,7 @@ const test_interceptorsFn = async t => { }, }, next), { + status: 503, body: "", headers: { "Content-Type": "we have preference", @@ -330,12 +351,14 @@ const test_interceptorsFn = async t => { await t.test("headers get propagated", async () => { assert.deepEqual( await interceptorsFn().contentType({ + status: 500, body: "", headers: { "My": "Header", }, }, next), { + status: 500, body: "", headers: { "My": "Header", -- cgit v1.2.3