PageRenderTime 60ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/test/sync.js

https://bitbucket.org/dlisboa/backbone
JavaScript | 212 lines | 184 code | 28 blank | 0 comment | 0 complexity | 6340d7d9e5ad1bcdc33413c3afc9c73e MD5 | raw file
  1. $(document).ready(function() {
  2. var Library = Backbone.Collection.extend({
  3. url : function() { return '/library'; }
  4. });
  5. var library;
  6. var attrs = {
  7. title : "The Tempest",
  8. author : "Bill Shakespeare",
  9. length : 123
  10. };
  11. module("Backbone.sync", _.extend(new Environment, {
  12. setup : function() {
  13. Environment.prototype.setup.apply(this, arguments);
  14. library = new Library;
  15. library.create(attrs, {wait: false});
  16. },
  17. teardown: function() {
  18. Environment.prototype.teardown.apply(this, arguments);
  19. Backbone.emulateHTTP = false;
  20. }
  21. }));
  22. test("read", 4, function() {
  23. library.fetch();
  24. equal(this.ajaxSettings.url, '/library');
  25. equal(this.ajaxSettings.type, 'GET');
  26. equal(this.ajaxSettings.dataType, 'json');
  27. ok(_.isEmpty(this.ajaxSettings.data));
  28. });
  29. test("passing data", 3, function() {
  30. library.fetch({data: {a: 'a', one: 1}});
  31. equal(this.ajaxSettings.url, '/library');
  32. equal(this.ajaxSettings.data.a, 'a');
  33. equal(this.ajaxSettings.data.one, 1);
  34. });
  35. test("create", 6, function() {
  36. equal(this.ajaxSettings.url, '/library');
  37. equal(this.ajaxSettings.type, 'POST');
  38. equal(this.ajaxSettings.dataType, 'json');
  39. var data = JSON.parse(this.ajaxSettings.data);
  40. equal(data.title, 'The Tempest');
  41. equal(data.author, 'Bill Shakespeare');
  42. equal(data.length, 123);
  43. });
  44. test("update", 7, function() {
  45. library.first().save({id: '1-the-tempest', author: 'William Shakespeare'});
  46. equal(this.ajaxSettings.url, '/library/1-the-tempest');
  47. equal(this.ajaxSettings.type, 'PUT');
  48. equal(this.ajaxSettings.dataType, 'json');
  49. var data = JSON.parse(this.ajaxSettings.data);
  50. equal(data.id, '1-the-tempest');
  51. equal(data.title, 'The Tempest');
  52. equal(data.author, 'William Shakespeare');
  53. equal(data.length, 123);
  54. });
  55. test("update with emulateHTTP and emulateJSON", 7, function() {
  56. library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
  57. emulateHTTP: true,
  58. emulateJSON: true
  59. });
  60. equal(this.ajaxSettings.url, '/library/2-the-tempest');
  61. equal(this.ajaxSettings.type, 'POST');
  62. equal(this.ajaxSettings.dataType, 'json');
  63. equal(this.ajaxSettings.data._method, 'PUT');
  64. var data = JSON.parse(this.ajaxSettings.data.model);
  65. equal(data.id, '2-the-tempest');
  66. equal(data.author, 'Tim Shakespeare');
  67. equal(data.length, 123);
  68. });
  69. test("update with just emulateHTTP", 6, function() {
  70. library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
  71. emulateHTTP: true
  72. });
  73. equal(this.ajaxSettings.url, '/library/2-the-tempest');
  74. equal(this.ajaxSettings.type, 'POST');
  75. equal(this.ajaxSettings.contentType, 'application/json');
  76. var data = JSON.parse(this.ajaxSettings.data);
  77. equal(data.id, '2-the-tempest');
  78. equal(data.author, 'Tim Shakespeare');
  79. equal(data.length, 123);
  80. });
  81. test("update with just emulateJSON", 6, function() {
  82. library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
  83. emulateJSON: true
  84. });
  85. equal(this.ajaxSettings.url, '/library/2-the-tempest');
  86. equal(this.ajaxSettings.type, 'PUT');
  87. equal(this.ajaxSettings.contentType, 'application/x-www-form-urlencoded');
  88. var data = JSON.parse(this.ajaxSettings.data.model);
  89. equal(data.id, '2-the-tempest');
  90. equal(data.author, 'Tim Shakespeare');
  91. equal(data.length, 123);
  92. });
  93. test("read model", 3, function() {
  94. library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
  95. library.first().fetch();
  96. equal(this.ajaxSettings.url, '/library/2-the-tempest');
  97. equal(this.ajaxSettings.type, 'GET');
  98. ok(_.isEmpty(this.ajaxSettings.data));
  99. });
  100. test("destroy", 3, function() {
  101. library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
  102. library.first().destroy({wait: true});
  103. equal(this.ajaxSettings.url, '/library/2-the-tempest');
  104. equal(this.ajaxSettings.type, 'DELETE');
  105. equal(this.ajaxSettings.data, null);
  106. });
  107. test("destroy with emulateHTTP", 3, function() {
  108. library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
  109. library.first().destroy({
  110. emulateHTTP: true,
  111. emulateJSON: true
  112. });
  113. equal(this.ajaxSettings.url, '/library/2-the-tempest');
  114. equal(this.ajaxSettings.type, 'POST');
  115. equal(JSON.stringify(this.ajaxSettings.data), '{"_method":"DELETE"}');
  116. });
  117. test("urlError", 2, function() {
  118. var model = new Backbone.Model();
  119. raises(function() {
  120. model.fetch();
  121. });
  122. model.fetch({url: '/one/two'});
  123. equal(this.ajaxSettings.url, '/one/two');
  124. });
  125. test("#1052 - `options` is optional.", 0, function() {
  126. var model = new Backbone.Model();
  127. model.url = '/test';
  128. Backbone.sync('create', model);
  129. });
  130. test("Backbone.ajax", 1, function() {
  131. Backbone.ajax = function(settings){
  132. strictEqual(settings.url, '/test');
  133. };
  134. var model = new Backbone.Model();
  135. model.url = '/test';
  136. Backbone.sync('create', model);
  137. });
  138. test("Call provided error callback on error.", 1, function() {
  139. var model = new Backbone.Model;
  140. model.url = '/test';
  141. Backbone.sync('read', model, {
  142. error: function() { ok(true); }
  143. });
  144. this.ajaxSettings.error();
  145. });
  146. test('Use Backbone.emulateHTTP as default.', 2, function() {
  147. var model = new Backbone.Model;
  148. model.url = '/test';
  149. Backbone.emulateHTTP = true;
  150. model.sync('create', model);
  151. strictEqual(this.ajaxSettings.emulateHTTP, true);
  152. Backbone.emulateHTTP = false;
  153. model.sync('create', model);
  154. strictEqual(this.ajaxSettings.emulateHTTP, false);
  155. });
  156. test('Use Backbone.emulateJSON as default.', 2, function() {
  157. var model = new Backbone.Model;
  158. model.url = '/test';
  159. Backbone.emulateJSON = true;
  160. model.sync('create', model);
  161. strictEqual(this.ajaxSettings.emulateJSON, true);
  162. Backbone.emulateJSON = false;
  163. model.sync('create', model);
  164. strictEqual(this.ajaxSettings.emulateJSON, false);
  165. });
  166. test("#1756 - Call user provided beforeSend function.", 4, function() {
  167. Backbone.emulateHTTP = true;
  168. var model = new Backbone.Model;
  169. model.url = '/test';
  170. var xhr = {
  171. setRequestHeader: function(header, value) {
  172. strictEqual(header, 'X-HTTP-Method-Override');
  173. strictEqual(value, 'DELETE');
  174. }
  175. };
  176. model.sync('delete', model, {
  177. beforeSend: function(_xhr) {
  178. ok(_xhr === xhr);
  179. return false;
  180. }
  181. });
  182. strictEqual(this.ajaxSettings.beforeSend(xhr), false);
  183. });
  184. });