OrderedElementsViewSpec.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. function make_group(data) {
  2. data = data || {};
  3. return {
  4. id: data.id || 1,
  5. score: data.score || 5,
  6. count: 1,
  7. permalink: 'http://example.com',
  8. title: 'test',
  9. message: 'test message',
  10. lastSeen: '2012-01-13T08:15:36Z',
  11. timeSpent: 0,
  12. project: 'default',
  13. canResolve: false,
  14. logger: 'root',
  15. versions: [],
  16. tags: [],
  17. version: data.version || 0
  18. };
  19. }
  20. describe("OrderedElementsView", function() {
  21. var view;
  22. var group1;
  23. var group2;
  24. var group3;
  25. var group4;
  26. var member;
  27. var TestModel;
  28. it("maintains correct models", function() {
  29. TestModel = Backbone.Model.extend({
  30. defaults: {foo: "bar"}
  31. });
  32. view = new app.OrderedElementsView({
  33. id: 'foo',
  34. model: TestModel
  35. });
  36. view.$parent = $('<ul></ul>');
  37. view.addMember({
  38. id: 1,
  39. biz: "baz"
  40. });
  41. member = view.collection.get(1)
  42. assert.equal(member.get("biz"), "baz");
  43. assert.equal(member.get("foo"), "bar");
  44. });
  45. describe("without initial members", function() {
  46. beforeEach(function() {
  47. view = new app.OrderedElementsView({
  48. id: 'foo'
  49. });
  50. view.$parent = $('<ul></ul>');
  51. });
  52. it("should suggest its not loaded", function() {
  53. assert.isFalse(view.loaded);
  54. });
  55. it("has status text to loading", function() {
  56. assert.equal(view.$empty.html(), view.loadingMessage);
  57. });
  58. });
  59. describe("with initial members", function() {
  60. beforeEach(function() {
  61. group1 = make_group({id: 1, score: 3});
  62. view = new app.OrderedElementsView({
  63. id: 'foo',
  64. members: [group1]
  65. });
  66. });
  67. it("should suggest its loaded", function() {
  68. assert.isTrue(view.loaded);
  69. });
  70. it("has status text to loading", function() {
  71. assert.notEqual(view.$empty.html(), view.loadingMessage);
  72. });
  73. });
  74. describe(".reset", function() {
  75. describe("with data", function(){
  76. beforeEach(function(){
  77. group1 = make_group({id: 1, score: 3});
  78. view = new app.OrderedElementsView({
  79. id: 'foo'
  80. });
  81. view.collection.reset = this.sinon.spy();
  82. view.reset([group1]);
  83. });
  84. it("calls collection.reset with data", function() {
  85. assert.isTrue(view.collection.reset.calledOnce);
  86. });
  87. it("suggests its loaded", function() {
  88. assert.isTrue(view.loaded);
  89. });
  90. it("changes status text to empty", function() {
  91. assert.equal(view.$empty.html(), view.emptyMessage);
  92. });
  93. });
  94. describe("with empty list of data", function(){
  95. beforeEach(function(){
  96. view = new app.OrderedElementsView({
  97. id: 'foo'
  98. });
  99. group1 = make_group({id: 1, score: 3});
  100. view.collection.reset = this.sinon.spy();
  101. view.reset([]);
  102. });
  103. it("calls collection.reset with data", function() {
  104. assert.isTrue(view.collection.reset.called);
  105. assert.isTrue(view.collection.reset.calledWithExactly([]));
  106. });
  107. it("suggests its loaded", function() {
  108. assert.isTrue(view.loaded);
  109. });
  110. it("changes status text to empty", function() {
  111. assert.equal(view.$empty.html(), view.emptyMessage);
  112. });
  113. });
  114. describe("with no data value", function(){
  115. beforeEach(function(){
  116. view = new app.OrderedElementsView({
  117. id: 'foo'
  118. });
  119. group1 = make_group({id: 1, score: 3});
  120. view.collection.reset = this.sinon.spy();
  121. view.reset();
  122. });
  123. it("calls collection.reset with no value", function() {
  124. assert.isTrue(view.collection.reset.called);
  125. assert.isTrue(view.collection.reset.calledWithExactly());
  126. });
  127. it("suggests its not loaded", function() {
  128. assert.isFalse(view.loaded);
  129. });
  130. it("changes status text to loading", function() {
  131. assert.equal(view.$empty.html(), view.loadingMessage);
  132. });
  133. });
  134. });
  135. describe(".extend", function() {
  136. beforeEach(function(){
  137. view = new app.OrderedElementsView({
  138. id: 'foo'
  139. });
  140. view.addMember = this.sinon.spy();
  141. });
  142. it("calls addMember for each item", function() {
  143. group1 = make_group({id: 1, score: 3});
  144. group2 = make_group({id: 2, score: 5});
  145. view.extend([group1, group2]);
  146. assert.equal(view.addMember.callCount, 2);
  147. assert.isTrue(view.addMember.calledWithExactly(group1));
  148. assert.isTrue(view.addMember.calledWithExactly(group2));
  149. });
  150. });
  151. describe(".addMember", function() {
  152. beforeEach(function(){
  153. view = new app.OrderedElementsView({
  154. id: 'foo',
  155. maxItems: 3
  156. });
  157. });
  158. it("adds to collection", function() {
  159. group = make_group();
  160. view.addMember(group);
  161. assert.strictEqual(view.collection.models[0].get('id'), group.id);
  162. });
  163. it("replaces in collection", function() {
  164. group = make_group();
  165. view.addMember(group);
  166. view.addMember(group);
  167. view.addMember(group);
  168. assert.strictEqual(view.collection.length, 1);
  169. });
  170. it("truncated to max items", function(){
  171. group1 = make_group({id: 1, score: 3});
  172. group2 = make_group({id: 2, score: 5});
  173. group3 = make_group({id: 3, score: 2});
  174. group4 = make_group({id: 4, score: 6});
  175. view.addMember(group1);
  176. view.addMember(group2);
  177. view.addMember(group3);
  178. view.addMember(group4);
  179. assert.strictEqual(view.collection.length, 3);
  180. });
  181. it("sorts members by score after insert", function(){
  182. view.addMember(make_group({id: 1, score: 3}));
  183. view.addMember(make_group({id: 2, score: 5}));
  184. assert.strictEqual(view.collection.models[0].get('id'), 2);
  185. assert.strictEqual(view.collection.models[1].get('id'), 1);
  186. });
  187. it("doesnt move members that didnt re-rank", function(){
  188. view.addMember(make_group({id: 1, score: 1}));
  189. view.addMember(make_group({id: 2, score: 10}));
  190. view.addMember(make_group({id: 3, score: 100}));
  191. // change the score, but keep it in the same rank
  192. view.addMember(make_group({id: 2, score: 50}));
  193. assert.strictEqual(view.collection.models[0].get('id'), 3);
  194. assert.strictEqual(view.collection.models[1].get('id'), 2);
  195. assert.strictEqual(view.collection.models[2].get('id'), 1);
  196. });
  197. it("resorts members when they change", function(){
  198. view.addMember(make_group({id: 1, score: 1, version: 1}));
  199. view.addMember(make_group({id: 2, score: 10, version: 1}));
  200. view.addMember(make_group({id: 3, score: 100, version: 1}));
  201. // change the score so it should be at the top
  202. view.addMember(make_group({id: 1, score: 1000, version: 2}));
  203. assert.strictEqual(view.collection.models[0].get('id'), 1);
  204. assert.strictEqual(view.collection.models[1].get('id'), 3);
  205. assert.strictEqual(view.collection.models[2].get('id'), 2);
  206. });
  207. it("correctly handles truncating lowest score values", function(){
  208. view.addMember(make_group({id: 1, score: 1}));
  209. view.addMember(make_group({id: 2, score: 10}));
  210. view.addMember(make_group({id: 3, score: 100}));
  211. view.addMember(make_group({id: 4, score: 52}));
  212. view.addMember(make_group({id: 5, score: 51}));
  213. view.addMember(make_group({id: 2, score: 50}));
  214. assert.strictEqual(view.collection.length, 3);
  215. assert.strictEqual(view.collection.models[0].get('id'), 3);
  216. assert.strictEqual(view.collection.models[1].get('id'), 4);
  217. assert.strictEqual(view.collection.models[2].get('id'), 5);
  218. });
  219. });
  220. describe(".renderMemberInContainer", function() {
  221. var TestView = Backbone.View.extend({
  222. render: function(){
  223. var node = $('<li></li>');
  224. node.attr('id', 'test-' + this.model.get('id'));
  225. this.$el.html(node);
  226. }
  227. });
  228. beforeEach(function(){
  229. view = new app.OrderedElementsView({
  230. id: 'test-',
  231. maxItems: 3,
  232. view: TestView
  233. });
  234. view.$parent = $('<ul></ul>');
  235. group1 = make_group({id: 1, score: 3});
  236. group2 = make_group({id: 2, score: 5});
  237. group3 = make_group({id: 3, score: 2});
  238. view.addMember(group1);
  239. view.addMember(group2);
  240. view.addMember(group3);
  241. });
  242. it("pushes highest scored elements to the top on change", function(){
  243. group3.score = 100;
  244. view.addMember(group3);
  245. group4 = make_group({id: 4, score: 500});
  246. view.addMember(group4);
  247. assert.strictEqual(view.$parent.find('li').length, view.collection.length);
  248. });
  249. it("has the correct number of elements", function(){
  250. assert.strictEqual(view.$parent.find('li').length, view.collection.length);
  251. });
  252. it("has list elements sorted correctly", function(){
  253. view.$parent.find('li').each(function(_, el){
  254. assert.strictEqual(this.id, 'test-' + view.collection.models[_].id);
  255. });
  256. });
  257. });
  258. });