3 var Library = Backbone.Collection.extend({
4 url: function() { return '/library'; }
10 author: 'Bill Shakespeare',
14 QUnit.module('Backbone.sync', {
16 beforeEach: function(assert) {
17 library = new Library;
18 library.create(attrs, {wait: false});
21 afterEach: function(assert) {
22 Backbone.emulateHTTP = false;
27 QUnit.test('read', function(assert) {
30 assert.equal(this.ajaxSettings.url, '/library');
31 assert.equal(this.ajaxSettings.type, 'GET');
32 assert.equal(this.ajaxSettings.dataType, 'json');
33 assert.ok(_.isEmpty(this.ajaxSettings.data));
36 QUnit.test('passing data', function(assert) {
38 library.fetch({data: {a: 'a', one: 1}});
39 assert.equal(this.ajaxSettings.url, '/library');
40 assert.equal(this.ajaxSettings.data.a, 'a');
41 assert.equal(this.ajaxSettings.data.one, 1);
44 QUnit.test('create', function(assert) {
46 assert.equal(this.ajaxSettings.url, '/library');
47 assert.equal(this.ajaxSettings.type, 'POST');
48 assert.equal(this.ajaxSettings.dataType, 'json');
49 var data = JSON.parse(this.ajaxSettings.data);
50 assert.equal(data.title, 'The Tempest');
51 assert.equal(data.author, 'Bill Shakespeare');
52 assert.equal(data.length, 123);
55 QUnit.test('update', function(assert) {
57 library.first().save({id: '1-the-tempest', author: 'William Shakespeare'});
58 assert.equal(this.ajaxSettings.url, '/library/1-the-tempest');
59 assert.equal(this.ajaxSettings.type, 'PUT');
60 assert.equal(this.ajaxSettings.dataType, 'json');
61 var data = JSON.parse(this.ajaxSettings.data);
62 assert.equal(data.id, '1-the-tempest');
63 assert.equal(data.title, 'The Tempest');
64 assert.equal(data.author, 'William Shakespeare');
65 assert.equal(data.length, 123);
68 QUnit.test('update with emulateHTTP and emulateJSON', function(assert) {
70 library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
74 assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
75 assert.equal(this.ajaxSettings.type, 'POST');
76 assert.equal(this.ajaxSettings.dataType, 'json');
77 assert.equal(this.ajaxSettings.data._method, 'PUT');
78 var data = JSON.parse(this.ajaxSettings.data.model);
79 assert.equal(data.id, '2-the-tempest');
80 assert.equal(data.author, 'Tim Shakespeare');
81 assert.equal(data.length, 123);
84 QUnit.test('update with just emulateHTTP', function(assert) {
86 library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
89 assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
90 assert.equal(this.ajaxSettings.type, 'POST');
91 assert.equal(this.ajaxSettings.contentType, 'application/json');
92 var data = JSON.parse(this.ajaxSettings.data);
93 assert.equal(data.id, '2-the-tempest');
94 assert.equal(data.author, 'Tim Shakespeare');
95 assert.equal(data.length, 123);
98 QUnit.test('update with just emulateJSON', function(assert) {
100 library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
103 assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
104 assert.equal(this.ajaxSettings.type, 'PUT');
105 assert.equal(this.ajaxSettings.contentType, 'application/x-www-form-urlencoded');
106 var data = JSON.parse(this.ajaxSettings.data.model);
107 assert.equal(data.id, '2-the-tempest');
108 assert.equal(data.author, 'Tim Shakespeare');
109 assert.equal(data.length, 123);
112 QUnit.test('read model', function(assert) {
114 library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
115 library.first().fetch();
116 assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
117 assert.equal(this.ajaxSettings.type, 'GET');
118 assert.ok(_.isEmpty(this.ajaxSettings.data));
121 QUnit.test('destroy', function(assert) {
123 library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
124 library.first().destroy({wait: true});
125 assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
126 assert.equal(this.ajaxSettings.type, 'DELETE');
127 assert.equal(this.ajaxSettings.data, null);
130 QUnit.test('destroy with emulateHTTP', function(assert) {
132 library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
133 library.first().destroy({
137 assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
138 assert.equal(this.ajaxSettings.type, 'POST');
139 assert.equal(JSON.stringify(this.ajaxSettings.data), '{"_method":"DELETE"}');
142 QUnit.test('urlError', function(assert) {
144 var model = new Backbone.Model();
145 assert.raises(function() {
148 model.fetch({url: '/one/two'});
149 assert.equal(this.ajaxSettings.url, '/one/two');
152 QUnit.test('#1052 - `options` is optional.', function(assert) {
154 var model = new Backbone.Model();
156 Backbone.sync('create', model);
159 QUnit.test('Backbone.ajax', function(assert) {
161 Backbone.ajax = function(settings){
162 assert.strictEqual(settings.url, '/test');
164 var model = new Backbone.Model();
166 Backbone.sync('create', model);
169 QUnit.test('Call provided error callback on error.', function(assert) {
171 var model = new Backbone.Model;
173 Backbone.sync('read', model, {
174 error: function() { assert.ok(true); }
176 this.ajaxSettings.error();
179 QUnit.test('Use Backbone.emulateHTTP as default.', function(assert) {
181 var model = new Backbone.Model;
184 Backbone.emulateHTTP = true;
185 model.sync('create', model);
186 assert.strictEqual(this.ajaxSettings.emulateHTTP, true);
188 Backbone.emulateHTTP = false;
189 model.sync('create', model);
190 assert.strictEqual(this.ajaxSettings.emulateHTTP, false);
193 QUnit.test('Use Backbone.emulateJSON as default.', function(assert) {
195 var model = new Backbone.Model;
198 Backbone.emulateJSON = true;
199 model.sync('create', model);
200 assert.strictEqual(this.ajaxSettings.emulateJSON, true);
202 Backbone.emulateJSON = false;
203 model.sync('create', model);
204 assert.strictEqual(this.ajaxSettings.emulateJSON, false);
207 QUnit.test('#1756 - Call user provided beforeSend function.', function(assert) {
209 Backbone.emulateHTTP = true;
210 var model = new Backbone.Model;
213 setRequestHeader: function(header, value) {
214 assert.strictEqual(header, 'X-HTTP-Method-Override');
215 assert.strictEqual(value, 'DELETE');
218 model.sync('delete', model, {
219 beforeSend: function(_xhr) {
220 assert.ok(_xhr === xhr);
224 assert.strictEqual(this.ajaxSettings.beforeSend(xhr), false);
227 QUnit.test('#2928 - Pass along `textStatus` and `errorThrown`.', function(assert) {
229 var model = new Backbone.Model;
231 model.on('error', function(m, xhr, options) {
232 assert.strictEqual(options.textStatus, 'textStatus');
233 assert.strictEqual(options.errorThrown, 'errorThrown');
236 this.ajaxSettings.error({}, 'textStatus', 'errorThrown');