From a687084e6a9eead5aa7a0db733adccd631b8bf3f Mon Sep 17 00:00:00 2001 From: Nik Wakelin Date: Fri, 4 Dec 2015 12:20:12 +0000 Subject: [PATCH] Adds tests for friendly error messages --- .../integration/adapter/rest-adapter-test.js | 66 ++++++++++++++++++- .../rest-adapter/detailed-message-test.js | 52 +++++++++++++++ 2 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 tests/unit/adapters/rest-adapter/detailed-message-test.js diff --git a/tests/integration/adapter/rest-adapter-test.js b/tests/integration/adapter/rest-adapter-test.js index f209197b839..84d0f26de42 100644 --- a/tests/integration/adapter/rest-adapter-test.js +++ b/tests/integration/adapter/rest-adapter-test.js @@ -2194,8 +2194,8 @@ test("calls adapter.handleResponse with the jqXHR and json", function(assert) { } }); -test('calls handleResponse with jqXHR, jqXHR.responseText', function(assert) { - assert.expect(3); +test('calls handleResponse with jqXHR, jqXHR.responseText, and requestData', function(assert) { + assert.expect(4); var originalAjax = Ember.$.ajax; var jqXHR = { status: 400, @@ -2203,13 +2203,19 @@ test('calls handleResponse with jqXHR, jqXHR.responseText', function(assert) { getAllResponseHeaders: function() { return ''; } }; + var expectedRequestData = { + method: "GET", + url: "/posts/1" + }; + Ember.$.ajax = function(hash) { hash.error(jqXHR, jqXHR.responseText, 'Bad Request'); }; - adapter.handleResponse = function(status, headers, json) { + adapter.handleResponse = function(status, headers, json, requestData) { assert.deepEqual(status, 400); assert.deepEqual(json, jqXHR.responseText); + assert.deepEqual(requestData, expectedRequestData); return new DS.AdapterError('nope!'); }; @@ -2312,6 +2318,60 @@ test('on error wraps the error string in an DS.AdapterError object', function(as } }); +test('error handling includes a detailed message from the server', (assert) => { + assert.expect(2); + + let originalAjax = Ember.$.ajax; + let jqXHR = { + status: 500, + responseText: 'An error message, perhaps generated from a backend server!', + getAllResponseHeaders: function() { return 'Content-Type: text/plain'; } + }; + + Ember.$.ajax = function(hash) { + hash.error(jqXHR, 'error'); + }; + + try { + run(function() { + store.find('post', '1').catch(function(err) { + assert.equal(err.message, "Ember Data Request GET /posts/1 returned a 500\nPayload (text/plain)\nAn error message, perhaps generated from a backend server!"); + assert.ok(err, 'promise rejected'); + }); + }); + } finally { + Ember.$.ajax = originalAjax; + } + +}); + +test('error handling with a very long HTML-formatted payload truncates the friendly message', (assert) => { + assert.expect(2); + + let originalAjax = Ember.$.ajax; + let jqXHR = { + status: 500, + responseText: new Array(100).join(""), + getAllResponseHeaders: function() { return 'Content-Type: text/html'; } + }; + + Ember.$.ajax = function(hash) { + hash.error(jqXHR, 'error'); + }; + + try { + run(function() { + store.find('post', '1').catch(function(err) { + assert.equal(err.message, "Ember Data Request GET /posts/1 returned a 500\nPayload (text/html)\n[Omitted Lengthy HTML]"); + assert.ok(err, 'promise rejected'); + }); + }); + } finally { + Ember.$.ajax = originalAjax; + } + +}); + test('findAll resolves with a collection of DS.Models, not DS.InternalModels', (assert) => { assert.expect(4); diff --git a/tests/unit/adapters/rest-adapter/detailed-message-test.js b/tests/unit/adapters/rest-adapter/detailed-message-test.js new file mode 100644 index 00000000000..c705206f695 --- /dev/null +++ b/tests/unit/adapters/rest-adapter/detailed-message-test.js @@ -0,0 +1,52 @@ +import setupStore from 'dummy/tests/helpers/store'; +/* import Ember from 'ember'; */ + +import {module, test} from 'qunit'; + +import DS from 'ember-data'; + +let adapter, env; + +module("unit/adapters/rest_adapter/detailed_message_test - DS.RESTAdapter#generatedDetailedMessage", { + + beforeEach() { + env = setupStore({ adapter: DS.RESTAdapter }); + adapter = env.adapter; + } + +}); + +test("generating a wonderfully friendly error message should work", (assert) => { + assert.expect(1); + + let friendlyMessage = adapter.generatedDetailedMessage( + 418, + { "Content-Type": "text/plain" }, + "I'm a little teapot, short and stout", + { + url: "/teapots/testing", + method: "GET" + } + ); + + assert.equal(friendlyMessage, ["Ember Data Request GET /teapots/testing returned a 418", + "Payload (text/plain)", + "I'm a little teapot, short and stout"].join("\n")); +}); + +test("generating a friendly error message with a missing content-type header should work", (assert) => { + + let friendlyMessage = adapter.generatedDetailedMessage( + 418, + {}, + "I'm a little teapot, short and stout", + { + url: "/teapots/testing", + method: "GET" + } + ); + + assert.equal(friendlyMessage, ["Ember Data Request GET /teapots/testing returned a 418", + "Payload (Empty Content-Type)", + "I'm a little teapot, short and stout"].join("\n")); +});