vendredi 18 janvier 2019

Testing async SQS sendMessage

I have an async lambda, which performs an async SQS sendMessage request. The SQS queue is a standard queue, not FIFO, just to clarify.

Here's an example of code (without irrelevant part of the logic):

exports.functionHandler = async (event, context, callback) => {
    try {
        let parsedBody = JSON.parse(event.Records[0].body);
        let modifiedBody = await doStuff(parsedBody);

        let sqsPayload = {
            MessageBody: JSON.stringify(modifiedBody),
            QueueUrl: my-queue-url
        };

        await sqs.sendMessage(sqsPayload).promise();

        callback(null, utils.respondSuccess("Done"));
    } catch (err) {
        // Handle error

        callback(null, utils.respondError(err));
    }
};

const doStuff = async payload => {
    // Do stuff 
}

Pretty simple.

Now the problem: I'm trying to test this function using the package aws-sdk-mock. This is how I was stubbing the sendMessage function when the lambda wasn't async and the sendMessage function was using the callback:

it("an awesome title for my test", async () => {
    let payload = {
        Records: [
            // Data here
        ]
    };

    AWS.mock("SQS", "sendMessage", (param, callback) => {
        let response = {
            ResponseMetadata: {
                RequestId: "test-request-id"
            },
            MD5OfMessageBody: "a892e8d8589e97ca92fb70020f01c16c",
            MessageId: "test-message-id"
        };

        callback(null, response);
    });

    await app.functionHandler(payload, {}, (err, result) => {
        let parsedBody = JSON.parse(result.body);
        expect(parsedBody.message).to.be.equal("Done");
        // More stuff
    });

    AWS.restore();
});

If I use this test, the sendMessage function throws the following error:

sendMessage returned an invalid MD5 response. Got "undefined", expecting "a892e8d8589e97ca92fb70020f01c16c".

I'm not sure how to test sendMessage asynchronously. I don't mind adopting a different package if it helps me to get the job done.

Can anyone help?

Thanks a lot

Aucun commentaire:

Enregistrer un commentaire