triggers.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. Tinytest.addAsync(
  2. 'Triggers - runTriggers - run all and after',
  3. function(test, done) {
  4. var store = [];
  5. var triggers = MakeTriggers(2, store);
  6. Triggers.runTriggers(triggers, null, null, function() {
  7. test.equal(store, [0, 1]);
  8. done();
  9. });
  10. });
  11. Tinytest.addAsync(
  12. 'Triggers - runTriggers - redirect with url',
  13. function(test, done) {
  14. var store = [];
  15. var url = "http://google.com";
  16. var triggers = MakeTriggers(2, store);
  17. triggers.splice(1, 0, function(context, redirect) {
  18. redirect(url);
  19. });
  20. Triggers.runTriggers(triggers, null, function(u) {
  21. test.equal(store, [0]);
  22. test.equal(u, url);
  23. done();
  24. }, null);
  25. });
  26. Tinytest.addAsync(
  27. 'Triggers - runTriggers - redirect without url',
  28. function(test, done) {
  29. var store = [];
  30. var url = "http://google.com";
  31. var triggers = MakeTriggers(2, store);
  32. triggers.splice(1, 0, function(context, redirect) {
  33. try {
  34. redirect();
  35. } catch(ex) {
  36. test.isTrue(/requires an URL/.test(ex.message));
  37. test.equal(store, [0]);
  38. done();
  39. }
  40. });
  41. Triggers.runTriggers(triggers, null, null, null);
  42. });
  43. Tinytest.addAsync(
  44. 'Triggers - runTriggers - redirect in a different event loop',
  45. function(test, done) {
  46. var store = [];
  47. var url = "http://google.com";
  48. var triggers = MakeTriggers(2, store);
  49. var doneCalled = false;
  50. triggers.splice(1, 0, function(context, redirect) {
  51. setTimeout(function() {
  52. try {
  53. redirect(url);
  54. } catch(ex) {
  55. test.isTrue(/sync/.test(ex.message));
  56. test.equal(store, [0, 1]);
  57. test.isTrue(doneCalled);
  58. done();
  59. }
  60. }, 0);
  61. });
  62. Triggers.runTriggers(triggers, null, null, function() {
  63. doneCalled = true;
  64. });
  65. });
  66. Tinytest.addAsync(
  67. 'Triggers - runTriggers - redirect called multiple times',
  68. function(test, done) {
  69. var store = [];
  70. var url = "http://google.com";
  71. var triggers = MakeTriggers(2, store);
  72. var redirectCalled = false;
  73. triggers.splice(1, 0, function(context, redirect) {
  74. redirect(url);
  75. try {
  76. redirect(url);
  77. } catch(ex) {
  78. test.isTrue(/already redirected/.test(ex.message));
  79. test.equal(store, [0]);
  80. test.isTrue(redirectCalled);
  81. done();
  82. }
  83. });
  84. Triggers.runTriggers(triggers, null, function() {
  85. redirectCalled = true;
  86. }, null);
  87. });
  88. Tinytest.addAsync(
  89. 'Triggers - runTriggers - stop callback',
  90. function(test, done) {
  91. var store = [];
  92. var triggers = MakeTriggers(2, store);
  93. triggers.splice(1, 0, function(context, redirect, stop) {
  94. stop();
  95. });
  96. Triggers.runTriggers(triggers, null, null, function() {
  97. store.push(2);
  98. });
  99. test.equal(store, [0]);
  100. done();
  101. });
  102. Tinytest.addAsync(
  103. 'Triggers - runTriggers - get context',
  104. function(test, done) {
  105. var context = {};
  106. var trigger = function(c) {
  107. test.equal(c, context);
  108. done();
  109. };
  110. Triggers.runTriggers([trigger], context, function() {}, function() {});
  111. });
  112. Tinytest.addAsync(
  113. 'Triggers - createRouteBoundTriggers - matching trigger',
  114. function(test, done) {
  115. var context = {route: {name: "abc"}};
  116. var redirect = function() {};
  117. var trigger = function(c, r) {
  118. test.equal(c, context);
  119. test.equal(r, redirect);
  120. done();
  121. };
  122. var triggers = Triggers.createRouteBoundTriggers([trigger], ["abc"]);
  123. triggers[0](context, redirect);
  124. });
  125. Tinytest.addAsync(
  126. 'Triggers - createRouteBoundTriggers - multiple matching triggers',
  127. function(test, done) {
  128. var context = {route: {name: "abc"}};
  129. var redirect = function() {};
  130. var doneCount = 0;
  131. var trigger = function(c, r) {
  132. test.equal(c, context);
  133. test.equal(r, redirect);
  134. doneCount++;
  135. };
  136. var triggers = Triggers.createRouteBoundTriggers([trigger, trigger], ["abc"]);
  137. triggers[0](context, redirect);
  138. triggers[1](context, redirect);
  139. test.equal(doneCount, 2);
  140. done();
  141. });
  142. Tinytest.addAsync(
  143. 'Triggers - createRouteBoundTriggers - no matching trigger',
  144. function(test, done) {
  145. var context = {route: {name: "some-other-route"}};
  146. var redirect = function() {};
  147. var doneCount = 0;
  148. var trigger = function(c, r) {
  149. test.equal(c, context);
  150. test.equal(r, redirect);
  151. doneCount++;
  152. };
  153. var triggers = Triggers.createRouteBoundTriggers([trigger], ["abc"]);
  154. triggers[0](context, redirect);
  155. test.equal(doneCount, 0);
  156. done();
  157. });
  158. Tinytest.addAsync(
  159. 'Triggers - createRouteBoundTriggers - negate logic',
  160. function(test, done) {
  161. var context = {route: {name: "some-other-route"}};
  162. var redirect = function() {};
  163. var doneCount = 0;
  164. var trigger = function(c, r) {
  165. test.equal(c, context);
  166. test.equal(r, redirect);
  167. doneCount++;
  168. };
  169. var triggers = Triggers.createRouteBoundTriggers([trigger], ["abc"], true);
  170. triggers[0](context, redirect);
  171. test.equal(doneCount, 1);
  172. done();
  173. });
  174. Tinytest.addAsync(
  175. 'Triggers - applyFilters - no filters',
  176. function(test, done) {
  177. var original = [];
  178. test.equal(Triggers.applyFilters(original), original);
  179. done();
  180. });
  181. Tinytest.addAsync(
  182. 'Triggers - applyFilters - single trigger to array',
  183. function(test, done) {
  184. var original = function() {};
  185. test.equal(Triggers.applyFilters(original)[0], original);
  186. done();
  187. });
  188. Tinytest.addAsync(
  189. 'Triggers - applyFilters - only and except both',
  190. function(test, done) {
  191. var original = [];
  192. try {
  193. Triggers.applyFilters(original, {only: [], except: []});
  194. } catch(ex) {
  195. test.isTrue(/only and except/.test(ex.message));
  196. done();
  197. }
  198. });
  199. Tinytest.addAsync(
  200. 'Triggers - applyFilters - only is not an array',
  201. function(test, done) {
  202. var original = [];
  203. try {
  204. Triggers.applyFilters(original, {only: "name"});
  205. } catch(ex) {
  206. test.isTrue(/to be an array/.test(ex.message));
  207. done();
  208. }
  209. });
  210. Tinytest.addAsync(
  211. 'Triggers - applyFilters - except is not an array',
  212. function(test, done) {
  213. var original = [];
  214. try {
  215. Triggers.applyFilters(original, {except: "name"});
  216. } catch(ex) {
  217. test.isTrue(/to be an array/.test(ex.message));
  218. done();
  219. }
  220. });
  221. Tinytest.addAsync(
  222. 'Triggers - applyFilters - unsupported filter',
  223. function(test, done) {
  224. var original = [];
  225. try {
  226. Triggers.applyFilters(original, {wowFilter: []});
  227. } catch(ex) {
  228. test.isTrue(/not supported/.test(ex.message));
  229. done();
  230. }
  231. });
  232. Tinytest.addAsync(
  233. 'Triggers - applyFilters - just only filter',
  234. function(test, done) {
  235. var bounded = Triggers.applyFilters(done, {only: ["abc"]});
  236. bounded[0]({route: {name: "abc"}});
  237. });
  238. Tinytest.addAsync(
  239. 'Triggers - applyFilters - just except filter',
  240. function(test, done) {
  241. var bounded = Triggers.applyFilters(done, {except: ["abc"]});
  242. bounded[0]({route: {name: "some-other"}});
  243. });
  244. function MakeTriggers(count, store) {
  245. var triggers = [];
  246. function addTrigger(no) {
  247. triggers.push(function() {
  248. store.push(no);
  249. });
  250. }
  251. for(var lc=0; lc<count; lc++) {
  252. addTrigger(lc);
  253. }
  254. return triggers;
  255. }