No encontré una forma de burlarme de la nueva característica de dynamodb "PartiQL" definida en una función lambda.
En PartiQL, podemos usar executeStatement para ejecutar consultas similares a sql, que son una especie de personalizaciones de DynamoDB. Pero la configuración a continuación devuelve un error:
UnrecognizedClientException: el token de seguridad incluido en la solicitud no es válido
lo que significa que la configuración de jest-mock no es correcta.
Este es el código a probar.
'use strict'; var ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' }); const TABLE_NAME = process.env.TABLE_NAME; async function queryTest() { let params = { Statement: `select * from ${TABLE_NAME}` }; let statementResult = await ddb.executeStatement(params).promise(); return statementResult.Items; } module.exports.get = async (event) => { var result = queryTest(); if (!result) { return { statusCode: 200, body: JSON.stringify(result) }; } else { return { statusCode: 400, body: JSON.stringify(result) }; } };y el script de prueba:
'use strict'; const AWS = require('aws-sdk'); const jestPlugin = require('serverless-jest-plugin'); const lambdaWrapper = jestPlugin.lambdaWrapper; const mod = require('./handler'); function mock_aws() { let mockDynamoDBClient = { executeStatement: { promise: jest.fn() }, promise: jest.fn(), }; jest.mock("aws-sdk", () => { const config = { update: jest.fn(), }; return { DynamoDB: jest.fn().mockImplementation(() => { return { executeStatement: () => mockDynamoDBClient.executeStatement, }; }), config: config }; }); return mockDynamoDBClient; } describe('test', () => { const OLD_ENV = process.env; var mDynamoDb; var wrapped; beforeAll(async () => { jest.resetModules(); wrapped = await lambdaWrapper.wrap(mod, { handler: 'get' }); process.env = { ...OLD_ENV }; process.env.TABLE_NAME = "TEST"; mDynamoDb = mock_aws(); }); test('implement tests here', async (done) => { const mResult = [{ 'TEST': 1 }] ; const response = await wrapped.run({}) expect(response).toEqual({ "statusCode": 200, "body": JSON.stringify(mResult) }); done(); }); });