0

Newbie to AWS ! I have written a function which creates a secretID in AWS secret manager and stores some token value into it. This is the snip of my function create-secret.ts

import * as AWS from 'aws-sdk';

const secretsManager = new AWS.SecretsManager({
  region: process.env.AWS_REGION,
});

// Creates a new secret in the AWS secret manager and stores token value
export const createSecretToken = async (secretId: string,token: string,): Promise<any> ={
  const params = {
    Description: 'Store token',
    Name: secretId,
    SecretString: token,
  };
 try{
   const data = await secretsManager.createSecret(params).promise();
   return data;
  } catch(error){
   return error
  }
};

I am calling this above function from another file called 'main.ts'. This is how main.ts function looks

import {createSecretToken} from './create-secret'

export const handler = async (): Promise<any> => {
  const response = await createSecretToken('testSecret', 'testToken');
  return {
    body: JSON.stringify(response),
  };
};

All the logic works perfect.. However my unit tests do not cover the lines implemented in the catch block in create-secret.ts file.

This is my test file creat-secret.spec.ts

import * as AWS from 'aws-sdk';

import { createSecretToken } from './create-secret';

const response = {
  ARN: 'test',
  Name: 'testName',
  VersionId: 'XXX',
  VersionStages: ['AWSCURRENT'],
};

jest.mock('aws-sdk', () => { <-- I am struggling to modify this mock to cover the 
                             catch block.
  return {
    config: {
      update() {
        return {};
      },
    },
    SecretsManager: jest.fn(() => {
      return {
        createSecret: jest.fn(() => {
          return {
            promise: () => response,
          };
        }),
      };
    }),
  };
});

describe('storeSecrets', () => {
  it('should create a new secret id in secret manager and store admin token  ', async () => {
    const spy = jest.spyOn(AWS, 'SecretsManager');
    const res = await createSecretToken('test', 'test');
    expect(spy).toHaveBeenCalledTimes(1);
    expect(res).toEqual(response);
  });
});

The above test passes and covers this try block from create-secret.ts file

 try{
  const data = await secretsManager.createSecret(params).promise();
  return data;
 }

How can i mock secretsManager.createSecret function to mock an error? Please help me write an extra test case to cover this catch block from create-secret.ts

catch(error){
   return error
  }

Thank you

SCodes
  • 1
  • 3

1 Answers1

0

i use symilar to this code for mocking SQS, it should also work with SecretManager :

const AWS = require('aws-sdk');

const response = {
  ARN: 'test',
  Name: 'testName',
  VersionId: 'XXX',
  VersionStages: ['AWSCURRENT'],
};

AWS.SecretsManager = jest.fn().mockImplementation(() => ({
  createSecret: jest.fn().mockReturnValue({
    promise: jest.fn().mockResolvedValue(response),
  })
}));
Dus
  • 4,052
  • 5
  • 30
  • 49
  • Could you share your full code (dm works) for mocking SQS? I can't make it work to save my life... – lowcrawler Jun 25 '22 at 17:11
  • 1
    const AWS = require('aws-sdk'); const sendMessage = jest.fn().mockReturnValue({ promise: jest.fn().mockResolvedValue("some-value"), }); AWS.SQS = jest.fn().mockImplementation(() => ({ sendMessage, getQueueUrl: jest.fn().mockReturnValue({ promise: jest.fn().mockResolvedValue({ QueueUrl: "some-url" }), }), })); – Dus Jun 27 '22 at 13:56