summaryrefslogtreecommitdiffstats
path: root/test/fetch/response-json.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--test/fetch/response-json.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/test/fetch/response-json.js b/test/fetch/response-json.js
new file mode 100644
index 0000000..6244fbf
--- /dev/null
+++ b/test/fetch/response-json.js
@@ -0,0 +1,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()
+})