PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/test/sync.js

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