1(function(QUnit) {
2
3  var Library = Backbone.Collection.extend({
4    url: function() { return '/library'; }
5  });
6  var library;
7
8  var attrs = {
9    title: 'The Tempest',
10    author: 'Bill Shakespeare',
11    length: 123
12  };
13
14  QUnit.module('Backbone.sync', {
15
16    beforeEach: function(assert) {
17      library = new Library;
18      library.create(attrs, {wait: false});
19    },
20
21    afterEach: function(assert) {
22      Backbone.emulateHTTP = false;
23    }
24
25  });
26
27  QUnit.test('read', function(assert) {
28    assert.expect(4);
29    library.fetch();
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));
34  });
35
36  QUnit.test('passing data', function(assert) {
37    assert.expect(3);
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);
42  });
43
44  QUnit.test('create', function(assert) {
45    assert.expect(6);
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);
53  });
54
55  QUnit.test('update', function(assert) {
56    assert.expect(7);
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);
66  });
67
68  QUnit.test('update with emulateHTTP and emulateJSON', function(assert) {
69    assert.expect(7);
70    library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
71      emulateHTTP: true,
72      emulateJSON: true
73    });
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);
82  });
83
84  QUnit.test('update with just emulateHTTP', function(assert) {
85    assert.expect(6);
86    library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
87      emulateHTTP: true
88    });
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);
96  });
97
98  QUnit.test('update with just emulateJSON', function(assert) {
99    assert.expect(6);
100    library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
101      emulateJSON: true
102    });
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);
110  });
111
112  QUnit.test('read model', function(assert) {
113    assert.expect(3);
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));
119  });
120
121  QUnit.test('destroy', function(assert) {
122    assert.expect(3);
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);
128  });
129
130  QUnit.test('destroy with emulateHTTP', function(assert) {
131    assert.expect(3);
132    library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
133    library.first().destroy({
134      emulateHTTP: true,
135      emulateJSON: true
136    });
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"}');
140  });
141
142  QUnit.test('urlError', function(assert) {
143    assert.expect(2);
144    var model = new Backbone.Model();
145    assert.raises(function() {
146      model.fetch();
147    });
148    model.fetch({url: '/one/two'});
149    assert.equal(this.ajaxSettings.url, '/one/two');
150  });
151
152  QUnit.test('#1052 - `options` is optional.', function(assert) {
153    assert.expect(0);
154    var model = new Backbone.Model();
155    model.url = '/test';
156    Backbone.sync('create', model);
157  });
158
159  QUnit.test('Backbone.ajax', function(assert) {
160    assert.expect(1);
161    Backbone.ajax = function(settings) {
162      assert.strictEqual(settings.url, '/test');
163    };
164    var model = new Backbone.Model();
165    model.url = '/test';
166    Backbone.sync('create', model);
167  });
168
169  QUnit.test('Call provided error callback on error.', function(assert) {
170    assert.expect(1);
171    var model = new Backbone.Model;
172    model.url = '/test';
173    Backbone.sync('read', model, {
174      error: function() { assert.ok(true); }
175    });
176    this.ajaxSettings.error();
177  });
178
179  QUnit.test('Use Backbone.emulateHTTP as default.', function(assert) {
180    assert.expect(2);
181    var model = new Backbone.Model;
182    model.url = '/test';
183
184    Backbone.emulateHTTP = true;
185    model.sync('create', model);
186    assert.strictEqual(this.ajaxSettings.emulateHTTP, true);
187
188    Backbone.emulateHTTP = false;
189    model.sync('create', model);
190    assert.strictEqual(this.ajaxSettings.emulateHTTP, false);
191  });
192
193  QUnit.test('Use Backbone.emulateJSON as default.', function(assert) {
194    assert.expect(2);
195    var model = new Backbone.Model;
196    model.url = '/test';
197
198    Backbone.emulateJSON = true;
199    model.sync('create', model);
200    assert.strictEqual(this.ajaxSettings.emulateJSON, true);
201
202    Backbone.emulateJSON = false;
203    model.sync('create', model);
204    assert.strictEqual(this.ajaxSettings.emulateJSON, false);
205  });
206
207  QUnit.test('#1756 - Call user provided beforeSend function.', function(assert) {
208    assert.expect(4);
209    Backbone.emulateHTTP = true;
210    var model = new Backbone.Model;
211    model.url = '/test';
212    var xhr = {
213      setRequestHeader: function(header, value) {
214        assert.strictEqual(header, 'X-HTTP-Method-Override');
215        assert.strictEqual(value, 'DELETE');
216      }
217    };
218    model.sync('delete', model, {
219      beforeSend: function(_xhr) {
220        assert.ok(_xhr === xhr);
221        return false;
222      }
223    });
224    assert.strictEqual(this.ajaxSettings.beforeSend(xhr), false);
225  });
226
227  QUnit.test('#2928 - Pass along `textStatus` and `errorThrown`.', function(assert) {
228    assert.expect(2);
229    var model = new Backbone.Model;
230    model.url = '/test';
231    model.on('error', function(m, xhr, options) {
232      assert.strictEqual(options.textStatus, 'textStatus');
233      assert.strictEqual(options.errorThrown, 'errorThrown');
234    });
235    model.fetch();
236    this.ajaxSettings.error({}, 'textStatus', 'errorThrown');
237  });
238
239})(QUnit);
240