Skip to content

Commit 06c04c4

Browse files
adamvossenchev
authored andcommitted
Improve error message of fetch when xhr.onerror occurs (NativeScript#3003)
* Ensure fetch-tests fail (instead of timeout) on failure * Standardize failure handling in fetch-tests * Improve flawed failure condition of test_fetch_json Previously, the assertion was always true * Implement better error message for for xhr.onerror within fetch
1 parent 329817a commit 06c04c4

2 files changed

Lines changed: 34 additions & 87 deletions

File tree

‎tests/app/fetch-tests.ts‎

Lines changed: 32 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,7 @@ export var test_fetch = function (done: (err: Error, res?: string) => void) {
1414
TKUnit.assert(r instanceof Response, "Result from fetch() should be valid Response object! Actual result is: " + r);
1515
done(null);
1616
// << (hide)
17-
}, function (e) {
18-
// Argument (e) is Error!
19-
// >> (hide)
20-
done(e);
21-
// << (hide)
22-
});
17+
}).catch(failOnError(done));
2318
// << fetch-response
2419
};
2520

@@ -31,12 +26,7 @@ export var test_fetch_text = function (done: (err: Error, res?: string) => void)
3126
TKUnit.assert(types.isString(r), "Result from text() should be string! Actual result is: " + r);
3227
done(null);
3328
// << (hide)
34-
}, function (e) {
35-
// Argument (e) is Error!
36-
// >> (hide)
37-
done(e);
38-
// << (hide)
39-
});
29+
}).catch(failOnError(done));
4030
// << fetch-string
4131
};
4232

@@ -45,15 +35,10 @@ export var test_fetch_json = function (done: (err: Error, res?: string) => void)
4535
fetch("https://httpbin.org/get").then(response => { return response.json(); }).then(function (r) {
4636
// Argument (r) is JSON object!
4737
// >> (hide)
48-
TKUnit.assert(types.isString(JSON.stringify(r)), "Result from json() should be JSON object! Actual result is: " + r);
38+
TKUnit.assertNotNull(r, "Result from json() should be JSON object!");
4939
done(null);
5040
// << (hide)
51-
}, function (e) {
52-
// Argument (e) is Error!
53-
// >> (hide)
54-
done(e);
55-
// << (hide)
56-
});
41+
}).catch(failOnError(done));
5742
// << fetch-json
5843
};
5944

@@ -65,12 +50,7 @@ export var test_fetch_formData = function (done: (err: Error, res?: string) => v
6550
TKUnit.assert(r instanceof FormData, "Result from formData() should be FormData object! Actual result is: " + r);
6651
done(null);
6752
// << (hide)
68-
}, function (e) {
69-
// Argument (e) is Error!
70-
// >> (hide)
71-
done(e);
72-
// << (hide)
73-
});
53+
}).catch(failOnError(done));
7454
// << fetch-formdata
7555
};
7656

@@ -81,7 +61,14 @@ export var test_fetch_fail_invalid_url = function (done) {
8161
fetch("hgfttp://httpbin.org/get").catch(function (e) {
8262
completed = true;
8363
done(null)
84-
});
64+
}).catch(failOnError(done));
65+
};
66+
67+
export var test_fetch_invalid_url_fail_message = function (done) {
68+
fetch("hgfttp://httpbin.org/get").catch(function (e: TypeError) {
69+
TKUnit.assert(e.message.match(/Network request failed:.{2,}/), "Failure message should contain details on the failure. Actual message was: " + e.message);
70+
done(null);
71+
}).catch(failOnError(done));
8572
};
8673

8774
export var test_fetch_response_status = function (done) {
@@ -91,20 +78,10 @@ export var test_fetch_response_status = function (done) {
9178
// Argument (response) is Response!
9279
var statusCode = response.status;
9380
// >> (hide)
94-
try {
95-
TKUnit.assert(types.isDefined(statusCode), "response.status should be defined! Actual result is: " + statusCode);
96-
done(null);
97-
}
98-
catch (err) {
99-
done(err);
100-
}
81+
TKUnit.assert(types.isDefined(statusCode), "response.status should be defined! Actual result is: " + statusCode);
82+
done(null);
10183
// << (hide)
102-
}, function (e) {
103-
// Argument (e) is Error!
104-
// >> (hide)
105-
done(e);
106-
// << (hide)
107-
});
84+
}).catch(failOnError(done));
10885
// << fetch-status-response
10986
};
11087

@@ -115,20 +92,10 @@ export var test_fetch_response_headers = function (done) {
11592
// Argument (response) is Response!
11693
// var all = response.headers.getAll();
11794
// >> (hide)
118-
try {
119-
TKUnit.assert(types.isDefined(response.headers), "response.headers should be defined! Actual result is: " + response.headers);
120-
done(null);
121-
}
122-
catch (err) {
123-
done(err);
124-
}
95+
TKUnit.assert(types.isDefined(response.headers), "response.headers should be defined! Actual result is: " + response.headers);
96+
done(null);
12597
// << (hide)
126-
}, function (e) {
127-
// Argument (e) is Error!
128-
// >> (hide)
129-
done(e);
130-
// << (hide)
131-
});
98+
}).catch(failOnError(done));
13299
// << fetch-headers-response
133100
};
134101

@@ -138,16 +105,9 @@ export var test_fetch_headers_sent = function (done) {
138105
headers: { "Content-Type": "application/json" }
139106
}).then(function (response) {
140107
var result = response.headers;
141-
try {
142-
TKUnit.assert(result.get("Content-Type") === "application/json", "Headers not sent/received properly! Actual result is: " + result);
143-
done(null);
144-
}
145-
catch (err) {
146-
done(err);
147-
}
148-
}, function (e) {
149-
done(e);
150-
});
108+
TKUnit.assert(result.get("Content-Type") === "application/json", "Headers not sent/received properly! Actual result is: " + result);
109+
done(null);
110+
}).catch(failOnError(done));
151111
};
152112

153113
export var test_fetch_post_form_data = function (done) {
@@ -162,16 +122,9 @@ export var test_fetch_post_form_data = function (done) {
162122
}).then(r => {
163123
return r.formData();
164124
}).then(function (r) {
165-
try {
166-
TKUnit.assert(r instanceof FormData, "Content not sent/received properly! Actual result is: " + r);
167-
done(null);
168-
}
169-
catch (err) {
170-
done(err);
171-
}
172-
}, function (e) {
173-
done(e);
174-
});
125+
TKUnit.assert(r instanceof FormData, "Content not sent/received properly! Actual result is: " + r);
126+
done(null);
127+
}).catch(failOnError(done));
175128
};
176129

177130
export var test_fetch_post_json = function (done) {
@@ -182,20 +135,14 @@ export var test_fetch_post_json = function (done) {
182135
body: JSON.stringify({ MyVariableOne: "ValueOne", MyVariableTwo: "ValueTwo" })
183136
}).then(r => { return r.json(); }).then(function (r) {
184137
// >> (hide)
185-
try {
186-
TKUnit.assert(r.json["MyVariableOne"] === "ValueOne" && r.json["MyVariableTwo"] === "ValueTwo", "Content not sent/received properly! Actual result is: " + r.json);
187-
done(null);
188-
}
189-
catch (err) {
190-
done(err);
191-
}
138+
TKUnit.assert(r.json["MyVariableOne"] === "ValueOne" && r.json["MyVariableTwo"] === "ValueTwo", "Content not sent/received properly! Actual result is: " + r.json);
139+
done(null);
192140
// << (hide)
193141
// console.log(result);
194-
}, function (e) {
195-
// >> (hide)
196-
done(e);
197-
// << (hide)
198-
// console.log("Error occurred " + e);
199-
});
142+
}).catch(failOnError(done));
200143
// << fetch-post-json
201144
};
145+
146+
const failOnError = function (done: (err: Error, res?: string) => void) {
147+
return e => done(e);
148+
}

‎tns-core-modules/fetch/fetch.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@
310310
resolve(new Response(xhr.responseText, options))
311311
}
312312

313-
xhr.onerror = function () {
314-
reject(new TypeError('Network request failed'))
313+
xhr.onerror = function (error) {
314+
reject(new TypeError(['Network request failed:', error.message].join(' ')))
315315
}
316316

317317
xhr.open(request.method, request.url, true)

0 commit comments

Comments
 (0)