Skip to content

Commit

Permalink
fix: Promise is not rejected if a request has failed.
Browse files Browse the repository at this point in the history
  • Loading branch information
grappendorf committed Aug 6, 2015
1 parent 7abe22e commit d78f97b
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 53 deletions.
41 changes: 32 additions & 9 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ module.exports = function(grunt) {

copy: {
options: {
processContent: function (content, srcpath) {
processContent: function(content, srcpath) {
return grunt.template.process(content);
}
},
Expand All @@ -38,7 +38,7 @@ module.exports = function(grunt) {
coffeelint: {
src: ['src/*.coffee'],
options: {
max_line_length: { level: 'ignore' }
max_line_length: {level: 'ignore'}
}
},

Expand Down Expand Up @@ -82,7 +82,31 @@ module.exports = function(grunt) {
},

connect: {
server: {}
server: {
options: {
middleware: function(connect, options, middlewares) {
middlewares.unshift(function(req, res, next) {
if (req.url === '/example_data') {
res.end(JSON.stringify([
{"name": "Alice", "role": "Manage"},
{"name": "Bob", "role": "Developer"},
{"name": "Carol", "role": "Sales"}]
));
} else if (req.url === '/data') {
res.end(JSON.stringify([1, 2, 3]));
} else if (req.url === '/special_data') {
res.end(JSON.stringify([42]));
} else if (req.url === '/request_with_error') {
res.statusCode = 401;
res.end('{"error":"Something terrible happened!"}');
} else {
return next();
}
});
return middlewares;
}
}
}
},

watch: {
Expand Down Expand Up @@ -113,17 +137,16 @@ module.exports = function(grunt) {
updateConfigs: ['pkg'],
commit: true,
commitFiles: ['-a'],
commitMessage:'Bump version number to %VERSION%',
commitMessage: 'Bump version number to %VERSION%',
createTag: true,
tagName: '%VERSION%',
tagMessage:'Version %VERSION%',
tagMessage: 'Version %VERSION%',
push: false
}
},

changelog: {
options: {
}
options: {}
},

shell: {
Expand All @@ -147,7 +170,7 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-text-replace');

grunt.registerTask('build', 'Compile all assets and create the distribution files',
['less', 'coffeelint', 'coffee', 'htmlbuild', 'replace']);
['less', 'coffeelint', 'coffee', 'htmlbuild', 'replace']);

grunt.registerTask('wct-test', function() {
var
Expand Down Expand Up @@ -180,6 +203,6 @@ module.exports = function(grunt) {
});

grunt.registerTask('default', 'Build the software, start a web server and watch for changes',
['build', 'connect', 'watch']
['build', 'connect', 'watch']
);
};
56 changes: 44 additions & 12 deletions grapp-rest-resource.html
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@
},
token: {
type: String
},
request: {
type: Object
}
},
ready: function() {
Expand All @@ -64,49 +67,63 @@
index: function() {
return new Promise(function(resolve, reject) {
return self._sendRequest('GET', self.indexUrl).then(function(request) {
return self._handleResponse(request.response, request.xhr.status, resolve, reject);
return self._handleResponse(request.response, request.xhr.status, resolve);
}, function() {
return self._handleError(self.request.xhr.response, self.request.xhr.status, reject);
});
});
},
show: function(id) {
return new Promise(function(resolve, reject) {
return self._sendRequest('GET', self.showUrl, id).then(function(request) {
return self._handleResponse(request.response, request.xhr.status, resolve, reject);
return self._handleResponse(request.response, request.xhr.status, resolve);
}, function() {
return self._handleError(self.request.xhr.response, self.request.xhr.status, reject);
});
});
},
"new": function() {
return new Promise(function(resolve, reject) {
return self._sendRequest('GET', self.newUrl, null, 'new').then(function(request) {
return self._handleResponse(request.response, request.xhr.status, resolve, reject);
return self._handleResponse(request.response, request.xhr.status, resolve);
}, function() {
return self._handleError(self.request.xhr.response, self.request.xhr.status, reject);
});
});
},
create: function(data) {
return new Promise(function(resolve, reject) {
return self._sendRequest('POST', self.createUrl, null, data).then(function(request) {
return self._handleResponse(request.response, request.xhr.status, resolve, reject);
return self._handleResponse(request.response, request.xhr.status, resolve);
}, function() {
return self._handleError(self.request.xhr.response, self.request.xhr.status, reject);
});
});
},
update: function(id, data) {
return new Promise(function(resolve, reject) {
return self._sendRequest('PUT', self.updateUrl, id, data).then(function(request) {
return self._handleResponse(request.response, request.xhr.status, resolve, reject);
return self._handleResponse(request.response, request.xhr.status, resolve);
}, function() {
return self._handleError(self.request.xhr.response, self.request.xhr.status, reject);
});
});
},
destroy: function(id) {
return new Promise(function(resolve, reject) {
return self._sendRequest('DELETE', self.destroyUrl, id).then(function(request) {
return self._handleResponse(request.response, request.xhr.status, resolve, reject);
return self._handleResponse(request.response, request.xhr.status, resolve);
}, function() {
return self._handleError(self.request.xhr.response, self.request.xhr.status, reject);
});
});
},
memberAction: function(id, action) {
return new Promise(function(resolve, reject) {
return self._sendRequest('PUT', self.memberUrl, id, action).then(function(request) {
return self._handleResponse(request.response, request.xhr.status, resolve, reject);
return self._handleResponse(request.response, request.xhr.status, resolve);
}, function() {
return self._handleError(self.request.xhr.response, self.request.xhr.status, reject);
});
});
}
Expand Down Expand Up @@ -146,7 +163,6 @@
return h;
},
_sendRequest: function(method, url, id, data, action) {
var request;
if (id == null) {
id = null;
}
Expand All @@ -156,8 +172,8 @@
if (action == null) {
action = null;
}
request = this._createRequestElement();
return request.send({
this.request = this._createRequestElement();
return this.request.send({
method: method,
url: this._prepareUrl(url || this.url, this.params, id, action),
headers: this._prepareHeaders(),
Expand All @@ -167,7 +183,7 @@
_createRequestElement: function() {
return document.createElement('iron-request');
},
_handleResponse: function(response, status, resolve, reject) {
_handleResponse: function(response, status, resolve) {
var json;
json = (response && response.trim() !== '' ? JSON.parse(response) : {});
if (status >= 200 && status <= 299) {
Expand All @@ -176,7 +192,23 @@
status: status
});
} else if (status === 401) {
self.fire('grapp-authentication-error');
this.fire('grapp-authentication-error');
return reject({
data: json,
status: status
});
} else {
return reject({
data: json,
status: status
});
}
},
_handleError: function(response, status, reject) {
var json;
json = (response && response.trim() !== '' ? JSON.parse(response) : {});
if (status === 401) {
this.fire('grapp-authentication-error');
return reject({
data: json,
status: status
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ <h2>Demo</h2>
<dom-module id="demo-element">
<template>

<grapp-rest-resource id="data" url="test/example.json"></grapp-rest-resource>
<grapp-rest-resource id="data" url="/example_data"></grapp-rest-resource>

<div>Response code: <span>[[status]]</span></div>
<template is="dom-repeat" items="[[items]]">
Expand Down
47 changes: 35 additions & 12 deletions src/grapp-rest-resource.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ Polymer
destroyUrl: {type: String}
memberUrl: {type: String}
headers: {type: Object, value: {}}
token: {type: String}
token: {type: String},
request: {type: Object}

ready: ->
self = @
Expand All @@ -23,37 +24,51 @@ Polymer
index: ->
new Promise (resolve, reject) ->
self._sendRequest('GET', self.indexUrl).then (request) ->
self._handleResponse request.response, request.xhr.status, resolve, reject
self._handleResponse request.response, request.xhr.status, resolve
, ->
self._handleError self.request.xhr.response, self.request.xhr.status, reject

show: (id) ->
new Promise (resolve, reject) ->
self._sendRequest('GET', self.showUrl, id).then (request) ->
self._handleResponse request.response, request.xhr.status, resolve, reject
self._handleResponse request.response, request.xhr.status, resolve
, ->
self._handleError self.request.xhr.response, self.request.xhr.status, reject

new: () ->
new Promise (resolve, reject) ->
self._sendRequest('GET', self.newUrl, null, 'new').then (request) ->
self._handleResponse request.response, request.xhr.status, resolve, reject
self._handleResponse request.response, request.xhr.status, resolve
, ->
self._handleError self.request.xhr.response, self.request.xhr.status, reject

create: (data) ->
new Promise (resolve, reject) ->
self._sendRequest('POST', self.createUrl, null, data).then (request) ->
self._handleResponse request.response, request.xhr.status, resolve, reject
self._handleResponse request.response, request.xhr.status, resolve
, ->
self._handleError self.request.xhr.response, self.request.xhr.status, reject

update: (id, data) ->
new Promise (resolve, reject) ->
self._sendRequest('PUT', self.updateUrl, id, data).then (request) ->
self._handleResponse request.response, request.xhr.status, resolve, reject
self._handleResponse request.response, request.xhr.status, resolve
, ->
self._handleError self.request.xhr.response, self.request.xhr.status, reject

destroy: (id) ->
new Promise (resolve, reject) ->
self._sendRequest('DELETE', self.destroyUrl, id).then (request) ->
self._handleResponse request.response, request.xhr.status, resolve, reject
self._handleResponse request.response, request.xhr.status, resolve
, ->
self._handleError self.request.xhr.response, self.request.xhr.status, reject

memberAction: (id, action) ->
new Promise (resolve, reject) ->
self._sendRequest('PUT', self.memberUrl, id, action).then (request) ->
self._handleResponse request.response, request.xhr.status, resolve, reject
self._handleResponse request.response, request.xhr.status, resolve
, ->
self._handleError self.request.xhr.response, self.request.xhr.status, reject

_prepareUrl: (url, params, id, action) ->
params = JSON.parse(params) if typeof(params) == 'string'
Expand All @@ -75,8 +90,8 @@ Polymer
h

_sendRequest: (method, url, id = null, data = null, action = null) ->
request = @_createRequestElement()
request.send
@request = @_createRequestElement()
@request.send
method: method
url: @_prepareUrl url || @url, @params, id, action
headers: @_prepareHeaders()
Expand All @@ -85,12 +100,20 @@ Polymer
_createRequestElement: ->
document.createElement 'iron-request'

_handleResponse: (response, status, resolve, reject) ->
_handleResponse: (response, status, resolve) ->
json = (if response && response.trim() != '' then JSON.parse response else {})
if status >= 200 && status <= 299
resolve data: json, status: status
else if status == 401
self.fire 'grapp-authentication-error'
@fire 'grapp-authentication-error'
reject data: json, status: status
else
reject data: json, status: status

_handleError: (response, status, reject) ->
json = (if response && response.trim() != '' then JSON.parse response else {})
if status == 401
@fire 'grapp-authentication-error'
reject data: json, status: status
else
reject data: json, status: status
17 changes: 14 additions & 3 deletions test/basic.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@
</head>
<body>

<grapp-rest-resource id="element" url="data.json" headers='{"foo":123}'></grapp-rest-resource>
<grapp-rest-resource id="element" url="/data" headers='{"foo":123}'></grapp-rest-resource>

<grapp-rest-resource id="element_with_special_url" url="data.json"
index-url="special_data.json"></grapp-rest-resource>
<grapp-rest-resource id="element_with_special_url" url="/data"
index-url="/special_data"></grapp-rest-resource>

<grapp-rest-resource id="element_with_request_error" url="/request_with_error"></grapp-rest-resource>

<script type="text/coffeescript">

Expand All @@ -37,6 +39,15 @@
expect(response.data).to.eql [42]
done()

describe 'when a request terminates with an error', ->

it 'rejects the promise', (done) ->
element = document.querySelector '#element_with_request_error'
element.resource.index().then (response) ->
expect.fail
, ->
done()

</script>

</body>
Expand Down
1 change: 0 additions & 1 deletion test/data.json

This file was deleted.

14 changes: 0 additions & 14 deletions test/example.json

This file was deleted.

1 change: 0 additions & 1 deletion test/special_data.json

This file was deleted.

0 comments on commit d78f97b

Please sign in to comment.