Merge pull request #7594 from Budibase/fix/redis-connector

improvements to redis connector - multi line pipelines and lowercase …
This commit is contained in:
Martin McKeaveney 2022-09-05 17:50:39 +01:00 committed by GitHub
commit 809bb259a3
2 changed files with 32 additions and 7 deletions

View File

@ -132,12 +132,22 @@ module RedisModule {
async command(query: { json: string }) { async command(query: { json: string }) {
return this.redisContext(async () => { return this.redisContext(async () => {
const commands = query.json.trim().split(" ") // commands split line by line
const pipeline = this.client.pipeline([commands]) const commands = query.json.trim().split("\n")
const result = await pipeline.exec() let pipelineCommands = []
return {
response: result[0][1], // process each command separately
for (let command of commands) {
const tokenised = command.trim().split(" ")
// Pipeline only accepts lower case commands
tokenised[0] = tokenised[0].toLowerCase()
pipelineCommands.push(tokenised)
} }
const pipeline = this.client.pipeline(pipelineCommands)
const result = await pipeline.exec()
return result.map((output: string | string[]) => output[1])
}) })
} }
} }

View File

@ -46,7 +46,7 @@ describe("Redis Integration", () => {
expect(await config.redis.get(body.key)).toEqual(null) expect(await config.redis.get(body.key)).toEqual(null)
}) })
it("calls the command method with the correct params", async () => { it("calls the pipeline method with the correct params", async () => {
const body = { const body = {
json: "KEYS *" json: "KEYS *"
} }
@ -55,6 +55,21 @@ describe("Redis Integration", () => {
config.integration.client.pipeline = jest.fn(() => ({ exec: jest.fn(() => [[]]) })) config.integration.client.pipeline = jest.fn(() => ({ exec: jest.fn(() => [[]]) }))
await config.integration.command(body) await config.integration.command(body)
expect(config.integration.client.pipeline).toHaveBeenCalledWith([["KEYS", "*"]]) expect(config.integration.client.pipeline).toHaveBeenCalledWith([["keys", "*"]])
})
it("calls the pipeline method with several separated commands when there are newlines", async () => {
const body = {
json: 'SET foo "bar"\nGET foo'
}
// ioredis-mock doesn't support pipelines
config.integration.client.pipeline = jest.fn(() => ({ exec: jest.fn(() => [[]]) }))
await config.integration.command(body)
expect(config.integration.client.pipeline).toHaveBeenCalledWith([
["set", 'foo', '"bar"'],
["get", 'foo']
])
}) })
}) })