Files
msw/test/node/rest-api/response-patching.node.test.ts

81 lines
2.1 KiB
TypeScript

// @vitest-environment node
import { http, bypass } from 'msw'
import { setupServer } from 'msw/node'
import express from 'express'
import { HttpServer } from '@open-draft/test-server/http'
const httpServer = new HttpServer((app) => {
app.use('/resource', (_req, res, next) => {
res.setHeader('access-control-allow-headers', '*')
next()
})
app.post('/resource', express.text(), (req, res) => {
res.json({
text: req.body,
requestHeaders: req.headers,
})
})
})
const server = setupServer()
beforeAll(async () => {
server.listen()
await httpServer.listen()
})
afterEach(() => {
server.resetHandlers()
})
afterAll(async () => {
server.close()
await httpServer.close()
})
it('supports patching an original HTTP response', async () => {
server.use(
http.post(httpServer.http.url('/resource'), async ({ request }) => {
const originalResponse = await fetch(bypass(request))
const { text, requestHeaders } = await originalResponse.json()
return new Response(text.toUpperCase(), { headers: requestHeaders })
}),
)
const response = await fetch(httpServer.http.url('/resource'), {
method: 'POST',
body: 'world',
})
await expect(response.text()).resolves.toBe('WORLD')
// Must not contain the internal bypass request header.
expect(Object.fromEntries(response.headers)).toHaveProperty('accept', '*/*')
})
it('preserves request "accept" header when patching a response', async () => {
server.use(
http.post(httpServer.http.url('/resource'), async ({ request }) => {
const originalResponse = await fetch(bypass(request))
const { text, requestHeaders } = await originalResponse.json()
return new Response(text.toUpperCase(), { headers: requestHeaders })
}),
)
const response = await fetch(httpServer.http.url('/resource'), {
method: 'POST',
headers: {
accept: 'application/json',
},
body: 'world',
})
await expect(response.text()).resolves.toBe('WORLD')
// Must not contain the internal bypass request header.
expect(Object.fromEntries(response.headers)).toHaveProperty(
'accept',
'application/json',
)
})