hopjs
Version:
A RESTful declarative API framework, with stub generators for Shell, and Android
269 lines (236 loc) • 6.59 kB
JavaScript
var assert = require('assert');
require('should');
var Hop = require('../index');
describe("Job Drivers",function(){
it("should save and load",function(done){
var validJob = {
expiresAt: (new Date()).getTime() + (1000*10)
};
Hop.Job.save("testJob",validJob,function(err,res){
assert.equal(err,null);
assert.deepEqual(res,validJob);
Hop.Job.load("testJob",function(err,res){
assert.equal(err,null);
assert.deepEqual(res,validJob);
done();
});
});
});
it("should expire",function(done){
this.timeout(5000);
var validJob = {
expiresAt: (new Date()).getTime() + (1500*1)
};
Hop.Job.save("testJob",validJob,function(err,res){
assert.equal(err,null);
assert.deepEqual(res,validJob);
setTimeout(function(){
Hop.Job.load("testJob",function(err,res){
assert.equal(err,null);
assert.deepEqual(res,null);
done();
});
},3700);
});
});
it("should be able to load by a unique path",function(done){
var validJob = {
expiresAt: (new Date()).getTime() + (1000*1),
path: "/foo/bar"
};
Hop.Job.save("testJob",validJob,function(err,res){
assert.equal(err,null);
assert.deepEqual(res,validJob);
Hop.Job.loadByPath("/foo/bar",function(err,res){
assert.equal(err,null);
assert.deepEqual(res,validJob);
done();
});
});
});
it("should notify listeners of a job being finished",function(done){
var inputRes = { complete: true };
Hop.Job.wait("testJob",function(err,res){
assert.equal(err,"error");
assert.deepEqual(res,inputRes);
done();
});
setTimeout(function(){
Hop.Job.notifyFinished("testJob","error",inputRes,function(err,res){
});
},500);
});
it("should notify listeners of job status",function(done){
var inputRes = { complete: true };
Hop.Job.listen("testJob",function(msg,percent){
assert.equal(msg,"running");
assert.equal(percent,51);
done();
});
setTimeout(function(){
Hop.Job.notifyStatus("testJob","running",51,function(err,res){
});
},500);
});
});
var JobTest = function(){
}
JobTest.prototype.singletonJobRepeat=function(input,onComplete){
setTimeout(function(){
return onComplete(null,{ when: new Date().getTime() });
},1500);
}
JobTest.prototype.jobStatusTest=function(input,onComplete,req){
var count=0;
var countUp = function(){
if(count<100){
count+=4;
if(req.job){
req.job.setStatus("Status "+count,count);
}
setTimeout(function(){
countUp();
},50);
} else {
return onComplete(null,{ when: new Date().getTime() });
}
};
countUp();
}
JobTest.prototype.singletonJob=function(input,onComplete){
setTimeout(function(){
return onComplete(null,{ when: new Date().getTime() });
},1500);
}
Hop.defineClass("JobTest",new JobTest(),function(api){
api.get("singletonJob","/singletonJob").trackJob("/job/"+(new Date()).getTime());
api.get("singletonJobRepeat","/singletonJobRepeat").trackJob("/job/"+(new Date()).getTime(),10000,true);
api.get("jobStatusTest","/jobStatusTest").trackJob();
});
describe("Highlevel Job Interface",function(){
it("should track the status of a job",function(done){
this.timeout(8000);
var count=0;
var request = new Hop.StubRequest();
setTimeout(function(){
var listenToJob=function(){
Hop.Job.listen(request.job.jobID,function(msg,percent){
count++;
listenToJob();
});
}
listenToJob()
Hop.Job.wait(request.job.jobID,function(err,result){
assert.ok(result);
assert.ok(count>10);
done();
});
},50);
Hop.call("JobTest.jobStatusTest",{},function(err,res){
assert.ok(res);
},request);
});
it("should prevent running a singleton job more then once",function(done){
this.timeout(8000);
var checkResults=function(){
assert.ok(results.sRes.when);
assert.equal(results.fErr,results.sErr);
assert.equal(results.fErr,results.kErr);
assert.deepEqual(results.fRes,results.sRes);
assert.deepEqual(results.fRes,results.kRes);
assert.equal(results.fJobID, results.sJobID);
assert.equal(results.fJobID, results.kJobID);
done();
};
var request = new Hop.StubRequest();
var tasks = 0;
var results = {};
tasks++;
Hop.call("JobTest.singletonJob",{},function(err,res){
console.log("1",err,res,request.getResponse().get("Job-Status"));
tasks--;
results.fErr=err;
results.fRes=res;
results.fJobID = request.getResponse().get("Job-ID");
if(tasks==0){
checkResults();
}
},request);
setTimeout(function(){
var srequest = new Hop.StubRequest();
tasks++;
Hop.call("JobTest.singletonJob",{},function(err,res){
console.log("2",err,res);
var krequest = new Hop.StubRequest();
tasks++;
Hop.call("JobTest.singletonJob",{},function(err,res){
console.log("3",err,res);
tasks--;
results.kErr=err;
results.kRes=res;
results.kJobID = krequest.getResponse().get("Job-ID");
if(tasks==0){
checkResults();
}
},krequest);
tasks--;
results.sErr=err;
results.sRes=res;
results.sJobID = srequest.getResponse().get("Job-ID");
if(tasks==0){
checkResults();
}
},srequest);
},100);
});
it("should run a repetable singleton job more then once",function(done){
this.timeout(8000);
var checkResults=function(){
assert.ok(results.sRes.when);
assert.equal(results.fErr,results.sErr);
assert.equal(results.fErr,results.kErr);
assert.deepEqual(results.fRes,results.sRes);
assert.notDeepEqual(results.fRes,results.kRes);
assert.equal(results.fJobID, results.sJobID);
assert.notEqual(results.fJobID, results.kJobID);
done();
};
var request = new Hop.StubRequest();
var tasks = 0;
var results = {};
tasks++;
Hop.call("JobTest.singletonJobRepeat",{},function(err,res){
tasks--;
results.fErr=err;
results.fRes=res;
results.fJobID = request.getResponse().get("Job-ID");
if(tasks==0){
checkResults();
}
},request);
setTimeout(function(){
var srequest = new Hop.StubRequest();
tasks++;
Hop.call("JobTest.singletonJobRepeat",{},function(err,res){
var krequest = new Hop.StubRequest();
tasks++;
Hop.call("JobTest.singletonJobRepeat",{},function(err,res){
tasks--;
results.kErr=err;
results.kRes=res;
results.kJobID = krequest.getResponse().get("Job-ID");
if(tasks==0){
checkResults();
}
},krequest);
tasks--;
results.sErr=err;
results.sRes=res;
results.sJobID = srequest.getResponse().get("Job-ID");
if(tasks==0){
checkResults();
}
},srequest);
},100);
});
});