Skip to content

Commit e756077

Browse files
authored
Merge pull request #97 from shssoichiro/handle-response-error-interceptors
Apply response error interceptors to mocked responses
2 parents f049591 + 9b1d64b commit e756077

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

lib/httpMock.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ function mockTemplate() {
1717

1818
var interceptors = $httpProvider.interceptors;
1919

20+
function statusIsSuccessful(status){
21+
return status >= 200 && status <= 299;
22+
}
23+
2024
function getInterceptor(interceptorExpression) {
2125
if (angular.isString(interceptorExpression)) {
2226
return $injector.get(interceptorExpression);
@@ -82,11 +86,20 @@ function mockTemplate() {
8286
for (var i = interceptors.length - 1; i >= 0; i--) {
8387
var interceptor = getInterceptor(interceptors[i]);
8488

85-
if (interceptor.response) {
89+
if (interceptor.response &&
90+
(response.status === undefined || statusIsSuccessful(response.status))
91+
) {
8692
$q.when(interceptor.response(response)).then(function(interceptedResponse){
8793
response = interceptedResponse;
8894
});
8995
}
96+
97+
if (interceptor.responseError &&
98+
!(response.status === undefined || statusIsSuccessful(response.status))) {
99+
$q.reject(interceptor.responseError(response)).then(null, function(interceptedResponse){
100+
response = interceptedResponse;
101+
});
102+
}
90103
}
91104

92105
return response;
@@ -214,10 +227,6 @@ function mockTemplate() {
214227
return myPromise;
215228
}
216229

217-
function statusIsSuccessful(status){
218-
return status >= 200 && status <= 299;
219-
}
220-
221230
function createHeaderGetterFunction(responseHeaders){
222231
return function(headerName) {
223232
if (!headerName) {

tests/interceptors.test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ describe('interceptors', function(){
6060
}
6161

6262
return response;
63+
},
64+
responseError: function(response){
65+
if(response.config.url.match(/response-error/)){
66+
response.data.interceptedResponseError = true;
67+
}
68+
69+
return $q.reject(response);
6370
}
6471
}
6572
}]);
@@ -129,6 +136,17 @@ describe('interceptors', function(){
129136
});
130137
});
131138

139+
it('allows for intercepts handling an error response', function(done){
140+
http({
141+
method: 'GET',
142+
url: 'test-url.com/response-error'
143+
}).catch(function(response){
144+
expect(response.data.interceptedResponseError).toBe(true);
145+
expect(response.data.name).toBe('intercept test');
146+
done();
147+
});
148+
});
149+
132150
it('provides default empty object headers if none are set', function(done){
133151
http({
134152
method: 'GET',

tests/setup.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,19 @@
169169
}
170170
}
171171
},
172+
{
173+
request: {
174+
path: '/response-error',
175+
interceptedRequest: true,
176+
method: 'get'
177+
},
178+
response: {
179+
data: {
180+
name: 'intercept test'
181+
},
182+
status: 400
183+
}
184+
},
172185
{
173186
request: {
174187
path: '/anonymous-intercept',

0 commit comments

Comments
 (0)