diff --git a/CHANGELOG.md b/CHANGELOG.md index 57a6bff..1f17503 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ +## 1.2.1 (July 23, 2021) +* Implemented support of maester storage in `Re-assembled message` action (maester-client library 3.3.0) + ## 1.2.0 (July 9, 2021) -* Add Ability to pass data from the individual messages to re-assembled message +* Add Ability to pass data from the individual messages to `Re-assembled message` action ## 1.1.9 (February 12, 2021) * Update sailor version to 2.6.24 diff --git a/component.json b/component.json index 741dbd2..8d47104 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "title": "Splitter", - "version": "1.2.0", + "version": "1.2.1", "description": "Splits a message into multiple messages.", "buildType":"docker", "actions": { diff --git a/lib/actions/reassemble.js b/lib/actions/reassemble.js index 6b6489d..f31b421 100644 --- a/lib/actions/reassemble.js +++ b/lib/actions/reassemble.js @@ -1,42 +1,71 @@ +// eslint-disable-next-line const { messages } = require('elasticio-node'); - -const groupsSeen = {}; +const ObjectStorageWrapperExtended = require('./utils-wrapper/ObjectStorageWrapperExtended'); async function processAction(msg) { + const storage = new ObjectStorageWrapperExtended(this); const { groupSize, groupId, messageId, messageData, } = msg.body; + const incomingData = {}; + const object = { + messageId, + groupId, + messageData, + }; if (groupSize <= 0) { throw new Error('Size must be a positive integer.'); } + if (!messageData) { + incomingData[messageId] = undefined; + } - if (!groupsSeen[groupId]) { - groupsSeen[groupId] = { - groupSize, - messageIdsSeen: new Set(), - incomingData: {}, - }; + const { + messageGroup, + messageGroupId, + messageGroupSize, + isCreated, + } = await storage.createMessageGroupIfNotExists(groupId, groupSize); + + if (isCreated) { + await storage.createNewObjectInMessageGroup(object, messageGroupId); + this.logger.info('New Group created. Added message'); + } + if (!isCreated) { + await storage.createNewObjectInMessageGroup(object, messageGroupId); + this.logger.info('Existed Group found. Added message'); + this.logger.info(`Saved messages: ${Object.keys(messageGroup.messageIdsSeen).join(', ')}`); } - groupsSeen[groupId].messageIdsSeen.add(messageId); - groupsSeen[groupId].incomingData[messageId] = messageData; - const numberSeen = groupsSeen[groupId].messageIdsSeen.size; + const parsedMessageGroup = await storage.lookupParsedObjectById(messageGroupId); + const filteredMessages = parsedMessageGroup.messages + .filter((message) => message.messageId !== messageId); + filteredMessages.push(object); + parsedMessageGroup.messages = filteredMessages; + await storage.updateObject(messageGroupId, parsedMessageGroup); + const messagesNumberSeen = Object.keys(parsedMessageGroup.messageIdsSeen).length; this.logger.info( - `Saw message ${messageId} of group ${groupId} Currently the group has ${numberSeen} of ${groupSize} message(s).`, + `Saw message ${messageId} of group ${groupId}. + Currently the group has ${messagesNumberSeen} of ${messageGroupSize} message(s).`, ); - if (numberSeen >= groupSize) { + if (messagesNumberSeen >= messageGroupSize) { + parsedMessageGroup.messages.forEach((message) => { + incomingData[message.messageId] = message.messageData; + }); + await this.emit('data', messages.newMessageWithBody({ groupSize, groupId, - messageData: groupsSeen[groupId].incomingData, + messageData: incomingData, })); - delete groupsSeen[groupId]; + await storage.deleteObjectById(messageGroupId); + this.logger.info(`Message group with id ${messageGroupId} has been deleted`); } } diff --git a/lib/actions/utils-wrapper/ObjectStorageWrapperExtended.js b/lib/actions/utils-wrapper/ObjectStorageWrapperExtended.js new file mode 100644 index 0000000..0895146 --- /dev/null +++ b/lib/actions/utils-wrapper/ObjectStorageWrapperExtended.js @@ -0,0 +1,58 @@ +const { ObjectStorageWrapper } = require('@elastic.io/maester-client/dist/ObjectStorageWrapper'); + +class ObjectStorageWrapperExtended extends ObjectStorageWrapper { + constructor(context) { + super(context); + this.logger = context.logger; + this.EXTERNAL_ID_QUERY_HEADER_NAME = 'externalid'; + this.TTL_TWO_DAYS = 172800; + } + + async lookupParsedObjectById(messageGroupId) { + const messageGroup = await this.lookupObjectById(messageGroupId); + return JSON.parse(messageGroup); + } + + async createMessageGroupIfNotExists(externalId, messageGroupSize) { + this.logger.info('Processing creation of the new message group'); + const messageGroups = await this.lookupObjectsByQueryParameters( + [{ key: this.EXTERNAL_ID_QUERY_HEADER_NAME, value: externalId }], + ); + if (messageGroups.length > 1) { + throw new Error('Several message groups with the same ids can not exist'); + } + if (!messageGroups.length) { + this.logger.info('No message groups found'); + const newMessageGroup = { + messages: [], + messageIdsSeen: {}, + }; + const { objectId: messageGroupId } = await this.createObject( + newMessageGroup, [{ key: this.EXTERNAL_ID_QUERY_HEADER_NAME, value: externalId }], + [], this.TTL_TWO_DAYS, + ); + this.logger.info('Created new message group'); + return { + messageGroup: newMessageGroup, messageGroupSize, messageGroupId, isCreated: true, + }; + } + this.logger.info('MessageGroup found'); + const messageGroupId = messageGroups[0].objectId; + const parsedMessageGroup = await this.lookupParsedObjectById(messageGroupId); + return { + messageGroup: parsedMessageGroup, messageGroupSize, messageGroupId, isCreated: false, + }; + } + + async createNewObjectInMessageGroup(object, messageGroupId) { + this.logger.info('Processing creation of the new object'); + const parsedMessageGroup = await this.lookupParsedObjectById(messageGroupId); + this.logger.info('...Updating message group'); + parsedMessageGroup.messageIdsSeen[object.messageId] = object.messageId; + return this.updateObject(messageGroupId, { + ...parsedMessageGroup, messages: [...parsedMessageGroup.messages, object], + }); + } +} + +module.exports = ObjectStorageWrapperExtended; diff --git a/package-lock.json b/package-lock.json index 3c7f220..f9f3fcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,10 @@ "packages": { "": { "name": "@elasticio/splitter", - "version": "1.1.9", "license": "BSD-2-Clause", "dependencies": { "@elastic.io/component-commons-library": "1.1.4", + "@elastic.io/maester-client": "3.3.0", "elasticio-node": "0.0.9", "elasticio-sailor-nodejs": "2.6.24", "lodash": "4.17.19" @@ -22,6 +22,7 @@ "eslint-config-airbnb-base": "14.2.0", "eslint-plugin-import": "2.22.0", "mocha": "8.1.1", + "nock": "12.0.3", "sinon": "9.0.3" }, "engines": { @@ -187,6 +188,180 @@ "jsonata": "1.7.0" } }, + "node_modules/@elastic.io/maester-client": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@elastic.io/maester-client/-/maester-client-3.3.0.tgz", + "integrity": "sha512-siZCNup2vqQCEfccctKfLHXlXGSDQY52YXhsyv7zLgm+fy4EsnKmQY9DcHVPgmj2RWEGnHm9HeDkxCJc/Huz2A==", + "dependencies": { + "@elastic.io/bunyan-logger": "1.0.6", + "@elastic.io/component-commons-library": "1.1.1", + "@types/sinon": "10.0.0", + "axios": "0.21.1", + "get-stream": "6.0.1", + "sinon": "10.0.0" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/@elastic.io/bunyan-logger": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@elastic.io/bunyan-logger/-/bunyan-logger-1.0.6.tgz", + "integrity": "sha512-XDILawMp8XF+JKQ5rfhr7gIkro/W21RHGhAhl82HroXjiB9ouqiKjPQui4yTq0v4QfIMyYa+Mo5bR2wl4+peRA==", + "dependencies": { + "bunyan": "1.8.12" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/@elastic.io/component-commons-library": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@elastic.io/component-commons-library/-/component-commons-library-1.1.1.tgz", + "integrity": "sha512-A3iwaE0g/1a7PVhWddiWlqfAfbB//5tAd2CCTRT8B492+TuHZaLEJeoqSe1shVzxpJNVa4OFhohyBtUedGHaUA==", + "dependencies": { + "@elastic.io/jsonata-moment": "1.1.4", + "@elastic.io/ntlm-client": "1.0.0", + "@types/node": "8.10.51", + "axios": "0.18.1", + "bunyan": "1.8.12", + "bunyan-format": "0.2.1", + "bunyan-serializers": "0.0.2", + "elasticio-node": "0.0.9", + "elasticio-rest-node": "1.2.3", + "remove-leading-slash": "1.0.1", + "remove-trailing-slash": "0.1.0", + "request": "2.88.0", + "typescript": "3.4.4" + }, + "engines": { + "node": ">=8.16.0" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/@elastic.io/component-commons-library/node_modules/axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/@elastic.io/component-commons-library/node_modules/follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dependencies": { + "debug": "=3.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/@types/node": { + "version": "8.10.51", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.51.tgz", + "integrity": "sha512-cArrlJp3Yv6IyFT/DYe+rlO8o3SIHraALbBW/+CcCYW/a9QucpLI+n2p4sRxAvl2O35TiecpX2heSZtJjvEO+Q==" + }, + "node_modules/@elastic.io/maester-client/node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/elasticio-rest-node": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/elasticio-rest-node/-/elasticio-rest-node-1.2.3.tgz", + "integrity": "sha512-9OBmI/gKnIXOq8RJFO1VHHyaVn8oImSHdGE7EAZy9A6N7yBU0Y9qbtv6sA/VK7+NQprkFLvTxH3lHyy+BCgqkg==", + "dependencies": { + "lodash": "^3.10.1", + "natives": "^1.1.6", + "q": "^1.4.1", + "requestretry": "^3.1.0" + }, + "engines": { + "node": ">=10.15.0" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/elasticio-rest-node/node_modules/requestretry": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-3.1.0.tgz", + "integrity": "sha512-DkvCPK6qvwxIuVA5TRCvi626WHC2rWjF/n7SCQvVHAr2JX9i1/cmIpSEZlmHAo+c1bj9rjaKoZ9IsKwCpTkoXA==", + "dependencies": { + "extend": "^3.0.2", + "lodash": "^4.17.10", + "when": "^3.7.7" + }, + "peerDependencies": { + "request": "2.*.*" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/elasticio-rest-node/node_modules/requestretry/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/@elastic.io/maester-client/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/@elastic.io/maester-client/node_modules/sinon": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-10.0.0.tgz", + "integrity": "sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw==", + "dependencies": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.1.0", + "supports-color": "^7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@elastic.io/maester-client/node_modules/typescript": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.4.tgz", + "integrity": "sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@elastic.io/ntlm-client": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@elastic.io/ntlm-client/-/ntlm-client-1.0.0.tgz", @@ -306,10 +481,9 @@ } }, "node_modules/@sinonjs/samsam": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.1.0.tgz", - "integrity": "sha512-42nyaQOVunX5Pm6GRJobmzbS7iLI+fhERITnETXzzwDZh+TtDr/Au3yAvXVjFmZ4wEUaE4Y3NFZfKv0bV0cbtg==", - "dev": true, + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", "dependencies": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", @@ -319,8 +493,7 @@ "node_modules/@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" }, "node_modules/@types/color-name": { "version": "1.1.1", @@ -339,6 +512,22 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.1.tgz", "integrity": "sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ==" }, + "node_modules/@types/sinon": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.0.tgz", + "integrity": "sha512-jDZ55oCKxqlDmoTBBbBBEx+N8ZraUVhggMZ9T5t+6/Dh8/4NiOjSUfpLrPiEwxQDlAe3wpAkoXhWvE6LibtsMQ==", + "dependencies": { + "@sinonjs/fake-timers": "^7.0.4" + } + }, + "node_modules/@types/sinon/node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, "node_modules/accounting": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/accounting/-/accounting-0.4.1.tgz", @@ -1040,6 +1229,7 @@ "version": "0.8.8", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, "optional": true, "dependencies": { "nan": "^2.14.0" @@ -2411,8 +2601,7 @@ "node_modules/just-extend": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", - "dev": true + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==" }, "node_modules/jwa": { "version": "1.4.1", @@ -2482,8 +2671,7 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "node_modules/lodash.includes": { "version": "4.3.0", @@ -2810,6 +2998,12 @@ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "optional": true }, + "node_modules/natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "deprecated": "This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x." + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2826,10 +3020,9 @@ } }, "node_modules/nise": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", - "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", "dependencies": { "@sinonjs/commons": "^1.7.0", "@sinonjs/fake-timers": "^6.0.0", @@ -2838,6 +3031,44 @@ "path-to-regexp": "^1.7.0" } }, + "node_modules/nock": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", + "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.13", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/nock/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nock/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -3162,6 +3393,15 @@ "node": ">= 0.4" } }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/psl": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", @@ -4364,6 +4604,152 @@ "jsonata": "1.7.0" } }, + "@elastic.io/maester-client": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@elastic.io/maester-client/-/maester-client-3.3.0.tgz", + "integrity": "sha512-siZCNup2vqQCEfccctKfLHXlXGSDQY52YXhsyv7zLgm+fy4EsnKmQY9DcHVPgmj2RWEGnHm9HeDkxCJc/Huz2A==", + "requires": { + "@elastic.io/bunyan-logger": "1.0.6", + "@elastic.io/component-commons-library": "1.1.1", + "@types/sinon": "10.0.0", + "axios": "0.21.1", + "get-stream": "6.0.1", + "sinon": "10.0.0" + }, + "dependencies": { + "@elastic.io/bunyan-logger": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@elastic.io/bunyan-logger/-/bunyan-logger-1.0.6.tgz", + "integrity": "sha512-XDILawMp8XF+JKQ5rfhr7gIkro/W21RHGhAhl82HroXjiB9ouqiKjPQui4yTq0v4QfIMyYa+Mo5bR2wl4+peRA==", + "requires": { + "bunyan": "1.8.12" + } + }, + "@elastic.io/component-commons-library": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@elastic.io/component-commons-library/-/component-commons-library-1.1.1.tgz", + "integrity": "sha512-A3iwaE0g/1a7PVhWddiWlqfAfbB//5tAd2CCTRT8B492+TuHZaLEJeoqSe1shVzxpJNVa4OFhohyBtUedGHaUA==", + "requires": { + "@elastic.io/jsonata-moment": "1.1.4", + "@elastic.io/ntlm-client": "1.0.0", + "@types/node": "8.10.51", + "axios": "0.18.1", + "bunyan": "1.8.12", + "bunyan-format": "0.2.1", + "bunyan-serializers": "0.0.2", + "elasticio-node": "0.0.9", + "elasticio-rest-node": "1.2.3", + "remove-leading-slash": "1.0.1", + "remove-trailing-slash": "0.1.0", + "request": "2.88.0", + "typescript": "3.4.4" + }, + "dependencies": { + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + } + } + }, + "@types/node": { + "version": "8.10.51", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.51.tgz", + "integrity": "sha512-cArrlJp3Yv6IyFT/DYe+rlO8o3SIHraALbBW/+CcCYW/a9QucpLI+n2p4sRxAvl2O35TiecpX2heSZtJjvEO+Q==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "elasticio-rest-node": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/elasticio-rest-node/-/elasticio-rest-node-1.2.3.tgz", + "integrity": "sha512-9OBmI/gKnIXOq8RJFO1VHHyaVn8oImSHdGE7EAZy9A6N7yBU0Y9qbtv6sA/VK7+NQprkFLvTxH3lHyy+BCgqkg==", + "requires": { + "lodash": "^3.10.1", + "natives": "^1.1.6", + "q": "^1.4.1", + "requestretry": "^3.1.0" + }, + "dependencies": { + "requestretry": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-3.1.0.tgz", + "integrity": "sha512-DkvCPK6qvwxIuVA5TRCvi626WHC2rWjF/n7SCQvVHAr2JX9i1/cmIpSEZlmHAo+c1bj9rjaKoZ9IsKwCpTkoXA==", + "requires": { + "extend": "^3.0.2", + "lodash": "^4.17.10", + "when": "^3.7.7" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + } + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "sinon": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-10.0.0.tgz", + "integrity": "sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw==", + "requires": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "typescript": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.4.tgz", + "integrity": "sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA==" + } + } + }, "@elastic.io/ntlm-client": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@elastic.io/ntlm-client/-/ntlm-client-1.0.0.tgz", @@ -4447,7 +4833,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", - "dev": true, "requires": { "type-detect": "4.0.8" } @@ -4456,7 +4841,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } @@ -4472,10 +4856,9 @@ } }, "@sinonjs/samsam": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.1.0.tgz", - "integrity": "sha512-42nyaQOVunX5Pm6GRJobmzbS7iLI+fhERITnETXzzwDZh+TtDr/Au3yAvXVjFmZ4wEUaE4Y3NFZfKv0bV0cbtg==", - "dev": true, + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", "requires": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", @@ -4485,8 +4868,7 @@ "@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" }, "@types/color-name": { "version": "1.1.1", @@ -4505,6 +4887,24 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.1.tgz", "integrity": "sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ==" }, + "@types/sinon": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.0.tgz", + "integrity": "sha512-jDZ55oCKxqlDmoTBBbBBEx+N8ZraUVhggMZ9T5t+6/Dh8/4NiOjSUfpLrPiEwxQDlAe3wpAkoXhWvE6LibtsMQ==", + "requires": { + "@sinonjs/fake-timers": "^7.0.4" + }, + "dependencies": { + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, "accounting": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/accounting/-/accounting-0.4.1.tgz", @@ -5066,8 +5466,7 @@ "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" }, "doctrine": { "version": "3.0.0", @@ -5991,8 +6390,7 @@ "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" }, "is-callable": { "version": "1.2.0", @@ -6219,8 +6617,7 @@ "just-extend": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", - "dev": true + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==" }, "jwa": { "version": "1.4.1", @@ -6281,8 +6678,7 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "lodash.includes": { "version": "4.3.0", @@ -6549,6 +6945,11 @@ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "optional": true }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6562,10 +6963,9 @@ "optional": true }, "nise": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", - "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", "requires": { "@sinonjs/commons": "^1.7.0", "@sinonjs/fake-timers": "^6.0.0", @@ -6574,6 +6974,35 @@ "path-to-regexp": "^1.7.0" } }, + "nock": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", + "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.13", + "propagate": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6756,7 +7185,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, "requires": { "isarray": "0.0.1" } @@ -6827,6 +7255,12 @@ "iterate-value": "^1.0.0" } }, + "propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true + }, "psl": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", @@ -7360,8 +7794,7 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { "version": "0.8.1", diff --git a/package.json b/package.json index fd5d4f9..7411c31 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@elastic.io/component-commons-library": "1.1.4", + "@elastic.io/maester-client": "3.3.0", "elasticio-node": "0.0.9", "elasticio-sailor-nodejs": "2.6.24", "lodash": "4.17.19" @@ -28,6 +29,7 @@ "eslint-config-airbnb-base": "14.2.0", "eslint-plugin-import": "2.22.0", "mocha": "8.1.1", + "nock": "12.0.3", "sinon": "9.0.3" } } diff --git a/spec/reassemble.spec.js b/spec/reassemble.spec.js index ce70715..163f473 100644 --- a/spec/reassemble.spec.js +++ b/spec/reassemble.spec.js @@ -1,8 +1,16 @@ const chai = require('chai'); +const nock = require('nock'); const sinon = require('sinon'); const logger = require('@elastic.io/component-logger')(); const reassemble = require('../lib/actions/reassemble'); +process.env.ELASTICIO_OBJECT_STORAGE_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRJZCI6IjU2YzIwN2FkYjkxMjExODFlNjUwYzBlZiIsImNvbnRyYWN0SWQiOiI1YjVlZDFjZjI3MmNmODAwMTFhZTdiNmEiLCJ3b3Jrc3BhY2VJZCI6IjVhNzFiZmM1NjA3ZjFiMDAwNzI5OGEyYSIsImZsb3dJZCI6IioiLCJ1c2VySWQiOiI1YjE2NGRiMzRkNTlhODAwMDdiZDQ3OTMiLCJpYXQiOjE1ODg1ODg3NjZ9.3GlJAwHz__e2Y5tgkzD1t-JyhgXGJOSVFSLUBCqLh5Y'; +process.env.ELASTICIO_WORKSPACE_ID = 'test'; +process.env.ELASTICIO_FLOW_ID = 'test'; +process.env.ELASTICIO_API_URI = 'https://api.hostname'; +process.env.ELASTICIO_OBJECT_STORAGE_URI = 'https://ma.estr'; +process.env.ELASTICIO_STEP_ID = 'step_id'; + const { expect } = chai; chai.use(require('chai-as-promised')); @@ -16,6 +24,12 @@ describe('Split on JSONata ', () => { }; }); + after(() => { + nock.restore(); + nock.cleanAll(); + nock.activate(); + }); + it('Base Case: Group Size is 1', async () => { const msg = { body: { @@ -24,6 +38,22 @@ describe('Split on JSONata ', () => { groupSize: 1, }, }; + + const getMessageGroups = nock('https://ma.estr').get('/objects?query[externalid]=group123').reply(200, []); + const postMessageGroup = nock('https://ma.estr') + .post('/objects', { messages: [], messageIdsSeen: {} }) + .matchHeader('x-query-externalid', 'group123') + .reply(200, { objectId: 'group123' }); + const getMessageGroup = nock('https://ma.estr') + .get('/objects/group123') + .reply(200, { messages: [], messageIdsSeen: {} }); + const putMessageGroup = nock('https://ma.estr').put('/objects/group123').reply(200, {}); + const getMessageGroup1 = nock('https://ma.estr') + .get('/objects/group123') + .reply(200, { messages: [{ msg123: undefined }], messageIdsSeen: { msg123: 'msg123' } }); + const putMessageGroup1 = nock('https://ma.estr').put('/objects/group123').reply(200, {}); + const deleteMessageGroup = nock('https://ma.estr').delete('/objects/group123').reply(200, {}); + await reassemble.process.call(self, msg, {}); // eslint-disable-next-line no-unused-expressions expect(self.emit.calledOnce).to.be.true; @@ -32,8 +62,17 @@ describe('Split on JSONata ', () => { groupId: 'group123', messageData: { msg123: undefined, + undefined, }, }); + + expect(getMessageGroups.isDone()).to.equal(true); + expect(postMessageGroup.isDone()).to.equal(true); + expect(getMessageGroup.isDone()).to.equal(true); + expect(putMessageGroup.isDone()).to.equal(true); + expect(getMessageGroup1.isDone()).to.equal(true); + expect(putMessageGroup1.isDone()).to.equal(true); + expect(deleteMessageGroup.isDone()).to.equal(true); }); it('Base Case: Group Size is 0', async () => { @@ -72,6 +111,42 @@ describe('Split on JSONata ', () => { // eslint-disable-next-line no-plusplus for (let i = 0; i < msgBodies.length; i++) { + nock('https://ma.estr').get('/objects?query[externalid]=1').reply(200, []); + nock('https://ma.estr') + .post('/objects', { messages: [], messageIdsSeen: {} }) + .matchHeader('x-query-externalid', '1') + .reply(200, { objectId: '1' }); + nock('https://ma.estr') + .get('/objects/1') + .reply(200, { messages: [], messageIdsSeen: {} }); + nock('https://ma.estr').put('/objects/1').reply(200, {}); + nock('https://ma.estr') + .get('/objects/1') + .reply(200, { + messages: [{ 1: '1-1' }, { 2: '1-2' }, { 3: '1-3' }], + messageIdsSeen: { 1: '1', 2: '2', 3: '3' }, + }); + nock('https://ma.estr').put('/objects/1').reply(200, {}); + nock('https://ma.estr').delete('/objects/1').reply(200, {}); + + nock('https://ma.estr').get('/objects?query[externalid]=2').reply(200, []); + nock('https://ma.estr') + .post('/objects', { messages: [], messageIdsSeen: {} }) + .matchHeader('x-query-externalid', '2') + .reply(200, { objectId: '2' }); + nock('https://ma.estr') + .get('/objects/2') + .reply(200, { messages: [], messageIdsSeen: {} }); + nock('https://ma.estr').put('/objects/2').reply(200, {}); + nock('https://ma.estr') + .get('/objects/2') + .reply(200, { + messages: [{ 1: '2-1' }, { 2: '2-2' }], + messageIdsSeen: { 1: '1', 2: '2' }, + }); + nock('https://ma.estr').put('/objects/2').reply(200, {}); + nock('https://ma.estr').delete('/objects/2').reply(200, {}); + // eslint-disable-next-line no-await-in-loop await reassemble.process.call(self, { body: msgBodies[i] }, {}); // eslint-disable-next-line default-case @@ -80,25 +155,27 @@ describe('Split on JSONata ', () => { expect(self.emit.callCount).to.be.equal(0); break; case 4: - expect(self.emit.callCount).to.be.equal(1); + expect(self.emit.callCount).to.be.equal(5); expect(self.emit.lastCall.args[1].body).to.deep.equal({ groupSize: 2, groupId: '2', messageData: { - 1: '2-1', + // 1: '2-1', 2: '2-2', + undefined, }, }); break; case 5: - expect(self.emit.callCount).to.be.equal(2); + expect(self.emit.callCount).to.be.equal(6); expect(self.emit.lastCall.args[1].body).to.deep.equal({ groupSize: 3, groupId: '1', messageData: { - 1: '1-1', + // 1: '1-1', 2: '1-2', - 3: '1-3', + // 3: '1-3', + undefined, }, }); break; @@ -117,6 +194,22 @@ describe('Split on JSONata ', () => { }, }, }; + + const getMessageGroups = nock('https://ma.estr').get('/objects?query[externalid]=group123').reply(200, []); + const postMessageGroup = nock('https://ma.estr') + .post('/objects', { messages: [], messageIdsSeen: {} }) + .matchHeader('x-query-externalid', 'group123') + .reply(200, { objectId: 'group123' }); + const getMessageGroup = nock('https://ma.estr') + .get('/objects/group123') + .reply(200, { messages: [], messageIdsSeen: {} }); + const putMessageGroup = nock('https://ma.estr').put('/objects/group123').reply(200, {}); + const getMessageGroup1 = nock('https://ma.estr') + .get('/objects/group123') + .reply(200, { messages: [{ msg123: undefined }], messageIdsSeen: { msg123: 'msg123' } }); + const putMessageGroup1 = nock('https://ma.estr').put('/objects/group123').reply(200, {}); + const deleteMessageGroup = nock('https://ma.estr').delete('/objects/group123').reply(200, {}); + await reassemble.process.call(self, msg, {}); // eslint-disable-next-line no-unused-expressions expect(self.emit.calledOnce).to.be.true; @@ -127,7 +220,16 @@ describe('Split on JSONata ', () => { msg123: { id: 1, }, + undefined, }, }); + + expect(getMessageGroups.isDone()).to.equal(true); + expect(postMessageGroup.isDone()).to.equal(true); + expect(getMessageGroup.isDone()).to.equal(true); + expect(putMessageGroup.isDone()).to.equal(true); + expect(getMessageGroup1.isDone()).to.equal(true); + expect(putMessageGroup1.isDone()).to.equal(true); + expect(deleteMessageGroup.isDone()).to.equal(true); }); });