I'm currently attempting to create a mock function for a singleton class that retrieves a value from the AWS SSM parameter store.
The type definitions for getParameter() are provided below:
getParameter(params: SSM.Types.GetParameterRequest, callback?: (err: AWSError, data: SSM.Types.GetParameterResult) => void): Request<SSM.Types.GetParameterResult, AWSError>;
getParameter(callback?: (err: AWSError, data: SSM.Types.GetParameterResult) => void): Request<SSM.Types.GetParameterResult, AWSError>;
This is how my test setup looks:
import {SSM} from 'aws-sdk';
import {SSMParameter} from './src/module/ssm/ssm-cache-parameter';
import {mocked} from 'jest-mock';
import { AWSError } from 'aws-sdk';
jest.mock('aws-sdk', () => {
const mSSMInstance = {
getParameter: jest.fn(),
};
const mSSM = jest.fn(() => mSSMInstance);
return { SSM: mSSM };
});
describe('mocking amazon service response', () => {
let ssmParameter: SSMParameter;
it('should fetch Parameter from Parameter Store', async () => {
ssmParameter = SSMParameter.getInstance();
expect(SSM).toBeCalled();
console.log(ssmParameter);
const mSSMInstance = new SSM();
const mData = {
Parameter: {
ARN: 'arn:aws:ssm:eu-test-1:123:NAME',
LastModifiedDate: new Date(2020, 09, 1),
Name: 'NAME',
Type: 'String',
Value: 'VALUE',
Version: 1,
}
};
const error: AWSError = {
code: 'ERROR_CODE',
message: 'ERROR_MESSAGE',
name: 'ERROR_NAME',
time: new Date(2020, 09, 1),
}
mocked(mSSMInstance.getParameter).mockImplementationOnce(
(params: SSM.GetParameterRequest, callback?: (err: AWSError, data: SSM.GetParameterResult) => void): any => {
if (callback) {
callback(error, mData);
}
},
);
const actual = ssmParameter.cache({Name: 'NAME', WithDecryption: false}, 30000);
expect(actual).toBe('VALUE');
});
});
The error I am encountering seems to be due to TypeScript's uncertainty about which definition to utilize:
Argument of type '(params: SSM.GetParameterRequest, callback?: ((err: AWSError, data: GetParameterResult) => void) | undefined) => any' is not assignable to parameter of type '{ (params: GetParameterRequest, callback?: ((err: AWSError, data: GetParameterResult) => void) | undefined): Request<GetParameterResult, AWSError>; (callback?: ((err: AWSError, data: GetParameterResult) => void) | undefined): Request<...>; }'. Types of parameters 'params' and 'callback' are incompatible. Type '((err: AWSError, data: GetParameterResult) => void) | undefined' is not assignable to type 'GetParameterRequest'. Type 'undefined' is not assignable to type 'GetParameterRequest'.
I've hit a roadblock. Any assistance on how to resolve this issue would be greatly appreciated.