/
index.test.ts
127 lines (113 loc) · 3.32 KB
/
index.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { createNext } from 'e2e-utils'
import { NextInstance } from 'test/lib/next-modes/base'
import { fetchViaHTTP } from 'next-test-utils'
describe('reading request body in middleware', () => {
let next: NextInstance
beforeAll(async () => {
next = await createNext({
files: {
'src/readBody.js': `
export async function readBody(reader, input = reader.read(), body = "") {
const { value, done } = await input;
const inputText = new TextDecoder().decode(value);
body += inputText;
if (done) {
return body;
}
const next = await reader.read();
return readBody(reader, next, body);
}
`,
'pages/_middleware.js': `
const { NextResponse } = require('next/server');
import { readBody } from '../src/readBody';
export default async function middleware(request) {
if (!request.body) {
return new Response('No body', { status: 400 });
}
const reader = await request.body.getReader();
const body = await readBody(reader);
const json = JSON.parse(body);
if (request.nextUrl.searchParams.has("next")) {
return NextResponse.next();
}
return new Response(JSON.stringify({
root: true,
...json,
}), {
status: 200,
headers: {
'content-type': 'application/json',
},
})
}
`,
'pages/nested/_middleware.js': `
const { NextResponse } = require('next/server');
import { readBody } from '../../src/readBody';
export default async function middleware(request) {
if (!request.body) {
return new Response('No body', { status: 400 });
}
const reader = await request.body.getReader();
const body = await readBody(reader);
const json = JSON.parse(body);
return new Response(JSON.stringify({
root: false,
...json,
}), {
status: 200,
headers: {
'content-type': 'application/json',
},
})
}
`,
},
dependencies: {},
})
})
afterAll(() => next.destroy())
it('rejects with 400 for get requests', async () => {
const response = await fetchViaHTTP(next.url, '/')
expect(response.status).toEqual(400)
})
it('returns root: true for root calls', async () => {
const response = await fetchViaHTTP(
next.url,
'/',
{},
{
method: 'POST',
body: JSON.stringify({
foo: 'bar',
}),
}
)
expect(response.status).toEqual(200)
expect(await response.json()).toEqual({
foo: 'bar',
root: true,
})
})
it('reads the same body on both middlewares', async () => {
const response = await fetchViaHTTP(
next.url,
'/nested/hello',
{
next: '1',
},
{
method: 'POST',
body: JSON.stringify({
foo: 'bar',
}),
}
)
expect(response.status).toEqual(200)
expect(await response.json()).toEqual({
foo: 'bar',
root: false,
})
})
})