pre.test.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. var assert = require('assert');
  2. var Kareem = require('../');
  3. describe('execPre', function() {
  4. var hooks;
  5. beforeEach(function() {
  6. hooks = new Kareem();
  7. });
  8. it('handles errors with multiple pres', function(done) {
  9. var execed = {};
  10. hooks.pre('cook', function(done) {
  11. execed.first = true;
  12. done();
  13. });
  14. hooks.pre('cook', function(done) {
  15. execed.second = true;
  16. done('error!');
  17. });
  18. hooks.pre('cook', function(done) {
  19. execed.third = true;
  20. done();
  21. });
  22. hooks.execPre('cook', null, function(err) {
  23. assert.equal('error!', err);
  24. assert.equal(2, Object.keys(execed).length);
  25. assert.ok(execed.first);
  26. assert.ok(execed.second);
  27. done();
  28. });
  29. });
  30. it('handles async errors', function(done) {
  31. var execed = {};
  32. hooks.pre('cook', true, function(next, done) {
  33. execed.first = true;
  34. setTimeout(
  35. function() {
  36. done('error!');
  37. },
  38. 5);
  39. next();
  40. });
  41. hooks.pre('cook', true, function(next, done) {
  42. execed.second = true;
  43. setTimeout(
  44. function() {
  45. done('other error!');
  46. },
  47. 10);
  48. next();
  49. });
  50. hooks.execPre('cook', null, function(err) {
  51. assert.equal('error!', err);
  52. assert.equal(2, Object.keys(execed).length);
  53. assert.ok(execed.first);
  54. assert.ok(execed.second);
  55. done();
  56. });
  57. });
  58. it('handles async errors in next()', function(done) {
  59. var execed = {};
  60. hooks.pre('cook', true, function(next, done) {
  61. execed.first = true;
  62. setTimeout(
  63. function() {
  64. done('other error!');
  65. },
  66. 15);
  67. next();
  68. });
  69. hooks.pre('cook', true, function(next, done) {
  70. execed.second = true;
  71. setTimeout(
  72. function() {
  73. next('error!');
  74. done('another error!');
  75. },
  76. 5);
  77. });
  78. hooks.execPre('cook', null, function(err) {
  79. assert.equal('error!', err);
  80. assert.equal(2, Object.keys(execed).length);
  81. assert.ok(execed.first);
  82. assert.ok(execed.second);
  83. done();
  84. });
  85. });
  86. it('handles async errors in next() when already done', function(done) {
  87. var execed = {};
  88. hooks.pre('cook', true, function(next, done) {
  89. execed.first = true;
  90. setTimeout(
  91. function() {
  92. done('other error!');
  93. },
  94. 5);
  95. next();
  96. });
  97. hooks.pre('cook', true, function(next, done) {
  98. execed.second = true;
  99. setTimeout(
  100. function() {
  101. next('error!');
  102. done('another error!');
  103. },
  104. 25);
  105. });
  106. hooks.execPre('cook', null, function(err) {
  107. assert.equal('other error!', err);
  108. assert.equal(2, Object.keys(execed).length);
  109. assert.ok(execed.first);
  110. assert.ok(execed.second);
  111. done();
  112. });
  113. });
  114. it('returns correct error when async pre errors', function(done) {
  115. var execed = {};
  116. hooks.pre('cook', true, function(next, done) {
  117. execed.first = true;
  118. setTimeout(
  119. function() {
  120. done('other error!');
  121. },
  122. 5);
  123. next();
  124. });
  125. hooks.pre('cook', function(next) {
  126. execed.second = true;
  127. setTimeout(
  128. function() {
  129. next('error!');
  130. },
  131. 15);
  132. });
  133. hooks.execPre('cook', null, function(err) {
  134. assert.equal('other error!', err);
  135. assert.equal(2, Object.keys(execed).length);
  136. assert.ok(execed.first);
  137. assert.ok(execed.second);
  138. done();
  139. });
  140. });
  141. it('lets async pres run when fully sync pres are done', function(done) {
  142. var execed = {};
  143. hooks.pre('cook', true, function(next, done) {
  144. execed.first = true;
  145. setTimeout(
  146. function() {
  147. done();
  148. },
  149. 5);
  150. next();
  151. });
  152. hooks.pre('cook', function() {
  153. execed.second = true;
  154. });
  155. hooks.execPre('cook', null, function(err) {
  156. assert.ifError(err);
  157. assert.equal(2, Object.keys(execed).length);
  158. assert.ok(execed.first);
  159. assert.ok(execed.second);
  160. done();
  161. });
  162. });
  163. it('allows passing arguments to the next pre', function(done) {
  164. var execed = {};
  165. hooks.pre('cook', function(next) {
  166. execed.first = true;
  167. next(null, 'test');
  168. });
  169. hooks.pre('cook', function(next, p) {
  170. execed.second = true;
  171. assert.equal(p, 'test');
  172. next();
  173. });
  174. hooks.pre('cook', function(next, p) {
  175. execed.third = true;
  176. assert.ok(!p);
  177. next();
  178. });
  179. hooks.execPre('cook', null, function(err) {
  180. assert.ifError(err);
  181. assert.equal(3, Object.keys(execed).length);
  182. assert.ok(execed.first);
  183. assert.ok(execed.second);
  184. assert.ok(execed.third);
  185. done();
  186. });
  187. });
  188. });