Branch data Line data Source code
1 [ + ]: 2 : import assert from 'node:assert/strict';
2 : 2 : import { XMLHttpRequest } from '../../../lib/whatwg-xhr.js';
3 : 2 :
4 [ + ]: 2 : export default (activeURL) => {
5 : 1 :
6 : 1 : // no data
7 : 1 : makeTest("", null, 'json response with no data: response property is null');
8 : 1 :
9 : 1 : // malformed
10 : 1 : makeTest('{"test":"foo"', null, 'json response with malformed data: response property is null');
11 : 1 :
12 : 1 : // real object
13 : 1 : let obj = {alpha:'a-z', integer:15003, negated:-20, b1:true, b2:false, myAr:['a', 'b', 'c', 1, 2, 3]};
14 : 1 :
15 : 1 : makeTest(JSON.stringify(obj), obj, 'JSON object roundtrip');
16 : 1 : makeTest('{"日本語":"にほんご"}', {"日本語":"にほんご"}, 'JSON roundtrip with Japanese text');
17 : 1 :
18 [ + ]: 1 : function makeTest(data, expectedResponse, description){
19 : 4 :
20 : 4 : let xhr = setupXHR();
21 : 4 : assert.strictEqual(xhr.responseType, 'json');
22 : 4 :
23 [ + ]: 4 : xhr.onreadystatechange = () => {
24 [ + ]: 11 : if(xhr.readyState === 4){
25 : 4 : assert.strictEqual(xhr.status, 200);
26 : 4 : assert.strictEqual(xhr.responseType, 'json');
27 : 4 : assert.strictEqual(typeof xhr.response, 'object');
28 : 4 :
29 : 4 : // if the expectedResponse is not null, we iterate over properties to do a deeper comparison..
30 [ + ]: 4 : if(expectedResponse){
31 [ + ]: 2 : for(let prop in expectedResponse){
32 [ + ]: 7 : if(expectedResponse[prop] instanceof Array){
33 : 1 : assert.deepStrictEqual(expectedResponse[prop], xhr.response[prop]);
34 [ + ]: 1 : }
35 : 6 : else{
36 : 6 : assert.strictEqual(expectedResponse[prop], xhr.response[prop]);
37 : 6 : }
38 : 7 : }
39 [ + ]: 2 : }
40 : 2 : else{
41 : 2 : assert.strictEqual(xhr.response, expectedResponse); // null comparison, basically
42 : 2 : }
43 : 4 : assert.strictEqual(xhr.response, xhr.response, 'Response should be cached');
44 : 4 : xhr.onreadystatechange = null;
45 : 4 : }
46 : 4 : };
47 : 4 :
48 : 4 : xhr.send(data);
49 : 4 : }
50 : 1 :
51 [ + ]: 1 : function setupXHR(){
52 : 4 : let xhr = new XMLHttpRequest();
53 : 4 :
54 : 4 : xhr.open('POST', `${activeURL}/content.py`, true);
55 : 4 : xhr.responseType = 'json';
56 : 4 :
57 : 4 : return xhr;
58 : 4 : }
59 : 1 : }
60 : 2 :
61 : 2 : /*
62 : 2 : * response-json.htm
63 : 2 : *
64 : 2 :
65 : 2 : <!doctype html>
66 : 2 : <html>
67 : 2 : <head>
68 : 2 : <title>XMLHttpRequest: responseType json</title>
69 : 2 : <meta charset="utf-8">
70 : 2 : <script src="/resources/testharness.js"></script>
71 : 2 : <script src="/resources/testharnessreport.js"></script>
72 : 2 : <link rel="help" href="https://xhr.spec.whatwg.org/#the-responsetype-attribute" data-tested-assertations="following::OL[1]/LI[4]" />
73 : 2 : <link rel="help" href="https://xhr.spec.whatwg.org/#the-response-attribute" data-tested-assertations="following::dt[2]/dt[4] following::dt[2]/dt[4]/following::dd[1]" />
74 : 2 : <link rel="help" href="https://xhr.spec.whatwg.org/#json-response-entity-body" data-tested-assertations="following::ol[1]/li[1] following::ol[1]/li[2] following::ol[1]/li[3]" />
75 : 2 :
76 : 2 : </head>
77 : 2 : <body>
78 : 2 : <div id="log"></div>
79 : 2 : <script>
80 : 2 : function setupXHR () {
81 : 2 : var client = new XMLHttpRequest()
82 : 2 : client.open('POST', "resources/content.py", true)
83 : 2 : client.responseType = 'json'
84 : 2 : return client
85 : 2 : }
86 : 2 : function makeTest(data, expectedResponse, description){
87 : 2 : var test = async_test(description)
88 : 2 : var xhr = setupXHR()
89 : 2 : assert_equals(xhr.responseType, 'json')
90 : 2 : xhr.onreadystatechange = function(){
91 : 2 : if(xhr.readyState === 4){
92 : 2 : test.step(function(){
93 : 2 : assert_equals(xhr.status, 200)
94 : 2 : assert_equals(xhr.responseType, 'json')
95 : 2 : assert_equals(typeof xhr.response, 'object')
96 : 2 : if(expectedResponse){ // if the expectedResponse is not null, we iterate over properties to do a deeper comparison..
97 : 2 : for(var prop in expectedResponse){
98 : 2 : if (expectedResponse[prop] instanceof Array) {
99 : 2 : assert_array_equals(expectedResponse[prop], xhr.response[prop])
100 : 2 : }else{
101 : 2 : assert_equals(expectedResponse[prop], xhr.response[prop])
102 : 2 : }
103 : 2 : }
104 : 2 : }else{
105 : 2 : assert_equals(xhr.response, expectedResponse) // null comparison, basically
106 : 2 : }
107 : 2 : assert_equals(xhr.response, xhr.response,
108 : 2 : "Response should be cached")
109 : 2 : test.done()
110 : 2 : })
111 : 2 : }
112 : 2 : }
113 : 2 : xhr.send(data)
114 : 2 : }
115 : 2 : // no data
116 : 2 : makeTest("", null, 'json response with no data: response property is null')
117 : 2 : // malformed
118 : 2 : makeTest('{"test":"foo"', null, 'json response with malformed data: response property is null')
119 : 2 : // real object
120 : 2 : var obj = {alpha:'a-z', integer:15003, negated:-20, b1:true, b2:false, myAr:['a', 'b', 'c', 1, 2, 3]}
121 : 2 : makeTest(JSON.stringify(obj), obj, 'JSON object roundtrip')
122 : 2 : makeTest('{"日本語":"にほんご"}', {"日本語":"にほんご"}, 'JSON roundtrip with Japanese text')
123 : 2 : </script>
124 : 2 : </body>
125 : 2 : </html>
126 : 2 :
127 : 2 : *
128 : 2 : * response-json.htm
129 : 2 : */
|