1

I have the following two snippets:

1.this is the unit I would like to run:

health.checkHealth = function (req, res) {
async.parallel({
    cassandra: function (callback) {
        cassandraRepository.ping(callback);
    },
    kafka: function (callback) {
        kafkaHelper.ping(callback);
    },
    vault: function (callback) {
        vaultClient.health()
            .then((isOk)=>{
                 callback(null, isOk)})
            .catch(()=>
                callback(null, false));
    }
}, function (err, result) {
    var response = {};
    if (result.cassandra) {
        response.cassandra = "OK";
    } else {
        response.cassandra = "Failed";
        res.status(500);
    }

    if (result.kafka) {
        response.kafka = "OK";
    } else {
        response.kafka = "Failed";
        res.status(500);
    }

    if (result.vault) {
        response.vault = "OK";
    } else {
        response.vault = "Failed";
        res.status(500);
    }

    res.send(response);
})

}

2.this is the test to check the unit:

     describe('vault is avaliable', function () {
        beforeEach(sinon.test(function () {
            sinon.stub(vaultClient, "health").resolves(true);
        }));

        it('should return 200', sinon.test(function (done) {
            var response = {
                vault: "OK"
            };

            var req = {};
            var res = {};
            var spySend = res.send = sinon.spy();
            var spyStatus = res.status = sinon.spy();

            health.checkHealth(req, res);
            expect(spySend.calledOnce).to.equal(true);
            expect(spySend.calledWith(response));
            expect(spyStatus.calledOnce).to.equal(false);
        }));

    });

My problem is that when I call checkHealth it proceeds to the next line (expect(spySend.calledOnce).to.equal(true);) without waiting for the vaultClient's promise to complete. What do I need to do to make the expects run only after the 'checkHealth' was run.

yuria
  • 541
  • 2
  • 7
  • 22

1 Answers1

2

You do not need to use the async - you can use promises directly in your code with Promise.all as others have suggested.

The code here is using promisifyAll from Bluebird, but you can also convert the APIs to use promises yourself.

//.props is bluebird, you can `.all` with native promises too
Promise.props({
    cassandra: cassandraRepository.pingAsync(); // created by promisifyAll
    kafka: kafkaHelper.pingAsync(),
    vault: vaultClient.health()
}).then(results => {
   // access results.cassandra, results.kafka and results.vaule here
});
Community
  • 1
  • 1
Benjamin Gruenbaum
  • 270,886
  • 87
  • 504
  • 504