diff --git a/FEATURES.md b/FEATURES.md index ab8f59f32f0..2e883106167 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -81,3 +81,4 @@ entry in `config/features.json`. * [403] `DS.ForbiddenError` * [404] `DS.NotFoundError` * [409] `DS.ConflictError` + * [500] `DS.ServerError` diff --git a/addon/adapters/errors.js b/addon/adapters/errors.js index c8962a8bbb2..29c00c8208b 100644 --- a/addon/adapters/errors.js +++ b/addon/adapters/errors.js @@ -155,6 +155,13 @@ export const NotFoundError = extendedErrorsEnabled ? export const ConflictError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation failed due to a conflict') : null; +/** + @class ServerError + @namespace DS +*/ +export const ServerError = extendedErrorsEnabled ? + extend(AdapterError, 'The adapter operation failed due to a server error') : null; + /** @method errorsHashToArray @private diff --git a/addon/adapters/rest.js b/addon/adapters/rest.js index 448c901af26..42841876c98 100644 --- a/addon/adapters/rest.js +++ b/addon/adapters/rest.js @@ -11,6 +11,7 @@ import { ForbiddenError, NotFoundError, ConflictError, + ServerError, TimeoutError, AbortError } from 'ember-data/adapters/errors'; @@ -920,6 +921,10 @@ var RESTAdapter = Adapter.extend(BuildURLMixin, { return new NotFoundError(errors, detailedMessage); case 409: return new ConflictError(errors, detailedMessage); + default: + if (status >= 500) { + return new ServerError(errors, detailedMessage); + } } } diff --git a/addon/index.js b/addon/index.js index cb812ef3567..81963b0358e 100644 --- a/addon/index.js +++ b/addon/index.js @@ -45,6 +45,7 @@ import { ForbiddenError, NotFoundError, ConflictError, + ServerError, TimeoutError, AbortError, errorsHashToArray, @@ -112,6 +113,7 @@ if (isEnabled('ds-extended-errors')) { DS.ForbiddenError = ForbiddenError; DS.NotFoundError = NotFoundError; DS.ConflictError = ConflictError; + DS.ServerError = ServerError; } DS.errorsHashToArray = errorsHashToArray; diff --git a/tests/integration/adapter/rest-adapter-test.js b/tests/integration/adapter/rest-adapter-test.js index f0c0fa26755..22af01b327e 100644 --- a/tests/integration/adapter/rest-adapter-test.js +++ b/tests/integration/adapter/rest-adapter-test.js @@ -2304,7 +2304,7 @@ test('on error appends errorThrown for sanity', function(assert) { if (isEnabled('ds-extended-errors')) { test("rejects promise with a specialized subclass of DS.AdapterError if ajax responds with http error codes", function(assert) { - assert.expect(8); + assert.expect(10); var originalAjax = Ember.$.ajax; var jqXHR = { @@ -2359,6 +2359,18 @@ if (isEnabled('ds-extended-errors')) { }); }); + Ember.$.ajax = function(hash) { + jqXHR.status = 500; + hash.error(jqXHR, 'error'); + }; + + Ember.run(function() { + store.find('post', '1').then(null, function(reason) { + assert.ok(true, 'promise should be rejected'); + assert.ok(reason instanceof DS.ServerError, 'reason should be an instance of DS.ServerError'); + }); + }); + Ember.$.ajax = originalAjax; }); } diff --git a/tests/unit/adapter-errors-test.js b/tests/unit/adapter-errors-test.js index a81950dc419..646d6bc2edb 100644 --- a/tests/unit/adapter-errors-test.js +++ b/tests/unit/adapter-errors-test.js @@ -73,6 +73,14 @@ if (isEnabled('ds-extended-errors')) { assert.equal(error.message, 'The adapter operation failed due to a conflict'); }); + test("DS.ServerError", function(assert) { + var error = new DS.ServerError(); + assert.ok(error instanceof Error); + assert.ok(error instanceof DS.AdapterError); + assert.ok(error.isAdapterError); + assert.equal(error.message, 'The adapter operation failed due to a server error'); + }); + test("CustomAdapterError", function(assert) { var CustomAdapterError = DS.AdapterError.extend(); var error = new CustomAdapterError();