Sitelet https://github.com/nuxt/test-utils/commit/abe8ad944
Skip to content

Commit abe8ad9

Browse files
committed
perf: use h3's toWebHandler instead of node-mock-http
1 parent e70592f commit abe8ad9

6 files changed

Lines changed: 22 additions & 78 deletions

File tree

‎examples/app-vitest-full/tests/nuxt/fetch.spec.ts‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { describe, expect, it, vi } from 'vitest'
33
import { mountSuspended, registerEndpoint } from '@nuxt/test-utils/runtime'
44

55
import { listen } from 'listhen'
6-
import { createApp, eventHandler, toNodeListener, readBody, getHeaders, getQuery } from 'h3'
6+
import { createApp, eventHandler, toNodeListener, readBody, getHeaders, getQuery, setCookie } from 'h3'
77

88
import FetchComponent from '~/components/FetchComponent.vue'
99

@@ -43,6 +43,17 @@ describe('server mocks and data fetching', () => {
4343
})
4444
})
4545

46+
it('can set cookies from mocked endpoints', async () => {
47+
registerEndpoint('/with-cookies', eventHandler((event) => {
48+
setCookie(event, 'first', '1')
49+
setCookie(event, 'second', '2')
50+
return 'ok'
51+
}))
52+
const response = await fetch('/with-cookies')
53+
expect(response.headers.getSetCookie()).toStrictEqual(['first=1; Path=/', 'second=2; Path=/'])
54+
expect(await response.text()).toBe('ok')
55+
})
56+
4657
it('can override and remove request mocks', async () => {
4758
const unsubFirst = registerEndpoint('/overrides', () => ({ title: 'first' }))
4859
expect(await $fetch<unknown>('/overrides')).toStrictEqual({ title: 'first' })

‎package.json‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@
8686
"fake-indexeddb": "^6.2.5",
8787
"get-port-please": "^3.2.0",
8888
"magic-string": "^1.2.3",
89-
"node-mock-http": "^1.0.5",
9089
"ofetch": "^1.5.1",
9190
"oxc-walker": "^1.1.1",
9291
"package-manager-detector": "^1.8.0",

‎patches/node-mock-http.patch‎

Lines changed: 0 additions & 17 deletions
This file was deleted.

‎pnpm-lock.yaml‎

Lines changed: 6 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎pnpm-workspace.yaml‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ overrides:
1818
vitest: 5.0.0
1919
vue: ^3.5.42
2020

21-
patchedDependencies:
22-
node-mock-http: patches/node-mock-http.patch
23-
2421
shellEmulator: true
2522

2623
ignoreWorkspaceRootCheck: true

‎src/runtime/shared/h3-v1.ts‎

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import type { GenericApp } from '../../vitest-environment.ts'
22

33
export async function createFetchForH3V1() {
4-
const [{ createApp, toNodeListener }, { fetchNodeRequestHandler }] = await Promise.all([
5-
// @ts-expect-error resolved to the project's h3 by the vitest config
6-
import('#nuxt-test-utils/h3') as Promise<typeof import('h3')>,
7-
import('node-mock-http'),
8-
])
4+
// @ts-expect-error resolved to the project's h3 by the vitest config
5+
const { createApp, toWebHandler } = await (import('#nuxt-test-utils/h3') as Promise<typeof import('h3')>)
96

107
const h3App = createApp()
11-
const nodeHandler = toNodeListener(h3App)
8+
const webHandler = toWebHandler(h3App)
129

1310
const registry = new Set<string>()
1411
const _fetch = fetch
@@ -36,8 +33,7 @@ export async function createFetchForH3V1() {
3633
url = '/_' + url
3734
}
3835
if (url.startsWith('/')) {
39-
const response = await fetchNodeRequestHandler(nodeHandler, url, init)
40-
return normalizeFetchResponse(response)
36+
return webHandler(new Request(new URL(url, 'http://localhost'), init))
4137
}
4238
return _fetch(input, _init)
4339
}) as typeof fetch
@@ -48,39 +44,3 @@ export async function createFetchForH3V1() {
4844
fetch: h3Fetch,
4945
}
5046
}
51-
52-
/** utils from nitro */
53-
54-
function normalizeFetchResponse(response: Response) {
55-
if (!response.headers.has('set-cookie')) {
56-
return response
57-
}
58-
return new Response(response.body, {
59-
status: response.status,
60-
statusText: response.statusText,
61-
headers: normalizeCookieHeaders(response.headers),
62-
})
63-
}
64-
65-
function normalizeCookieHeader(header: number | string | string[] = '') {
66-
return splitCookiesString(joinHeaders(header))
67-
}
68-
69-
function normalizeCookieHeaders(headers: Headers) {
70-
const outgoingHeaders = new Headers()
71-
for (const [name, header] of headers) {
72-
if (name === 'set-cookie') {
73-
for (const cookie of normalizeCookieHeader(header)) {
74-
outgoingHeaders.append('set-cookie', cookie)
75-
}
76-
}
77-
else {
78-
outgoingHeaders.set(name, joinHeaders(header))
79-
}
80-
}
81-
return outgoingHeaders
82-
}
83-
84-
function joinHeaders(value: number | string | string[]) {
85-
return Array.isArray(value) ? value.join(', ') : String(value)
86-
}

0 commit comments

Comments
 (0)