I'm using agenda for background jobs and I'm trying to test the define method to ensure 1.) agenda.define is called and 2.) a method inside of agenda.define (triggerSend) is called.
I've included the four files I'm using to make this test: 1.) the agenda job definition 2.) triggerSend utility function 3.) sinon stubs 4.) the actual test. I will very much appreciate any and all help you can offer!
As is, agenda.define is being called twice and I can see logs for triggerSend being called twice. The first triggerSend shows a job object, the second triggerSend log shows undefined
.
I would like to figure out how I can accurately capture agenda.define and triggerSend being called, using sinon.
agenda/campaigns/jobs/test.js (the job with agenda.define):
const triggerSend = require('../../../campaign/trigger.js');
module.exports = function(agenda) {
agenda.define('test', function(job,done){
console.log("agenda.define called!");
triggerSend(job)
.then(done).catch(done);
});
}
campaign/trigger.js triggerSend utility function called in agenda.define:
module.exports = async function(job) {
console.log("triggerSend for job: ", job);
// Legacy procedural code
}
fixtures/stubs/index.js
const sinon = require('sinon');
module.exports = {
DefineAgenda: function(agenda, jobMock) {
return sinon.stub(agenda, 'define').callsFake(function(job, done) {
/*
*This is to call the function (job, done) callback from agenda.define,
*it results in triggerSend being actually called (not the stub) but it
*also results in agenda.define being called twice.
*/
return arguments[1](jobMock, done);
});
},
TriggerSend: function(triggerSend, jobMock) {
return sinon.stub(triggerSend, 'default').callsFake(function(job) {
console.log("triggerSend arguments: ", arguments)
return arguments[1](jobMock);
});
}
}
test.test.js:
const chai = require("chai");
const expect = chai.expect;
const agenda = require('../../../modules/agenda').campaignInstance();
const triggerSend = require('../../../campaign/trigger.js');
const triggerSendObj = { default: triggerSend };
const DefineAgenda = require('../../../fixtures/stubs').DefineAgenda;
const TriggerSend = require('../../../fixtures/stubs').TriggerSend;
const jobMock = require('../../../fixtures/mocks/jobs').campaign;
const testJob = require('../../../agenda/campaigns/jobs/test.js');
describe('Campaign agenda.define', function() {
before(function() {
this.DefineAgendaStub = DefineAgenda(agenda, jobMock);
this.TriggerSendStub = TriggerSend(triggerSendObj, jobMock);
});
it('is called', async function() {
//call agenda job for test
testJob(agenda);
//assertions
expect(agenda.define.called).to.be.true;
expect(triggerSendObj.default.called).to.be.true;
})
});