PageRenderTime 37ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/spec/javascripts/helpers/sinon_extensions.js

https://bitbucket.org/schatt/chorus
JavaScript | 248 lines | 211 code | 37 blank | 0 comment | 34 complexity | 42e4b0f411d13863bd3691f685d115e7 MD5 | raw file
  1. _.extend(sinon.fakeServer, {
  2. reset: function() {
  3. this.requests = [];
  4. },
  5. creates: function() {
  6. return _.filter(this.requests, function(request) {
  7. return request.method === "POST";
  8. });
  9. },
  10. fetches: function() {
  11. return _.filter(this.requests, function(request) {
  12. return request.method === "GET";
  13. });
  14. },
  15. updates: function() {
  16. return _.filter(this.requests, function(request) {
  17. return request.method === "PUT";
  18. });
  19. },
  20. destroys: function() {
  21. return _.filter(this.requests, function(request) {
  22. return request.method === "DELETE";
  23. });
  24. },
  25. lastRequest: function() {
  26. return _.last(this.requests);
  27. },
  28. lastCreate: function() {
  29. return _.last(this.creates());
  30. },
  31. lastFetch: function() {
  32. return _.last(this.fetches());
  33. },
  34. lastUpdate: function() {
  35. return _.last(this.updates());
  36. },
  37. lastDestroy: function() {
  38. return _.last(this.destroys());
  39. },
  40. lastUpdateFor: function(model) {
  41. return _.last(_.filter(this.updates(), function(potentialRequest) {
  42. var uri = new URI(potentialRequest.url);
  43. var modelUri = new URI(model.url());
  44. return uri.equals(modelUri);
  45. }));
  46. },
  47. lastDestroyFor: function(model) {
  48. return _.last(_.filter(this.destroys(), function(potentialRequest) {
  49. var uri = new URI(potentialRequest.url);
  50. var modelUri = new URI(model.url());
  51. return uri.equals(modelUri);
  52. }));
  53. },
  54. lastCreateFor: function(model) {
  55. return _.last(_.filter(this.creates(), function(potentialRequest) {
  56. var uri = new URI(potentialRequest.url);
  57. var modelUri = new URI(model.url());
  58. return uri.equals(modelUri);
  59. }));
  60. },
  61. lastFetchFor: function(model, options) {
  62. options = options || {};
  63. options.method = 'read';
  64. return _.last(_.filter(this.fetches(), function(potentialRequest) {
  65. var uri = new URI(potentialRequest.url);
  66. var modelUri = new URI(model.url(options));
  67. if (!options.requireRows) {
  68. uri.removeSearch("per_page");
  69. modelUri.removeSearch("per_page");
  70. }
  71. return uri.equals(modelUri);
  72. }));
  73. },
  74. lastFetchAllFor: function(model, overrides) {
  75. return this.lastFetchFor(model, _.extend({ per_page: 1000, requireRows: true}, overrides));
  76. },
  77. makeFakeResponse: function(modelOrCollection, response) {
  78. if (response) {
  79. return response.attributes ? response.attributes : response;
  80. } else if (modelOrCollection instanceof Backbone.Model) {
  81. return modelOrCollection.attributes;
  82. } else if (modelOrCollection instanceof Backbone.Collection) {
  83. return _.map(modelOrCollection.models, function(model) { return model.attributes; });
  84. } else {
  85. return [];
  86. }
  87. },
  88. completeFetchFor: function(model, response, options, pagination) {
  89. response = this.makeFakeResponse(model, response);
  90. var fetch = this.lastFetchFor(model, options);
  91. if (fetch) {
  92. fetch.succeed(response, pagination);
  93. } else {
  94. throw "No fetch found for " + model.url() + ". Found fetches for: [" + _.pluck(this.fetches(), 'url').join(', ') + "]";
  95. }
  96. },
  97. completeUpdateFor: function(model, response, pagination) {
  98. response = this.makeFakeResponse(model, response);
  99. var update = this.lastUpdateFor(model);
  100. if (update) {
  101. update.succeed(response, pagination);
  102. } else {
  103. throw "No update found for " + model.url() + ". Found updates for: [" + _.pluck(this.creates(), 'url').join(', ') + "]";
  104. }
  105. },
  106. completeSaveFor: function(model, response) {
  107. response = this.makeFakeResponse(model, response);
  108. var create = this.lastCreateFor(model);
  109. if (create) {
  110. create.succeed(response);
  111. } else {
  112. throw "No create found for " + model.url() + ". Found creates for: [" + _.pluck(this.creates(), 'url').join(', ') + "]";
  113. }
  114. },
  115. completeDestroyFor: function(model, response) {
  116. var destroy = this.lastDestroyFor(model);
  117. if (destroy) {
  118. destroy.succeed({});
  119. } else {
  120. throw "No destroy found for " + model.url() + ". Found destroys for: [" + _.pluck(this.destroys(), 'url').join(', ') + "]";
  121. }
  122. },
  123. completeFetchAllFor: function(model, results, options, pagination) {
  124. options = options || {page: 1, per_page: 1000};
  125. pagination = pagination || {page: 1, total: 1, records: results ? results.length : 1};
  126. this.completeFetchFor(model, results, options, pagination);
  127. },
  128. completeAllFetches: function(pagination) {
  129. pagination = pagination || {page: 1, total: 1, records: 1};
  130. _.each(this.fetches(), function(request) {
  131. request.succeed([], pagination);
  132. });
  133. }
  134. });
  135. _.extend(sinon.FakeXMLHttpRequest.prototype, {
  136. respondJson: function(responseCode, json) {
  137. return this.respond(
  138. responseCode,
  139. { 'Content-Type': 'application/json' },
  140. JSON.stringify(json));
  141. },
  142. succeed: function(models, pagination) {
  143. var isArray = _.isArray(models);
  144. if (!isArray) models = [models];
  145. var resource = _.map(models, function(model) {
  146. if (model instanceof Backbone.Model) {
  147. return model.attributes;
  148. } else {
  149. return model;
  150. }
  151. });
  152. if (!isArray) { resource = resource[0]; }
  153. return this.respondJson(200, {
  154. response: resource,
  155. pagination: pagination
  156. });
  157. },
  158. fail: function fail(message, resource) {
  159. return this.respondJson(200, {
  160. status: "fail",
  161. resource: resource || [],
  162. message: message || "something went wrong!"
  163. });
  164. },
  165. failNotFound: function(errors, response) {
  166. return this.respondJson(404, {
  167. response: response,
  168. errors: errors || {}
  169. });
  170. },
  171. failForbidden: function(errors, response) {
  172. return this.respondJson(403, {
  173. response: response,
  174. errors: errors || {}
  175. });
  176. },
  177. failUnprocessableEntity: function(errors, response) {
  178. return this.respondJson(422, {
  179. response: response,
  180. errors: errors || {}
  181. });
  182. },
  183. failUnauthorized: function(errors, response) {
  184. return this.respondJson(401, {
  185. response: response || [],
  186. errors: errors || {}
  187. });
  188. },
  189. failServerError: function(errors, response) {
  190. return this.respondJson(500, {
  191. response: response || [],
  192. errors: errors || {}
  193. });
  194. },
  195. params: function() {
  196. var uri;
  197. if (this.requestBody) {
  198. uri = new URI("?" + this.requestBody);
  199. } else {
  200. uri = new URI(this.url);
  201. }
  202. return uri.search(true);
  203. },
  204. error: function(message) {
  205. return this.respond(
  206. 404,
  207. {},
  208. ''
  209. );
  210. }
  211. });