diff --git a/commands/commandExecutor.js b/commands/commandExecutor.js new file mode 100644 index 0000000..2a010d6 --- /dev/null +++ b/commands/commandExecutor.js @@ -0,0 +1,13 @@ +const debug = require('debug')('systemic-aws-sqs'); + +module.exports = client => async ({ commandParams, commandName }) => { + try { + debug(`Calling ${commandName}`); + const data = await client[commandName](commandParams); + debug(`${commandName} executed successfully`); + return data; + } catch (error) { + debug(`Error executing ${commandName}: ${error.message}`); + throw error; + } +}; diff --git a/commands/getQueueUrl.js b/commands/getQueueUrl.js deleted file mode 100644 index c44e05c..0000000 --- a/commands/getQueueUrl.js +++ /dev/null @@ -1,22 +0,0 @@ -const debug = require("debug")("systemic-aws-sqs"); -const { GetQueueUrlCommand } = require("@aws-sdk/client-sqs"); - -module.exports = - (client) => - async ({ queueName, awsAccountId }) => { - debug("Calling GetQueueUrlCommand"); - const commandParams = { - QueueName: queueName, - QueueOwnerAWSAccountId: awsAccountId || undefined, - }; - - const command = new GetQueueUrlCommand(commandParams); - - try { - const data = await client.send(command); - return data.QueueUrl.replace("http://", "https://"); - } catch (error) { - debug(`Error executing GetQueueUrlCommand: ${error.message}`); - throw error; - } - }; diff --git a/commands/receiveMessage.js b/commands/receiveMessage.js deleted file mode 100644 index 3c5140d..0000000 --- a/commands/receiveMessage.js +++ /dev/null @@ -1,35 +0,0 @@ -const debug = require("debug")("systemic-aws-sqs"); -const { ReceiveMessageCommand } = require("@aws-sdk/client-sqs"); - -module.exports = - (client) => - async ({ - queueUrl, - attributeNames, - waitTimeSeconds, - maxNumberOfMessages, - receiveRequestAttemptId, - messageAttributeNames, - visibilityTimeout, - }) => { - debug("Calling ReceiveMessageCommand"); - const commandParams = { - QueueUrl: queueUrl, - AttributeNames: attributeNames || undefined, - WaitTimeSeconds: waitTimeSeconds || undefined, - MaxNumberOfMessages: maxNumberOfMessages || undefined, - ReceiveRequestAttemptId: receiveRequestAttemptId || undefined, - MessageAttributeNames: messageAttributeNames || undefined, - VisibilityTimeout: visibilityTimeout || undefined, - }; - - const command = new ReceiveMessageCommand(commandParams); - - try { - const data = await client.send(command); - return data; - } catch (error) { - debug(`Error executing ReceiveMessageCommand: ${error.message}`); - throw error; - } - }; diff --git a/commands/sendMessage.js b/commands/sendMessage.js deleted file mode 100644 index 14507dc..0000000 --- a/commands/sendMessage.js +++ /dev/null @@ -1,35 +0,0 @@ -const debug = require("debug")("systemic-aws-sqs"); -const { SendMessageCommand } = require("@aws-sdk/client-sqs"); - -module.exports = - (client) => - async ({ - queueUrl, - messageBody, - delayseconds, - messageAttributes, - messageDeduplicationId, - messageGroupId, - messageSystemAttributes, - }) => { - debug("Calling SendMessageCommand"); - const commandParams = { - QueueUrl: queueUrl, - MessageBody: messageBody, - DelaySeconds: delayseconds || undefined, - MessageAttributes: messageAttributes || undefined, - MessageDeduplicationId: messageDeduplicationId || undefined, - MessageGroupId: messageGroupId || undefined, - MessageSystemAttributes: messageSystemAttributes || undefined, - }; - - const command = new SendMessageCommand(commandParams); - - try { - const data = await client.send(command); - return data; - } catch (error) { - debug(`Error executing SendMessageCommand: ${error.message}`); - throw error; - } - }; diff --git a/index.js b/index.js index f489295..45343db 100644 --- a/index.js +++ b/index.js @@ -1,20 +1,20 @@ const debug = require("debug")("systemic-aws-sqs"); -const { SQSClient } = require("@aws-sdk/client-sqs"); +const { SQS, SQSClient } = require("@aws-sdk/client-sqs"); const commands = require("require-all")(__dirname + "/commands"); let client = null; +let aggregatedSQS = null; module.exports = () => { const start = async ({ config }) => { debug("Initializing SQSClient"); client = new SQSClient(config); + aggregatedSQS = new SQS(config); return { client, - getQueueUrl: commands["getQueueUrl"](client), - sendMessage: commands["sendMessage"](client), - receiveMessage: commands["receiveMessage"](client), + commandExecutor: commands['commandExecutor'](aggregatedSQS), }; }; diff --git a/test/__tests__/commandExecutor.test.js b/test/__tests__/commandExecutor.test.js new file mode 100644 index 0000000..edb9f91 --- /dev/null +++ b/test/__tests__/commandExecutor.test.js @@ -0,0 +1,75 @@ +const crypto = require("crypto"); + +const startSQSComponent = require("../helpers/startSQSComponent"); +const createSQSQueue = require("../helpers/createSQSQueue"); +const deleteSQSQueue = require("../helpers/deleteSQSQueue"); + +const getLocalstackConfig = require("../fixtures/getLocalstackConfig"); + +let sqs; +let createQueue; +let deleteQueue; + +describe("Systemic SQS - commandExecutor function", () => { + beforeAll(async () => { + sqs = await startSQSComponent(getLocalstackConfig()); + createQueue = createSQSQueue(sqs); + deleteQueue = deleteSQSQueue(sqs); + }); + + it("should execute the \"getQueueUrl\" command and retrieve it", async () => { + const awsAccountId = "000000000000"; + const queueName = "testQName"; + await createQueue(queueName); + + const commandParams = { QueueName: queueName, AwsAccountId: awsAccountId } + const res = await sqs.commandExecutor({ commandParams, commandName: 'getQueueUrl' }); + + expect(res.QueueUrl).toBe(`http://localhost/${awsAccountId}/${queueName}`); + + await deleteQueue(queueName); + }); + + it("should execute the \"receiveMessage\" command and receive a message from the queue", async () => { + const awsAccountId = "000000000000"; + const messageBody = "Example message"; + const queueName = "receiveMessageQueueName"; + + await createQueue(queueName); + + const getUrlCommandParams = { QueueName: queueName, AwsAccountId: awsAccountId } + const urlResponse = await sqs.commandExecutor({ commandParams: getUrlCommandParams, commandName: 'getQueueUrl' }); + + const sendMessageCommandParams = { QueueUrl: urlResponse.QueueUrl, MessageBody: messageBody } + await sqs.commandExecutor({ commandParams: sendMessageCommandParams, commandName: 'sendMessage' }); + + const res = await sqs.commandExecutor({ commandParams: { QueueUrl: urlResponse.QueueUrl }, commandName: 'receiveMessage' }); + + expect(res.Messages).toHaveLength(1); + expect(res.Messages[0].Body).toBe(messageBody); + + await deleteQueue(queueName); + }); + + it("should execute the \"sendMessage\" command and send a message", async () => { + const awsAccountId = "000000000000"; + const messageBody = "Example message"; + const queueName = "testQName1"; + await createQueue(queueName); + + const getUrlCommandParams = { QueueName: queueName, AwsAccountId: awsAccountId } + const urlResponse = await sqs.commandExecutor({ commandParams: getUrlCommandParams, commandName: 'getQueueUrl' }); + + const sendMessageCommandParams = { QueueUrl: urlResponse.QueueUrl, MessageBody: messageBody } + const res = await sqs.commandExecutor({ commandParams: sendMessageCommandParams, commandName: 'sendMessage' }); + + const md5MessageBodySent = crypto + .createHash("md5") + .update(messageBody) + .digest("hex"); + expect(res.$metadata.httpStatusCode).toBe(200); //enviado + expect(res.MD5OfMessageBody).toBe(md5MessageBodySent); // comprobaciĆ³n de md5 + + await deleteQueue(queueName); + }); +}); diff --git a/test/__tests__/getQueueUrl.test.js b/test/__tests__/getQueueUrl.test.js deleted file mode 100644 index f80053b..0000000 --- a/test/__tests__/getQueueUrl.test.js +++ /dev/null @@ -1,31 +0,0 @@ -const startSQSComponent = require("../helpers/startSQSComponent"); -const createSQSQueue = require("../helpers/createSQSQueue"); -const deleteSQSQueue = require("../helpers/deleteSQSQueue"); - -const getLocalstackConfig = require("../fixtures/getLocalstackConfig"); - -let sqs; -let createQueue; -let deleteQueue; - -describe("Systemic sqs Component Tests", () => { - beforeAll(async () => { - sqs = await startSQSComponent(getLocalstackConfig()); - createQueue = createSQSQueue(sqs); - deleteQueue = deleteSQSQueue(sqs); - }); - - it("should return queue url", async () => { - const awsAccountId = "000000000000"; - const queueName = "testQName"; - await createQueue(queueName); - - const res = await sqs.getQueueUrl({ - queueName, - awsAccountId, - }); - expect(res).toBe(`https://localhost/${awsAccountId}/${queueName}`); - - await deleteQueue(queueName); - }); -}); diff --git a/test/__tests__/receiveMessage.test.js b/test/__tests__/receiveMessage.test.js deleted file mode 100644 index b9e0ad8..0000000 --- a/test/__tests__/receiveMessage.test.js +++ /dev/null @@ -1,40 +0,0 @@ -const startSQSComponent = require("../helpers/startSQSComponent"); -const createSQSQueue = require("../helpers/createSQSQueue"); -const deleteSQSQueue = require("../helpers/deleteSQSQueue"); - -const getLocalstackConfig = require("../fixtures/getLocalstackConfig"); - -let sqs; -let createQueue; -let deleteQueue; - -const awsAccountId = "000000000000"; - -describe("Systemic sqs Component Tests", () => { - beforeAll(async () => { - sqs = await startSQSComponent(getLocalstackConfig()); - createQueue = createSQSQueue(sqs); - deleteQueue = deleteSQSQueue(sqs); - }); - - it("should receive a message from the queue", async () => { - const messageBody = "Example message"; - const queueName = "receiveMessageQueueName"; - await createQueue(queueName); - const queueUrl = await sqs.getQueueUrl({ - queueName, - awsAccountId, - }); - await sqs.sendMessage({ - queueUrl, - messageBody, - }); - const res = await sqs.receiveMessage({ - queueUrl, - }); - expect(res.Messages).toHaveLength(1); - expect(res.Messages[0].Body).toBe(messageBody); - - await deleteQueue(queueName); - }); -}); diff --git a/test/__tests__/sendMessage.test.js b/test/__tests__/sendMessage.test.js deleted file mode 100644 index b9edce6..0000000 --- a/test/__tests__/sendMessage.test.js +++ /dev/null @@ -1,43 +0,0 @@ -const crypto = require("crypto"); - -const startSQSComponent = require("../helpers/startSQSComponent"); -const createSQSQueue = require("../helpers/createSQSQueue"); -const deleteSQSQueue = require("../helpers/deleteSQSQueue"); - -const getLocalstackConfig = require("../fixtures/getLocalstackConfig"); - -let sqs; -let createQueue; -let deleteQueue; - -const awsAccountId = "000000000000"; - -describe("Systemic sqs Component Tests", () => { - beforeAll(async () => { - sqs = await startSQSComponent(getLocalstackConfig()); - createQueue = createSQSQueue(sqs); - deleteQueue = deleteSQSQueue(sqs); - }); - - it("send a message", async () => { - const messageBody = "Example message"; - const queueName = "testQName1"; - await createQueue(queueName); - const queueUrl = await sqs.getQueueUrl({ - queueName, - awsAccountId, - }); - const res = await sqs.sendMessage({ - queueUrl, - messageBody, - }); - const md5MessageBodySent = crypto - .createHash("md5") - .update(messageBody) - .digest("hex"); - expect(res.$metadata.httpStatusCode).toBe(200); //enviado - expect(res.MD5OfMessageBody).toBe(md5MessageBodySent); // comprobaciĆ³n de md5 - - await deleteQueue(queueName); - }); -}); diff --git a/test/helpers/createSQSQueue.js b/test/helpers/createSQSQueue.js index 4e2e8f8..fc17b78 100644 --- a/test/helpers/createSQSQueue.js +++ b/test/helpers/createSQSQueue.js @@ -1,3 +1,7 @@ -const { CreateQueueCommand } = require("@aws-sdk/client-sqs"); - -module.exports = (sqs) => (queueName) => sqs.client.send(new CreateQueueCommand({ QueueName: queueName })); +const commandConfig = (queueName) => ({ + commandParams: { + QueueName: queueName + }, + commandName:'createQueue' +}) +module.exports = (sqs) => (queueName) => sqs.commandExecutor(commandConfig(queueName)) diff --git a/test/helpers/deleteSQSQueue.js b/test/helpers/deleteSQSQueue.js index 62b2f4b..9b5d2e5 100644 --- a/test/helpers/deleteSQSQueue.js +++ b/test/helpers/deleteSQSQueue.js @@ -1,4 +1,8 @@ -const { DeleteQueueCommand } = require("@aws-sdk/client-sqs"); - -module.exports = (sqs) => (queueName) => sqs.client - .send(new DeleteQueueCommand({ QueueUrl: `https://localhost/000000000000/${queueName}` })); +const commandConfig = (queueName) => ({ + commandParams: { + QueueUrl: queueName + }, + commandName:'deleteQueue' +}) +module.exports = (sqs) => (queueName) => sqs + .commandExecutor(commandConfig(`https://localhost/000000000000/${queueName}`))