response-static-json.any.js (3420B)
1 // META: global=window,worker 2 // META: title=Response: json static method 3 4 const APPLICATION_JSON = "application/json"; 5 const FOO_BAR = "foo/bar"; 6 7 const INIT_TESTS = [ 8 [undefined, 200, "", APPLICATION_JSON, {}], 9 [{ status: 400 }, 400, "", APPLICATION_JSON, {}], 10 [{ statusText: "foo" }, 200, "foo", APPLICATION_JSON, {}], 11 [{ headers: {} }, 200, "", APPLICATION_JSON, {}], 12 [{ headers: { "content-type": FOO_BAR } }, 200, "", FOO_BAR, {}], 13 [{ headers: { "x-foo": "bar" } }, 200, "", APPLICATION_JSON, { "x-foo": "bar" }], 14 ]; 15 16 for (const [init, expectedStatus, expectedStatusText, expectedContentType, expectedHeaders] of INIT_TESTS) { 17 promise_test(async function () { 18 const response = Response.json("hello world", init); 19 assert_equals(response.type, "default", "Response's type is default"); 20 assert_equals(response.status, expectedStatus, "Response's status is " + expectedStatus); 21 assert_equals(response.statusText, expectedStatusText, "Response's statusText is " + JSON.stringify(expectedStatusText)); 22 assert_equals(response.headers.get("content-type"), expectedContentType, "Response's content-type is " + expectedContentType); 23 for (const key in expectedHeaders) { 24 assert_equals(response.headers.get(key), expectedHeaders[key], "Response's header " + key + " is " + JSON.stringify(expectedHeaders[key])); 25 } 26 27 const data = await response.json(); 28 assert_equals(data, "hello world", "Response's body is 'hello world'"); 29 }, `Check response returned by static json() with init ${JSON.stringify(init)}`); 30 } 31 32 const nullBodyStatus = [204, 205, 304]; 33 for (const status of nullBodyStatus) { 34 test(function () { 35 assert_throws_js( 36 TypeError, 37 function () { 38 Response.json("hello world", { status: status }); 39 }, 40 ); 41 }, `Throws TypeError when calling static json() with a status of ${status}`); 42 } 43 44 promise_test(async function () { 45 const response = Response.json({ foo: "bar" }); 46 const data = await response.json(); 47 assert_equals(typeof data, "object", "Response's json body is an object"); 48 assert_equals(data.foo, "bar", "Response's json body is { foo: 'bar' }"); 49 }, "Check static json() encodes JSON objects correctly"); 50 51 test(function () { 52 assert_throws_js( 53 TypeError, 54 function () { 55 Response.json(Symbol("foo")); 56 }, 57 ); 58 }, "Check static json() throws when data is not encodable"); 59 60 test(function () { 61 const a = { b: 1 }; 62 a.a = a; 63 assert_throws_js( 64 TypeError, 65 function () { 66 Response.json(a); 67 }, 68 ); 69 }, "Check static json() throws when data is circular"); 70 71 promise_test(async function () { 72 class CustomError extends Error { 73 name = "CustomError"; 74 } 75 assert_throws_js( 76 CustomError, 77 function () { 78 Response.json({ get foo() { throw new CustomError("bar") }}); 79 } 80 ) 81 }, "Check static json() propagates JSON serializer errors"); 82 83 const encodingChecks = [ 84 ["𝌆", [34, 240, 157, 140, 134, 34]], 85 ["\uDF06\uD834", [34, 92, 117, 100, 102, 48, 54, 92, 117, 100, 56, 51, 52, 34]], 86 ["\uDEAD", [34, 92, 117, 100, 101, 97, 100, 34]], 87 ]; 88 89 for (const [input, expected] of encodingChecks) { 90 promise_test(async function () { 91 const response = Response.json(input); 92 const buffer = await response.arrayBuffer(); 93 const data = new Uint8Array(buffer); 94 assert_array_equals(data, expected); 95 }, `Check response returned by static json() with input ${input}`); 96 }