mirror of https://github.com/IoTcat/FDC.git
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
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(); |
|
} |
|
};
|
|
|