relyq
Version:
A reliable redis-backed queue.
137 lines (123 loc) • 4.38 kB
JavaScript
// defer_test.js
// vendor
var redisPkg = require('redis'),
createRedis = function () { return redisPkg.createClient(6379, 'localhost', { enable_offline_queue: false }) },
Moniker = require('moniker'),
async = require('async'),
_ = require('underscore');
// local
var relyq = require('..');
// Setup
var tests = exports.tests = {},
Q;
process.on('uncaughtException', function (err) {
console.error(err.stack);
});
tests.setUp = function setUp (callback) {
Q = new relyq.Q({
prefix: 'relyq-test:' + Moniker.choose(),
clean_finish: true,
allow_defer: true,
defer_polling_interval: 50,
allow_recur: true,
recur_polling_interval: 50,
createRedis: createRedis
})
.on('error', function (err) {
console.error(err.stack);
});
async.parallel([
Q.once.bind(Q, 'ready'),
Q.on.bind(Q, 'deferred-ready'),
Q.on.bind(Q, 'recurring-ready'),
], callback)
};
tests.tearDown = function tearDown (callback) {
if (Q) {
return async.parallel([
_.bind(Q.todo.clear, Q.todo),
_.bind(Q.doing.clear, Q.doing),
_.bind(Q.failed.clear, Q.failed),
], function (err) {
Q.end(callback);
});
}
callback();
};
// Clean up redis to allow a clean escape!
exports.cleanUp = function cleanUp (test) {
test.done();
};
// -- helpers --
function checkByList(test, sQ, exp) {
var stack = new Error().stack;
return function (callback) {
async.waterfall([
_.bind(sQ.list, sQ),
function (list, cb) {
async.map(list, function (ref, cb2) {
Q.get(ref, function (err, obj) {
cb2(err, obj.f);
});
}, cb);
},
function (list2, cb) {
test.deepEqual(list2, exp, 'checkByStorageList at ' + Date.now() + ': ' + stack);
cb();
}
], callback);
};
}
tests.testDefer = function (test) {
var now = Date.now();
async.auto({
defer: _.bind(Q.defer, Q, {f:'i should be late'}, Date.now() + 100),
testnotthere: checkByList(test, Q.todo, []),
wait: ['defer', function (cb, results) { setTimeout(cb, 150); }],
testtodo: ['wait', checkByList(test, Q.todo, ['i should be late'])],
process: ['testtodo', function (cb, results) { Q.process(cb); }],
// testproc: ['process', function (cb, results) { test.equal(results.process.f, 'i should be late'); cb(); }],
}, test.done);
}
tests.testUndefer = function (test) {
var now = Date.now();
async.auto({
defer: Q.defer.bind(Q, {f:'nomnom', id: 'cookie-monster'}, Date.now() + 50),
defer2: Q.push.bind(Q, {f: 'yummy', id: 'veggie-monster', when: Date.now() + 100}),
undefer_remove: ['defer', Q.undefer_remove.bind(Q, 'cookie-monster')],
undefer_push: ['defer2', Q.undefer_push.bind(Q, 'veggie-monster')],
testtodo: ['undefer_push', 'undefer_remove', checkByList(test, Q.todo, ['yummy'])],
wait: ['testtodo', function (cb) { setTimeout(cb, 120) }],
process: ['testtodo', function (cb, results) { Q.process(cb); }],
}, test.done);
}
tests.testRecur = function (test) {
async.auto({
recur: _.bind(Q.recur, Q, {f:'recurrence'}, 100),
w1: ['recur', function (cb, results) {setTimeout(cb, 75);}],
t1: ['w1', checkByList(test, Q.todo, ['recurrence'])],
f1: ['t1', _.bind(Q.process, Q)],
f2: ['f1', function (cb, res) { if (!res.f1) return cb(new Error('nothing to process')); Q.finish(res.f1, cb); }],
t2: ['f1', checkByList(test, Q.todo, [])],
w2: ['w1', function (cb, res) { setTimeout(cb, 100); }],
t3: ['w2', checkByList(test, Q.todo, ['recurrence'])],
}, test.done)
}
tests.testDoubleRecur = function (test) {
async.auto({
recur1: _.bind(Q.recur, Q, {f:'recurrence', id: '123'}, 100),
recur: ['recur1', _.bind(Q.recur, Q, {f:'recurrence', id: '123'}, 100)],
w1: ['recur', function (cb, results) {setTimeout(cb, 75);}],
t1: ['w1', checkByList(test, Q.todo, ['recurrence'])],
}, test.done)
}
tests.testRecurRemove = function (test) {
async.auto({
recur: _.bind(Q.recur, Q, {f:'recurrer', id:'456'}, 100),
w1: ['recur', function (cb, results) {setTimeout(cb, 75);}],
t1: ['w1', checkByList(test, Q.todo, ['recurrer'])],
remove: ['w1', _.bind(Q.recurring.remove, Q.recurring, '456', 100)],
w2: ['w1', function (cb, results) {setTimeout(cb, 150);}],
t2: ['w2', checkByList(test, Q.todo, ['recurrer'])],
}, test.done)
}