b3fe7d01f3825cabe60075c329f355761b94ba25
[aai/esr-gui.git] /
1 var assert = require('assert');
2 var Kareem = require('../');
3
4 describe('wrap()', function() {
5   var hooks;
6
7   beforeEach(function() {
8     hooks = new Kareem();
9   });
10
11   it('handles pre errors', function(done) {
12     hooks.pre('cook', function(done) {
13       done('error!');
14     });
15
16     hooks.post('cook', function(obj) {
17       obj.tofu = 'no';
18     });
19
20     var obj = { bacon: 0, eggs: 0 };
21
22     var args = [obj];
23     args.push(function(error, result) {
24       assert.equal('error!', error);
25       assert.ok(!result);
26       assert.equal(undefined, obj.tofu);
27       done();
28     });
29
30     hooks.wrap(
31       'cook',
32       function(o, callback) {
33         // Should never get called
34         assert.ok(false);
35         callback(null, o);
36       },
37       obj,
38       args);
39   });
40
41   it('handles pre errors when no callback defined', function(done) {
42     hooks.pre('cook', function(done) {
43       done('error!');
44     });
45
46     hooks.post('cook', function(obj) {
47       obj.tofu = 'no';
48     });
49
50     var obj = { bacon: 0, eggs: 0 };
51
52     var args = [obj];
53
54     hooks.wrap(
55       'cook',
56       function(o, callback) {
57         // Should never get called
58         assert.ok(false);
59         callback(null, o);
60       },
61       obj,
62       args);
63
64     setTimeout(
65       function() {
66         done();
67       },
68       25);
69   });
70
71   it('handles errors in wrapped function', function(done) {
72     hooks.pre('cook', function(done) {
73       done();
74     });
75
76     hooks.post('cook', function(obj) {
77       obj.tofu = 'no';
78     });
79
80     var obj = { bacon: 0, eggs: 0 };
81
82     var args = [obj];
83     args.push(function(error, result) {
84       assert.equal('error!', error);
85       assert.ok(!result);
86       assert.equal(undefined, obj.tofu);
87       done();
88     });
89
90     hooks.wrap(
91       'cook',
92       function(o, callback) {
93         callback('error!');
94       },
95       obj,
96       args);
97   });
98
99   it('handles errors in post', function(done) {
100     hooks.pre('cook', function(done) {
101       done();
102     });
103
104     hooks.post('cook', function(obj, callback) {
105       obj.tofu = 'no';
106       callback('error!');
107     });
108
109     var obj = { bacon: 0, eggs: 0 };
110
111     var args = [obj];
112     args.push(function(error, result) {
113       assert.equal('error!', error);
114       assert.ok(!result);
115       assert.equal('no', obj.tofu);
116       done();
117     });
118
119     hooks.wrap(
120       'cook',
121       function(o, callback) {
122         callback(null, o);
123       },
124       obj,
125       args);
126   });
127
128   it('defers errors to post hooks if enabled', function(done) {
129     hooks.pre('cook', function(done) {
130       done(new Error('fail'));
131     });
132
133     hooks.post('cook', function(error, callback) {
134       callback(new Error('another error occurred'));
135     });
136
137     var args = [];
138     args.push(function(error) {
139       assert.equal(error.message, 'another error occurred');
140       done();
141     });
142
143     hooks.wrap(
144       'cook',
145       function(callback) {
146         assert.ok(false);
147         callback();
148       },
149       null,
150       args,
151       { useErrorHandlers: true });
152   });
153
154   it('error handlers with no callback', function(done) {
155     hooks.pre('cook', function(done) {
156       done(new Error('fail'));
157     });
158
159     hooks.post('cook', function(error, callback) {
160       assert.equal(error.message, 'fail');
161       done();
162     });
163
164     var args = [];
165
166     hooks.wrap(
167       'cook',
168       function(callback) {
169         assert.ok(false);
170         callback();
171       },
172       null,
173       args,
174       { useErrorHandlers: true });
175   });
176
177   it('error handlers with no error', function(done) {
178     hooks.post('cook', function(error, callback) {
179       callback(new Error('another error occurred'));
180     });
181
182     var args = [];
183     args.push(function(error) {
184       assert.ifError(error);
185       done();
186     });
187
188     hooks.wrap(
189       'cook',
190       function(callback) {
191         callback();
192       },
193       null,
194       args,
195       { useErrorHandlers: true });
196   });
197
198   it('works with no args', function(done) {
199     hooks.pre('cook', function(done) {
200       done();
201     });
202
203     hooks.post('cook', function(callback) {
204       obj.tofu = 'no';
205       callback();
206     });
207
208     var obj = { bacon: 0, eggs: 0 };
209
210     var args = [];
211
212     hooks.wrap(
213       'cook',
214       function(callback) {
215         callback(null);
216       },
217       obj,
218       args);
219
220     setTimeout(
221       function() {
222         assert.equal('no', obj.tofu);
223         done();
224       },
225       25);
226   });
227
228   it('handles pre errors with no args', function(done) {
229     hooks.pre('cook', function(done) {
230       done('error!');
231     });
232
233     hooks.post('cook', function(callback) {
234       obj.tofu = 'no';
235       callback();
236     });
237
238     var obj = { bacon: 0, eggs: 0 };
239
240     var args = [];
241
242     hooks.wrap(
243       'cook',
244       function(callback) {
245         callback(null);
246       },
247       obj,
248       args);
249
250     setTimeout(
251       function() {
252         assert.equal(undefined, obj.tofu);
253         done();
254       },
255       25);
256   });
257
258   it('handles wrapped function errors with no args', function(done) {
259     hooks.pre('cook', function(done) {
260       obj.waffles = false;
261       done();
262     });
263
264     hooks.post('cook', function(callback) {
265       obj.tofu = 'no';
266       callback();
267     });
268
269     var obj = { bacon: 0, eggs: 0 };
270
271     var args = [];
272
273     hooks.wrap(
274       'cook',
275       function(callback) {
276         callback('error!');
277       },
278       obj,
279       args);
280
281     setTimeout(
282       function() {
283         assert.equal(false, obj.waffles);
284         assert.equal(undefined, obj.tofu);
285         done();
286       },
287       25);
288   });
289
290   it('handles post errors with no args', function(done) {
291     hooks.pre('cook', function(done) {
292       obj.waffles = false;
293       done();
294     });
295
296     hooks.post('cook', function(callback) {
297       obj.tofu = 'no';
298       callback('error!');
299     });
300
301     var obj = { bacon: 0, eggs: 0 };
302
303     var args = [];
304
305     hooks.wrap(
306       'cook',
307       function(callback) {
308         callback();
309       },
310       obj,
311       args);
312
313     setTimeout(
314       function() {
315         assert.equal(false, obj.waffles);
316         assert.equal('no', obj.tofu);
317         done();
318       },
319       25);
320   });
321
322   it('can use legacy post behavior', function(done) {
323     var called = 0;
324     hooks.post('cook', function(callback) {
325       ++called;
326       callback();
327     });
328
329     var args = [function(error) {
330       assert.equal(called, 0);
331
332       setTimeout(function() {
333         assert.equal(called, 1);
334         done();
335       }, 0);
336     }];
337
338     hooks.wrap(
339       'cook',
340       function(callback) {
341         callback();
342       },
343       null,
344       args,
345       true);
346   });
347 });