diff --git a/src/__tests__/lib/apiClient.spec.js b/src/__tests__/lib/apiClient.spec.js index dc498a6..9dbc1b0 100644 --- a/src/__tests__/lib/apiClient.spec.js +++ b/src/__tests__/lib/apiClient.spec.js @@ -234,4 +234,31 @@ describe('ApiClient', () => { }); }); + describe('onError', () => { + const generateError = (status, msg={}, options={}) => { + return fetchMock.mock(`${BASE_URL}/errcatch`, (reqUrl, reqOpts) => { + return { + status, + body: JSON.stringify(msg) + } + }) + } + + it('accept onError option', (done) => { + let p = generateError(401, {msg: 'blah'}); + baseOpts.onError = [(getState, opts) => error => { + error.someProp = 'processed'; + return error; + }]; + client = new ApiClient(baseOpts, () => state); + + client.get({path: '/errcatch'}) + .catch((promise) => { + promise.then((error) => { + expect(error.someProp).to.equal('processed'); + done(); + }); + }) + }) + }); }) diff --git a/src/lib/apiClient.js b/src/lib/apiClient.js index 1ed1669..1507962 100644 --- a/src/lib/apiClient.js +++ b/src/lib/apiClient.js @@ -52,6 +52,7 @@ export class ApiClient { this._parseOpt('requestTransforms', options, baseOpts, []); let responseTransforms = this._parseOpt('responseTransforms', options, baseOpts, [parseJson]); + let catchers = this._parseOpt('onError', options, baseOpts, []); // let requestTransforms = [].concat(reqTransforms); // let responseTransforms = [].concat(respTransforms); @@ -67,7 +68,7 @@ export class ApiClient { .runTransforms(responseTransforms, getState, resp)) .then(this.debugLog(json => `JSON: ${json}`)) .then(resolve) - .catch(err => reject(err)) + .catch(err => reject(catchers.length > 0 ? this.runTransforms(catchers, getState, err): err)) }); } });