forked from nodejs/undici
-
Notifications
You must be signed in to change notification settings - Fork 2
/
response-json.js
113 lines (87 loc) · 3.12 KB
/
response-json.js
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
'use strict'
const { test } = require('tap')
const { Response } = require('../../')
// https://github.com/web-platform-tests/wpt/pull/32825/
const APPLICATION_JSON = 'application/json'
const FOO_BAR = 'foo/bar'
const INIT_TESTS = [
[undefined, 200, '', APPLICATION_JSON, {}],
[{ status: 400 }, 400, '', APPLICATION_JSON, {}],
[{ statusText: 'foo' }, 200, 'foo', APPLICATION_JSON, {}],
[{ headers: {} }, 200, '', APPLICATION_JSON, {}],
[{ headers: { 'content-type': FOO_BAR } }, 200, '', FOO_BAR, {}],
[{ headers: { 'x-foo': 'bar' } }, 200, '', APPLICATION_JSON, { 'x-foo': 'bar' }]
]
test('Check response returned by static json() with init', async (t) => {
for (const [init, expectedStatus, expectedStatusText, expectedContentType, expectedHeaders] of INIT_TESTS) {
const response = Response.json('hello world', init)
t.equal(response.type, 'default', "Response's type is default")
t.equal(response.status, expectedStatus, "Response's status is " + expectedStatus)
t.equal(response.statusText, expectedStatusText, "Response's statusText is " + JSON.stringify(expectedStatusText))
t.equal(response.headers.get('content-type'), expectedContentType, "Response's content-type is " + expectedContentType)
for (const key in expectedHeaders) {
t.equal(response.headers.get(key), expectedHeaders[key], "Response's header " + key + ' is ' + JSON.stringify(expectedHeaders[key]))
}
const data = await response.json()
t.equal(data, 'hello world', "Response's body is 'hello world'")
}
t.end()
})
test('Throws TypeError when calling static json() with an invalid status', (t) => {
const nullBodyStatus = [204, 205, 304]
for (const status of nullBodyStatus) {
t.throws(() => {
Response.json('hello world', { status })
}, TypeError, `Throws TypeError when calling static json() with a status of ${status}`)
}
t.end()
})
test('Check static json() encodes JSON objects correctly', async (t) => {
const response = Response.json({ foo: 'bar' })
const data = await response.json()
t.equal(typeof data, 'object', "Response's json body is an object")
t.equal(data.foo, 'bar', "Response's json body is { foo: 'bar' }")
t.end()
})
test('Check static json() throws when data is not encodable', (t) => {
t.throws(() => {
Response.json(Symbol('foo'))
}, TypeError)
t.end()
})
test('Check static json() throws when data is circular', (t) => {
const a = { b: 1 }
a.a = a
t.throws(() => {
Response.json(a)
}, TypeError)
t.end()
})
test('Check static json() propagates JSON serializer errors', (t) => {
class CustomError extends Error {
name = 'CustomError'
}
t.throws(() => {
Response.json({ get foo () { throw new CustomError('bar') } })
}, CustomError)
t.end()
})
// note: these tests are not part of any WPTs
test('unserializable values', (t) => {
t.throws(() => {
Response.json(Symbol('symbol'))
}, TypeError)
t.throws(() => {
Response.json(undefined)
}, TypeError)
t.throws(() => {
Response.json()
}, TypeError)
t.end()
})
test('invalid init', (t) => {
t.throws(() => {
Response.json(null, 3)
}, TypeError)
t.end()
})