qd-ajax v2.0.0
qd-ajax
Ember-friendly jQuery.ajax wrapper.
- returns RSVP promises
- makes apps more testable (resolves promises with
Ember.run) - makes testing ajax simpler with fixture support
Installation
Browser Package
bower install --save qd-ajax- link to global or AMD build in Bower Components directory
- Global -
<script src="/bower_components/qd-ajax/dist/qd-ajax.js"></script> - AMD -
<script src="/bower_components/qd-ajax/dist/qd-ajax.amd.js"></script>
- Global -
Server Side Package
Server side package is a Broccoli.js plugin that concatinates all of the fixtures into a single file that you can consume in your browser app.
npm install --save-dev qd-ajax
In your Brocfile.js
var concatFixtures = require('qd-ajax');
// concatFixtures( inputTree, moduleName, outputFile )
return concatFixtures('fixtures', 'fixtures', '/fixtures.js');API
This lib simply wraps jQuery.ajax with two exceptions:
- success and error callbacks are not supported
- does not resolve three arguments like $.ajax (real promises only
resolve a single value).
requestonly resolves the response data from the request, whilerawresolves an object with the three "arguments" as keys if you need them.
Other than that, use request exactly like $.ajax.
var ajax = qd.ajax;
App.ApplicationRoute = Ember.Route.extend({
model: function() {
return ajax.request('/foo');
}
}
// if you need access to the jqXHR or textStatus, use raw
ajax.raw('/foo').then(function(result) {
// result.response
// result.textStatus
// result.jqXHR
});Ember Data
By default, if Ember Data is on the page, qd-ajax will override the
RESTAdapter's ajax method to use qd-ajax instead of jQuery's ajax.
To opt out of the behavior, you can set qd.ajax.request.OVERRIDE_REST_ADAPTER = false
after loading qd-ajax.
Simplified Testing with Fixtures
Adding fixtures with defineFixture tells qd-ajax to resolve the promise
with the fixture matching a url instead of making a request. This allows
you to test your app without creating fake servers with sinon, etc.
Example:
qd.ajax.defineFixture('api/v1/courses', {
response: [{name: 'basket weaving'}],
jqXHR: {},
textStatus: 'success'
});
qd.ajax.request('api/v1/courses').then(function(result) {
deepEqual(result, qd.ajax.lookupFixture('api/v1/courses').response);
});To test failure paths, set the textStatus to anything but success.
You can reset defined fixtures between tests with qd.ajax.resetFixtures().
module('testing calls', {
setup: function() {
qd.ajax.resetFixtures();
}
});By default, qd.ajax resolves responses synchronously. To simulate real world asynchronous requests, you can use the delay helper or activate default delay with qd.ajax.request.DELAY_RESPONSE=true. You can also set the default delay time with qd.ajax.request.DELAY_TIME=3000;;
Fixture Helpers
delay(payload, time)
Delay helper returns promise that will resolve after period of time specified by time parameter. The time parameter is optional and defaults to 250ms.
qd.ajax.defineFixture('api/v1/courses', function(){
return this.delay({
response: [{name: 'basket weaving'}],
jqXHR: {},
textStatus: 'success'
}, 300);
});success(payload)
Return jQuery.ajax compatible success response.
qd.ajax.defineFixture('api/v1/courses', function() {
return this.success([{name: 'basket weaving'}]);
});error(textStatus, errorThrown)
Return jQuery.ajax compatible error response.
qd.ajax.defineFixture('api/v1/courses', function() {
return this.error();
});Contributing
Install dependencies and run tests with the following:
npm install
npm testFor those of you with release privileges:
npm run-script releaseSpecial Thanks
Forked from ic-ajax by Instructure. Original code inspired by discourse ajax.
License and Copyright
MIT Style license
(c) 2014 Quandl Inc.