Search code examples
node.jsmocha.jssinonaws-sdk-jsaws-parameter-store

Sinon Stub not working with AWS Parameter store (NodeJS)


I am trying to stub a call to the aws parameter store (PS). But even though I added the stub in multiple ways it always makes the actual call to aws PS.

the method I am trying to test

function getParamsFromParamterStore() {
    return ssm.getParametersByPath(query).promise();
}

One of the stub method I tried

var ssm = new AWS.SSM();
stub1 = sinon.stub(ssm, 'getParametersByPath').returns({promise: () => {}});
moduleName.__get__('getParamsFromParamterStore')();

But this actually makes the call to PS.

Note: since this is a private function (not exported) I am using rewire to access it.


Solution

  • Here is the unit test solution:

    index.js:

    const AWS = require('aws-sdk');
    const ssm = new AWS.SSM();
    
    function getParamsFromParamterStore(query) {
      return ssm.getParametersByPath(query).promise();
    }
    

    index.test.js:

    const rewire = require('rewire');
    const sinon = require('sinon');
    const { expect } = require('chai');
    const mod = rewire('./');
    
    describe('60447015', () => {
      it('should pass', async () => {
        const ssmMock = { getParametersByPath: sinon.stub().returnsThis(), promise: sinon.stub().resolves('mock data') };
        const awsMock = {
          SSM: ssmMock,
        };
        mod.__set__('ssm', awsMock.SSM);
        const actual = await mod.__get__('getParamsFromParamterStore')('query');
        expect(actual).to.be.eq('mock data');
        sinon.assert.calledWithExactly(ssmMock.getParametersByPath, 'query');
        sinon.assert.calledOnce(ssmMock.promise);
      });
    });
    

    Unit test results with 100% coverage:

      60447015
        ✓ should pass
    
    
      1 passing (30ms)
    
    ----------|---------|----------|---------|---------|-------------------
    File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
    ----------|---------|----------|---------|---------|-------------------
    All files |     100 |      100 |     100 |     100 |                   
     index.js |     100 |      100 |     100 |     100 |                   
    ----------|---------|----------|---------|---------|-------------------