Skip to content

Commit 37438c2

Browse files
T-Wizardpeol
authored andcommitted
Use Promise.reject instead of throw in the api response interceptor (qlik-oss#267)
* Use Promise.reject instead of throw in the api response interceptor This is to play nice with the error logging in the angular 1.x Promise implementation (used in the sense client) (Most of the time we get this error it is not an actual error but just the client testing if an object exists) * Use promise constructor to reject interceptors * Fix typo in intercept test * Update code style to match other interceptors
1 parent dd78b47 commit 37438c2

File tree

5 files changed

+31
-27
lines changed

5 files changed

+31
-27
lines changed

src/interceptors/response/api.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default function apiInterceptor(session, request, response) {
1515
genericType: response.qGenericType,
1616
});
1717
} else if (response.qHandle === null && response.qType === null) {
18-
throw new Error('Object not found');
18+
return session.config.Promise.reject(new Error('Object not found'));
1919
}
2020
return response;
2121
}

src/interceptors/response/error.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ export default function errorInterceptor(session, request, response) {
1111
const error = new Error(data.message);
1212
error.code = data.code;
1313
error.parameter = data.parameter;
14-
// reject the promise chain:
15-
throw error;
14+
return session.config.Promise.reject(error);
1615
}
1716
return response;
1817
}

test/unit/intercept.spec.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,25 @@ import ApiCache from '../../src/api-cache';
55
describe('Intercept', () => {
66
let intercept;
77
let apis;
8+
let session;
89

910
beforeEach(() => {
1011
apis = new ApiCache();
12+
session = { config: { Promise } };
1113
intercept = new Intercept({ Promise, apis });
1214
});
1315

1416
describe('intercept', () => {
1517
it('should call interceptors onFulfilled', () => {
1618
intercept.response = [{ onFulfilled: sinon.stub().returns({ bar: {} }) }];
17-
return expect(intercept.executeResponses({}, Promise.resolve({ foo: {} })))
19+
return expect(intercept.executeResponses(session, Promise.resolve({ foo: {} })))
1820
.to.eventually.deep.equal({ bar: {} });
1921
});
2022

2123
it('should reject and stop the interceptor chain', () => {
2224
const spyFulFilled = sinon.spy();
2325
intercept.response = [{ onFulfilled() { return Promise.reject(new Error('foo')); } }, { onFulfilled: spyFulFilled }];
24-
return expect(intercept.executeResponses({}, Promise.resolve()).then(() => {}, (err) => {
26+
return expect(intercept.executeResponses(session, Promise.resolve()).then(() => {}, (err) => {
2527
expect(spyFulFilled.callCount).to.equal(0);
2628
return Promise.reject(err);
2729
})).to.eventually.be.rejectedWith('foo').and.be.an.instanceOf(Error);
@@ -33,7 +35,7 @@ describe('Intercept', () => {
3335
{ onFulfilled() { return Promise.reject(new Error('should never happen!')); } },
3436
{ onFulfilled() {}, onRejected },
3537
];
36-
return expect(intercept.executeResponses({}, Promise.resolve(), {})).to.eventually.equal('foo');
38+
return expect(intercept.executeResponses(session, Promise.resolve(), {})).to.eventually.equal('foo');
3739
});
3840

3941
it('should call api interceptor at last', () => {
@@ -49,7 +51,11 @@ describe('Intercept', () => {
4951
};
5052
const dummyInterceptor = { onFulfilled: (a, b, c) => c, onRejected: sinon.stub() };
5153
intercept = new Intercept({ Promise, apis, response: [dummyInterceptor] });
52-
const interceptedResponse = intercept.executeResponses({}, Promise.resolve(response), {});
54+
const interceptedResponse = intercept.executeResponses(
55+
{ config: { Promise } },
56+
Promise.resolve(response),
57+
{},
58+
);
5359
return expect(interceptedResponse).to.eventually.be.rejectedWith('Object not found')
5460
.then(() => expect(dummyInterceptor.onRejected.callCount).to.equal(0));
5561
});
+6-5
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
import apiInterceptor from '../../../../src/interceptors/response/api';
22

3+
// eslint-disable-next-line no-restricted-globals
4+
const session = { config: { Promise }, getObjectApi: sinon.stub().returns('dummy') };
5+
36
describe('Response interceptor: API', () => {
47
it('should generate api if handle/type exists', () => {
5-
const session = { getObjectApi: sinon.stub().returns('dummy') };
68
const response = { qHandle: 1, qType: 'Doc', qGenericId: '123' };
79
const out = apiInterceptor(session, {}, response);
810
expect(session.getObjectApi.called).to.equal(true);
911
expect(out).to.equal('dummy');
1012
});
1113

12-
it('should throw error when handle/type is null', () => {
13-
const session = { getObjectApi: sinon.stub().returns('dummy') };
14+
it('should return rejected promise when handle/type is null', () => {
1415
const response = { qHandle: null, qType: null };
15-
expect(() => apiInterceptor(session, {}, response)).to.throw();
16+
return apiInterceptor(session, {}, response).catch(err => expect(err).to.be.an('error'));
1617
});
1718

1819
it('should leave response untouched if handle/type is missing', () => {
1920
const response = { foo: { bar: {} } };
20-
const out = apiInterceptor({}, {}, response);
21+
const out = apiInterceptor(session, {}, response);
2122
expect(out).to.equal(response);
2223
});
2324
});
+13-15
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
import errorInterceptor from '../../../../src/interceptors/response/error';
22

3+
// eslint-disable-next-line no-restricted-globals
4+
const session = { config: { Promise } };
5+
36
describe('Response interceptor: Error', () => {
4-
it('should throw if the response contains an error', () => {
5-
try {
6-
errorInterceptor({}, {}, { error: { code: 2, parameter: 'param', message: 'msg' } });
7-
expect(true, 'error interceptor did not throw');
8-
} catch (err) {
9-
expect(err instanceof Error).to.equal(true);
10-
expect(err.code).to.equal(2);
11-
expect(err.parameter).to.equal('param');
12-
expect(err.message).to.equal('msg');
13-
expect(err.stack).to.be.a('string');
14-
// check if the test file is included in the stack trace:
15-
expect(err.stack.indexOf('error.spec.js')).to.not.equal(-1);
16-
}
17-
});
7+
it('should throw if the response contains an error', () => errorInterceptor(session, {}, { error: { code: 2, parameter: 'param', message: 'msg' } }).catch((err) => {
8+
expect(err instanceof Error).to.equal(true);
9+
expect(err.code).to.equal(2);
10+
expect(err.parameter).to.equal('param');
11+
expect(err.message).to.equal('msg');
12+
expect(err.stack).to.be.a('string');
13+
// check if the test file is included in the stack trace:
14+
expect(err.stack.indexOf('error.spec.js')).to.not.equal(-1);
15+
}));
1816

1917
it('should not reject if the response does not contain any error', () => {
2018
const response = {};
21-
expect(errorInterceptor({}, {}, response)).to.equal(response);
19+
expect(errorInterceptor(session, {}, response)).to.equal(response);
2220
});
2321
});

0 commit comments

Comments
 (0)