node-schedule 1.2.5 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,375 @@
1
+
2
+ 'use strict';
3
+
4
+ var main = require('../package.json').main;
5
+ var schedule = require('../' + main);
6
+ var sinon = require('sinon');
7
+ var clock;
8
+
9
+ // 12:30:15 pm Thursday 29 April 2010 in the timezone this code is being run in
10
+ var base = new Date(2010, 3, 29, 12, 30, 15, 0);
11
+ var baseMs = base.getTime();
12
+
13
+ module.exports = {
14
+ "setUp": function(cb) {
15
+ clock = sinon.useFakeTimers(baseMs);
16
+ cb();
17
+ },
18
+ "tearDown": function(cb) {
19
+ clock.restore();
20
+ cb();
21
+ },
22
+ "#nextInvocationDate(Date)": {
23
+ "next second": function(test) {
24
+ var rule = new schedule.RecurrenceRule();
25
+ rule.second = null;
26
+
27
+ var next = rule.nextInvocationDate(base);
28
+
29
+ test.deepEqual(new Date(2010, 3, 29, 12, 30, 16, 0), next);
30
+ test.done();
31
+ },
32
+ "next 25th second": function(test) {
33
+ var rule = new schedule.RecurrenceRule();
34
+ rule.second = 25;
35
+
36
+ var next = rule.nextInvocationDate(base);
37
+
38
+ test.deepEqual(new Date(2010, 3, 29, 12, 30, 25, 0), next);
39
+ test.done();
40
+ },
41
+ "next 5th second (minutes incremented)": function(test) {
42
+ var rule = new schedule.RecurrenceRule();
43
+ rule.second = 5;
44
+
45
+ var next = rule.nextInvocationDate(base);
46
+
47
+ test.deepEqual(new Date(2010, 3, 29, 12, 31, 5, 0), next);
48
+ test.done();
49
+ },
50
+ "next 40th minute": function(test) {
51
+ var rule = new schedule.RecurrenceRule();
52
+ rule.minute = 40;
53
+
54
+ var next = rule.nextInvocationDate(base);
55
+
56
+ test.deepEqual(new Date(2010, 3, 29, 12, 40, 0, 0), next);
57
+ test.done();
58
+ },
59
+ "next 1st minute (hours incremented)": function(test) {
60
+ var rule = new schedule.RecurrenceRule();
61
+ rule.minute = 1;
62
+
63
+ var next = rule.nextInvocationDate(base);
64
+
65
+ test.deepEqual(new Date(2010, 3, 29, 13, 1, 0, 0), next);
66
+ test.done();
67
+ },
68
+ "next 23rd hour": function(test) {
69
+ var rule = new schedule.RecurrenceRule();
70
+ rule.hour = 23;
71
+
72
+ var next = rule.nextInvocationDate(base);
73
+
74
+ test.deepEqual(new Date(2010, 3, 29, 23, 0, 0, 0), next);
75
+ test.done();
76
+ },
77
+ "next 3rd hour (days incremented)": function(test) {
78
+ var rule = new schedule.RecurrenceRule();
79
+ rule.hour = 3;
80
+
81
+ var next = rule.nextInvocationDate(base);
82
+
83
+ test.deepEqual(new Date(2010, 3, 30, 3, 0, 0, 0), next);
84
+ test.done();
85
+ },
86
+ "next Friday": function(test) {
87
+ var rule = new schedule.RecurrenceRule();
88
+ rule.dayOfWeek = 5;
89
+
90
+ var next = rule.nextInvocationDate(base);
91
+
92
+ test.deepEqual(new Date(2010, 3, 30, 0, 0, 0, 0), next);
93
+ test.done();
94
+ },
95
+ "next Monday (months incremented)": function(test) {
96
+ var rule = new schedule.RecurrenceRule();
97
+ rule.dayOfWeek = 1;
98
+
99
+ var next = rule.nextInvocationDate(base);
100
+
101
+ test.deepEqual(new Date(2010, 4, 3, 0, 0, 0, 0), next);
102
+ test.done();
103
+ },
104
+ "next 30th date": function(test) {
105
+ var rule = new schedule.RecurrenceRule();
106
+ rule.date = 30;
107
+
108
+ var next = rule.nextInvocationDate(base);
109
+
110
+ test.deepEqual(new Date(2010, 3, 30, 0, 0, 0, 0), next);
111
+ test.done();
112
+ },
113
+ "next 5th date (months incremented)": function(test) {
114
+ var rule = new schedule.RecurrenceRule();
115
+ rule.date = 5;
116
+
117
+ var next = rule.nextInvocationDate(base);
118
+
119
+ test.deepEqual(new Date(2010, 4, 5, 0, 0, 0, 0), next);
120
+ test.done();
121
+ },
122
+ "next October": function(test) {
123
+ var rule = new schedule.RecurrenceRule();
124
+ rule.month = 9;
125
+
126
+ var next = rule.nextInvocationDate(base);
127
+
128
+ test.deepEqual(new Date(2010, 9, 1, 0, 0, 0, 0), next);
129
+ test.done();
130
+ },
131
+ "next February (years incremented)": function(test) {
132
+ var rule = new schedule.RecurrenceRule();
133
+ rule.month = 1;
134
+
135
+ var next = rule.nextInvocationDate(base);
136
+
137
+ test.deepEqual(new Date(2011, 1, 1, 0, 0, 0, 0), next);
138
+ test.done();
139
+ },
140
+ "in the year 2040": function(test) {
141
+ var rule = new schedule.RecurrenceRule();
142
+ rule.year = 2040;
143
+
144
+ var next = rule.nextInvocationDate(base);
145
+
146
+ test.deepEqual(new Date(2040, 0, 1, 0, 0, 0, 0), next);
147
+ test.done();
148
+ },
149
+ "using past year": function(test) {
150
+ var rule = new schedule.RecurrenceRule();
151
+ rule.year = 2000;
152
+
153
+ var next = rule.nextInvocationDate(base);
154
+
155
+ test.equal(null, next);
156
+ test.done();
157
+ },
158
+ "using mixed time components": function(test) {
159
+ var rule = new schedule.RecurrenceRule();
160
+ rule.second = 50;
161
+ rule.minute = 5;
162
+ rule.hour = 10;
163
+
164
+ var next = rule.nextInvocationDate(base);
165
+
166
+ test.deepEqual(new Date(2010, 3, 30, 10, 5, 50, 0), next);
167
+ test.done();
168
+ },
169
+ /*
170
+ "using date and dayOfWeek together": function(test) {
171
+ var rule = new schedule.RecurrenceRule();
172
+ rule.dayOfWeek = 4; // This is Thursday April 1st
173
+ rule.date = 10; // This is Saturday April 10th
174
+
175
+ var next = rule.nextInvocationDate(base);
176
+
177
+ test.deepEqual(new Date(2010, 3, 1, 0, 0, 0, 0), next);
178
+ test.done();
179
+ }*/
180
+ "returns null when no invocations left": function(test) {
181
+ var rule = new schedule.RecurrenceRule();
182
+ rule.year = 2000;
183
+
184
+ var next = rule.nextInvocationDate(base);
185
+
186
+ test.strictEqual(null, next);
187
+ test.done();
188
+ },
189
+ "specify span of components using Range": function(test) {
190
+ var rule = new schedule.RecurrenceRule();
191
+ rule.minute = new schedule.Range(4, 6);
192
+
193
+ var next;
194
+
195
+ next = rule.nextInvocationDate(base);
196
+ test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next);
197
+
198
+ next = rule.nextInvocationDate(next);
199
+ test.deepEqual(new Date(2010, 3, 29, 13, 5, 0, 0), next);
200
+
201
+ next = rule.nextInvocationDate(next);
202
+ test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next);
203
+
204
+ next = rule.nextInvocationDate(next);
205
+ test.deepEqual(new Date(2010, 3, 29, 14, 4, 0, 0), next);
206
+
207
+ test.done();
208
+ },
209
+ "specify intervals within span of components using Range with step": function(test) {
210
+ var rule = new schedule.RecurrenceRule();
211
+ rule.minute = new schedule.Range(4, 8, 2);
212
+
213
+ var next;
214
+
215
+ next = rule.nextInvocationDate(base);
216
+ test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next);
217
+
218
+ next = rule.nextInvocationDate(next);
219
+ test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next);
220
+
221
+ /* Should Range stay inclusive on both ends when step > 1
222
+ next = rule.nextInvocationDate(next);
223
+ test.deepEqual(new Date(2010, 3, 29, 13, 8, 0, 0), next);
224
+ */
225
+
226
+ next = rule.nextInvocationDate(next);
227
+ test.deepEqual(new Date(2010, 3, 29, 14, 4, 0, 0), next);
228
+
229
+ test.done();
230
+ },
231
+ "specify span and explicit components using Array of Ranges and Numbers": function(test) {
232
+ var rule = new schedule.RecurrenceRule();
233
+ rule.minute = [2, new schedule.Range(4, 6)];
234
+
235
+ var next;
236
+
237
+ next = rule.nextInvocationDate(base);
238
+ test.deepEqual(new Date(2010, 3, 29, 13, 2, 0, 0), next);
239
+
240
+ next = rule.nextInvocationDate(next);
241
+ test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next);
242
+
243
+ next = rule.nextInvocationDate(next);
244
+ test.deepEqual(new Date(2010, 3, 29, 13, 5, 0, 0), next);
245
+
246
+ next = rule.nextInvocationDate(next);
247
+ test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next);
248
+
249
+ next = rule.nextInvocationDate(next);
250
+ test.deepEqual(new Date(2010, 3, 29, 14, 2, 0, 0), next);
251
+
252
+ test.done();
253
+ },
254
+ "From 31th May schedule the 1st of every June": function(test) {
255
+ var rule = new schedule.RecurrenceRule();
256
+ rule.second = 0;
257
+ rule.minute = 0;
258
+ rule.hour = 0;
259
+ rule.date = 1;
260
+ rule.month = 5;
261
+
262
+ var next;
263
+ var base1 = new Date(2010, 4, 31, 12, 30, 15, 0);
264
+
265
+ next = rule.nextInvocationDate(base1);
266
+ test.deepEqual(new Date(2010, 5, 1, 0, 0, 0, 0), next);
267
+
268
+ next = rule.nextInvocationDate(next);
269
+ test.deepEqual(new Date(2011, 5, 1, 0, 0, 0, 0), next);
270
+
271
+ test.done();
272
+ },
273
+ "With the year set should not loop indefinetely": function(test) {
274
+ var rule = new schedule.RecurrenceRule();
275
+ rule.second = 0;
276
+ rule.minute = 0;
277
+ rule.hour = 0;
278
+ rule.date = 1;
279
+ rule.month = 5;
280
+ rule.year = 2010;
281
+
282
+ var next;
283
+ var base1 = new Date(2010, 4, 31, 12, 30, 15, 0);
284
+
285
+ next = rule.nextInvocationDate(base1);
286
+ test.deepEqual(new Date(2010, 5, 1, 0, 0, 0, 0), next);
287
+
288
+ next = rule.nextInvocationDate(next);
289
+ test.equal(next, null);
290
+
291
+ test.done();
292
+ },
293
+ "using rule with string properties": function(test) {
294
+ var rule = new schedule.RecurrenceRule();
295
+ rule.second = '50';
296
+ rule.minute = '5';
297
+ rule.hour = '10';
298
+ var next = rule.nextInvocationDate(base);
299
+ test.deepEqual(new Date(2010, 3, 30, 10, 5, 50, 0), next);
300
+ test.done();
301
+ },
302
+ "nextInvocationDate on an invalid month should return null": function(test) {
303
+ var rule = new schedule.RecurrenceRule();
304
+ rule.month = 12;
305
+ var next = rule.nextInvocationDate();
306
+ test.equal(next, null);
307
+
308
+ var rule2 = new schedule.RecurrenceRule();
309
+ rule2.month = 'asdfasdf';
310
+ var next2 = rule2.nextInvocationDate(next);
311
+ test.equal(next2, null);
312
+
313
+ test.done();
314
+ },
315
+ "nextInvocationDate on an invalid second should return null": function(test) {
316
+ var rule = new schedule.RecurrenceRule();
317
+ rule.second = 60;
318
+ var next = rule.nextInvocationDate();
319
+ test.equal(next, null);
320
+
321
+ var rule2 = new schedule.RecurrenceRule();
322
+ rule2.second = 'asdfasdf';
323
+ var next2 = rule2.nextInvocationDate();
324
+ test.equal(next2, null);
325
+
326
+ test.done();
327
+ },
328
+ "nextInvocationDate on an invalid hour should return null": function(test) {
329
+ var rule = new schedule.RecurrenceRule();
330
+ rule.hour = 24;
331
+ var next = rule.nextInvocationDate();
332
+ test.equal(next, null);
333
+
334
+ var rule2 = new schedule.RecurrenceRule();
335
+ rule2.hour = 'asdfasdf';
336
+ var next2 = rule2.nextInvocationDate();
337
+ test.equal(next2, null);
338
+
339
+ test.done();
340
+ },
341
+ "nextInvocationDate on an invalid date should return null": function(test) {
342
+ var rule = new schedule.RecurrenceRule();
343
+ rule.date = 90;
344
+ var next = rule.nextInvocationDate();
345
+ test.equal(next, null);
346
+
347
+ // Test February
348
+ var rule2 = new schedule.RecurrenceRule();
349
+ rule2.month = 1;
350
+ rule2.date = 30;
351
+ var next2 = rule2.nextInvocationDate();
352
+ test.equal(next2, null);
353
+
354
+ var rule3 = new schedule.RecurrenceRule();
355
+ rule3.date = 'asdfasdf';
356
+ var next3 = rule3.nextInvocationDate();
357
+ test.equal(next3, null);
358
+
359
+ test.done();
360
+ },
361
+ "nextInvocationDate on an invalid dayOfWeek should return null": function(test) {
362
+ var rule = new schedule.RecurrenceRule();
363
+ rule.dayOfWeek = 90;
364
+ var next = rule.nextInvocationDate();
365
+ test.equal(next, null);
366
+
367
+ var rule2 = new schedule.RecurrenceRule();
368
+ rule2.dayOfWeek = 'asdfasdf';
369
+ var next2 = rule.nextInvocationDate();
370
+ test.equal(next2, null);
371
+
372
+ test.done();
373
+ }
374
+ }
375
+ };
@@ -0,0 +1,134 @@
1
+
2
+ 'use strict';
3
+
4
+ var sinon = require('sinon');
5
+ var main = require('../package.json').main;
6
+ var schedule = require('../' + main);
7
+
8
+ var clock;
9
+
10
+ module.exports = {
11
+ ".scheduleJob(cron_expr, fn)": {
12
+ setUp: function(cb) {
13
+ clock = sinon.useFakeTimers();
14
+ cb();
15
+ },
16
+ "Runs job every second": function(test) {
17
+ test.expect(3);
18
+
19
+ var timeout = 3 * 1000 + 150;
20
+
21
+ var job = schedule.scheduleJob('* * * * * *', function() {
22
+ test.ok(true);
23
+ });
24
+
25
+ setTimeout(function() {
26
+ job.cancel();
27
+ test.done();
28
+ }, timeout);
29
+
30
+ clock.tick(timeout);
31
+ },
32
+ "Runs job every minute": function(test) {
33
+ test.expect(3);
34
+
35
+ var timeout = 3 * 60 * 1000 + 150;
36
+
37
+ var job = schedule.scheduleJob('0 * * * * *', function() {
38
+ test.ok(true);
39
+ });
40
+
41
+ setTimeout(function() {
42
+ job.cancel();
43
+ test.done();
44
+ }, timeout);
45
+
46
+ clock.tick(timeout);
47
+ },
48
+ "Runs job every hour": function(test) {
49
+ test.expect(3);
50
+
51
+ var timeout = 3 * 60 * 60 * 1000 + 150;
52
+
53
+ var job = schedule.scheduleJob('0 0 * * * *', function() {
54
+ test.ok(true);
55
+ });
56
+
57
+ setTimeout(function() {
58
+ job.cancel();
59
+ test.done();
60
+ }, timeout);
61
+
62
+ clock.tick(timeout);
63
+ },
64
+ "Runs job every day": function(test) {
65
+ test.expect(3);
66
+
67
+ var timeout = 3 * 24 * 60 * 60 * 1000 + 150;
68
+
69
+ var job = schedule.scheduleJob('0 0 0 * * *', function() {
70
+ test.ok(true);
71
+ });
72
+
73
+ setTimeout(function() {
74
+ job.cancel();
75
+ test.done();
76
+ }, timeout);
77
+
78
+ clock.tick(timeout);
79
+ },
80
+ "Runs job every week": function(test) {
81
+ test.expect(3);
82
+
83
+ var timeout = 3 * 7 * 24 * 60 * 60 * 1000 + 150;
84
+
85
+ var job = schedule.scheduleJob('0 0 0 * * 1', function() {
86
+ test.ok(true);
87
+ });
88
+
89
+ setTimeout(function() {
90
+ job.cancel();
91
+ test.done();
92
+ }, timeout);
93
+
94
+ clock.tick(timeout);
95
+ },
96
+ "Runs job every month": function(test) {
97
+ test.expect(48);
98
+
99
+ var timeout = 4 * 365.25 * 24 * 60 * 60 * 1000 + 150;
100
+
101
+ var job = schedule.scheduleJob('0 0 0 1 * *', function() {
102
+ test.ok(true);
103
+ });
104
+
105
+ setTimeout(function() {
106
+ job.cancel();
107
+ test.done();
108
+ }, timeout);
109
+
110
+ clock.tick(timeout);
111
+
112
+ },
113
+ "Runs job every year": function(test) {
114
+ test.expect(4);
115
+
116
+ var timeout = 4 * 365.25 * 24 * 60 * 60 * 1000 + 150;
117
+
118
+ var job = schedule.scheduleJob('0 0 0 1 1 *', function() {
119
+ test.ok(true);
120
+ });
121
+
122
+ setTimeout(function() {
123
+ job.cancel();
124
+ test.done();
125
+ }, timeout);
126
+
127
+ clock.tick(timeout);
128
+ },
129
+ tearDown: function(cb) {
130
+ clock.restore();
131
+ cb();
132
+ }
133
+ }
134
+ };