You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

713 lines
16 KiB

'use strict';
var sinon = require('sinon');
var main = require('../package.json').main;
var schedule = require('../' + main);
var clock;
module.exports = {
setUp: function(cb) {
clock = sinon.useFakeTimers();
cb();
},
".scheduleJob": {
"Returns Job instance": function(test) {
var job = schedule.scheduleJob(new Date(Date.now() + 1000), function() {});
test.ok(job instanceof schedule.Job);
job.cancel();
test.done();
}
},
".scheduleJob(Date, fn)": {
"Runs job once at some date": function(test) {
test.expect(1);
schedule.scheduleJob(new Date(Date.now() + 3000), function() {
test.ok(true);
});
setTimeout(function() {
test.done();
}, 3250);
clock.tick(3250);
},
"Job doesn't emit initial 'scheduled' event": function(test) {
var job = schedule.scheduleJob(new Date(Date.now() + 1000), function() {});
job.on('scheduled', function() {
test.ok(false);
});
setTimeout(function() {
test.done();
}, 1250);
clock.tick(1250);
},
"Won't run job if scheduled in the past": function(test) {
test.expect(1);
var job = schedule.scheduleJob(new Date(Date.now() - 3000), function() {
test.ok(false);
});
test.equal(job, null);
setTimeout(function() {
test.done();
}, 1000);
clock.tick(1000);
}
},
".scheduleJob(RecurrenceRule, fn)": {
"Runs job at interval based on recur rule, repeating indefinitely": function(test) {
test.expect(3);
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
setTimeout(function() {
job.cancel();
test.done();
}, 3250);
clock.tick(3250);
},
"Job doesn't emit initial 'scheduled' event": function(test) {
/*
* If this was Job#schedule it'd fire 4 times.
*/
test.expect(3);
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = new schedule.scheduleJob(rule, function() {});
job.on('scheduled', function(runOnDate) {
test.ok(true);
});
setTimeout(function() {
job.cancel();
test.done();
}, 3250);
clock.tick(3250);
},
"Doesn't invoke job if recur rule schedules it in the past": function(test) {
test.expect(1);
var rule = new schedule.RecurrenceRule();
rule.year = 1960;
var job = schedule.scheduleJob(rule, function() {
test.ok(false);
});
test.equal(job, null);
setTimeout(function() {
test.done();
}, 1000);
clock.tick(1000);
}
},
".scheduleJob({...}, fn)": {
"Runs job at interval based on object, repeating indefinitely": function(test) {
test.expect(3);
var job = new schedule.scheduleJob({
second: null // Fire every second
}, function() {
test.ok(true);
});
setTimeout(function() {
job.cancel();
test.done();
}, 3250);
clock.tick(3250);
},
"Job doesn't emit initial 'scheduled' event": function(test) {
/*
* With Job#schedule this would be 3:
* scheduled at time 0
* scheduled at time 1000
* scheduled at time 2000
*/
test.expect(2);
var job = schedule.scheduleJob({
second: null // fire every second
}, function() {});
job.on('scheduled', function() {
test.ok(true);
});
setTimeout(function() {
job.cancel();
test.done();
}, 2250);
clock.tick(2250);
},
"Doesn't invoke job if object schedules it in the past": function(test) {
test.expect(1);
var job = schedule.scheduleJob({
year: 1960
}, function() {
test.ok(false);
});
test.equal(job, null);
setTimeout(function() {
test.done();
}, 1000);
clock.tick(1000);
}
},
".scheduleJob({...}, {...}, fn)": {
"Callback called for each job if callback is provided": function(test) {
test.expect(3);
var job = new schedule.scheduleJob({
second: null // Fire every second
}, function() {}, function() {
test.ok(true);
});
setTimeout(function() {
job.cancel();
test.done();
}, 3250);
clock.tick(3250);
}
},
".rescheduleJob(job, {...})": {
"Reschedule jobs from object based to object based": function(test) {
test.expect(3);
var job = new schedule.scheduleJob({
second: null
}, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job, {
minute: null
});
}, 3250);
setTimeout(function() {
job.cancel();
test.done();
}, 5000);
clock.tick(5000);
},
"Reschedule jobs from every minutes to every second": function(test) {
test.expect(3);
var timeout = 60 * 1000;
var job = new schedule.scheduleJob({
minute: null
}, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job, {
second: null
});
}, timeout);
setTimeout(function() {
job.cancel();
test.done();
}, timeout + 2250);
clock.tick(timeout + 2250);
}
},
".rescheduleJob(job, Date)": {
"Reschedule jobs from Date to Date": function(test) {
test.expect(1);
var job = new schedule.scheduleJob(new Date(Date.now() + 3000), function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job, new Date(Date.now() + 5000));
}, 1000);
setTimeout(function() {
test.done();
}, 6150);
clock.tick(6150);
},
"Reschedule jobs that has been executed": function(test) {
test.expect(2);
var job = new schedule.scheduleJob(new Date(Date.now() + 1000), function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job, new Date(Date.now() + 2000));
}, 2000);
setTimeout(function() {
test.done();
}, 5150);
clock.tick(5150);
}
},
".rescheduleJob(job, RecurrenceRule)": {
"Reschedule jobs from RecurrenceRule to RecurrenceRule": function(test) {
test.expect(3);
var timeout = 60 * 1000;
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
var newRule = new schedule.RecurrenceRule();
newRule.minute = null;
setTimeout(function() {
schedule.rescheduleJob(job, newRule);
}, 2250);
setTimeout(function() {
job.cancel();
test.done();
}, timeout + 2250);
clock.tick(timeout + 2250);
},
"Reschedule jobs from RecurrenceRule to Date": function(test) {
test.expect(3);
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job, new Date(Date.now() + 2000));
}, 2150);
setTimeout(function() {
test.done();
}, 4250);
clock.tick(4250);
},
"Reschedule jobs from RecurrenceRule to {...}": function(test) {
test.expect(3);
var timeout = 60 * 1000;
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job, {
minute: null
});
}, 2150);
setTimeout(function() {
job.cancel();
test.done();
}, timeout + 2150);
clock.tick(timeout + 2150);
},
"Reschedule jobs that is not available": function(test) {
test.expect(4);
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(null, new Date(Date.now() + 2000));
}, 2150);
setTimeout(function() {
job.cancel();
test.done();
}, 4250);
clock.tick(4250);
}
},
'.rescheduleJob("job name", {...})': {
"Reschedule jobs from object based to object based": function(test) {
test.expect(3);
var job = new schedule.scheduleJob({
second: null
}, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job.name, {
minute: null
});
}, 3250);
setTimeout(function() {
job.cancel();
test.done();
}, 5000);
clock.tick(5000);
},
"Reschedule jobs from every minutes to every second": function(test) {
test.expect(3);
var timeout = 60 * 1000;
var job = new schedule.scheduleJob({
minute: null
}, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job.name, {
second: null
});
}, timeout);
setTimeout(function() {
job.cancel();
test.done();
}, timeout + 2250);
clock.tick(timeout + 2250);
}
},
'.rescheduleJob("job name", Date)': {
"Reschedule jobs from Date to Date": function(test) {
test.expect(1);
var job = new schedule.scheduleJob(new Date(Date.now() + 3000), function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job.name, new Date(Date.now() + 5000));
}, 1000);
setTimeout(function() {
test.done();
}, 6150);
clock.tick(6150);
},
"Reschedule jobs that has been executed": function(test) {
test.expect(2);
var job = new schedule.scheduleJob(new Date(Date.now() + 1000), function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job.name, new Date(Date.now() + 2000));
}, 2000);
setTimeout(function() {
test.done();
}, 5150);
clock.tick(5150);
}
},
'.rescheduleJob("job name", RecurrenceRule)': {
"Reschedule jobs from RecurrenceRule to RecurrenceRule": function(test) {
test.expect(3);
var timeout = 60 * 1000;
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
var newRule = new schedule.RecurrenceRule();
newRule.minute = null;
setTimeout(function() {
schedule.rescheduleJob(job.name, newRule);
}, 2250);
setTimeout(function() {
job.cancel();
test.done();
}, timeout + 2250);
clock.tick(timeout + 2250);
},
"Reschedule jobs from RecurrenceRule to Date": function(test) {
test.expect(3);
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job.name, new Date(Date.now() + 2000));
}, 2150);
setTimeout(function() {
test.done();
}, 4250);
clock.tick(4250);
},
"Reschedule jobs from RecurrenceRule to {...}": function(test) {
test.expect(3);
var timeout = 60 * 1000;
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob(job.name, {
minute: null
});
}, 2150);
setTimeout(function() {
job.cancel();
test.done();
}, timeout + 2150);
clock.tick(timeout + 2150);
},
"Reschedule jobs that is not available": function(test) {
test.expect(4);
var rule = new schedule.RecurrenceRule();
rule.second = null; // fire every second
var job = schedule.scheduleJob(rule, function() {
test.ok(true);
});
setTimeout(function() {
schedule.rescheduleJob("Blah", new Date(Date.now() + 2000));
}, 2150);
setTimeout(function() {
job.cancel();
test.done();
}, 4250);
clock.tick(4250);
}
},
".cancelJob(Job)": {
"Prevents all future invocations of Job passed in": function(test) {
test.expect(2);
var job = schedule.scheduleJob({
second: null
}, function() {
test.ok(true);
});
setTimeout(function() {
schedule.cancelJob(job);
}, 2250);
setTimeout(function() {
test.done();
}, 3250);
clock.tick(3250);
},
"Can cancel Jobs scheduled with Job#schedule": function(test) {
test.expect(2);
var job = new schedule.Job(function() {
test.ok(true);
});
job.schedule({
second: null
});
setTimeout(function() {
schedule.cancelJob(job);
}, 2250);
setTimeout(function() {
test.done();
}, 3250);
clock.tick(3250);
},
"Job emits 'canceled' event": function(test) {
test.expect(1);
var job = schedule.scheduleJob({
second: null
}, function() {});
job.on('canceled', function() {
test.ok(true);
});
setTimeout(function() {
schedule.cancelJob(job);
test.done();
}, 1250);
clock.tick(1250);
}
},
'.cancelJob("job name")': {
"Prevents all future invocations of Job identified by name": function(test) {
test.expect(2);
var job = schedule.scheduleJob({
second: null
}, function() {
test.ok(true);
});
setTimeout(function() {
schedule.cancelJob(job.name);
}, 2250);
setTimeout(function() {
test.done();
}, 3250);
clock.tick(3250);
},
/*
"Can cancel Jobs scheduled with Job#schedule": function(test) {
test.expect(2);
var job = new schedule.Job(function() {
test.ok(true);
});
job.schedule({
second: null
});
setTimeout(function() {
schedule.cancelJob(job.name);
}, 2250);
setTimeout(function() {
test.done();
}, 3250);
},*/
"Job emits 'canceled' event": function(test) {
test.expect(1);
var job = schedule.scheduleJob({
second: null
}, function() {});
job.on('canceled', function() {
test.ok(true);
});
setTimeout(function() {
schedule.cancelJob(job.name);
test.done();
}, 1250);
clock.tick(1250);
},
"Does nothing if no job found by that name": function(test) {
test.expect(3);
var job = schedule.scheduleJob({
second: null
}, function() {
test.ok(true);
});
setTimeout(function() {
// This cancel should not affect anything
schedule.cancelJob('blah');
}, 2250);
setTimeout(function() {
job.cancel(); // prevent tests from hanging
test.done();
}, 3250);
clock.tick(3250);
}
},
'.pendingInvocations()': {
"Retrieves pendingInvocations of the job": function(test) {
var job = schedule.scheduleJob(new Date(Date.now() + 1000), function() {});
test.ok(job instanceof schedule.Job);
test.ok(job.pendingInvocations()[0].job);
job.cancel();
test.done();
}
},
tearDown: function(cb) {
clock.restore();
cb();
}
};