From 9505d6b969c1d6a9819439c5ea37a5984e87c8c0 Mon Sep 17 00:00:00 2001 From: jhpung Date: Wed, 30 Oct 2024 19:26:41 +0900 Subject: [PATCH] feat: update zscan's options (#12) * feat: update zscan Signed-off-by: jhpung * test: add zscan tests Signed-off-by: jhpung * fix: update script error message Signed-off-by: jhpung * test(scripting): change expect assertions from .equal to .match Signed-off-by: jhpung --------- Signed-off-by: jhpung --- lib/ScanStream.ts | 4 +++ lib/types.ts | 1 + lib/utils/RedisCommander.ts | 64 ++++++++++++++++++++++++++++++++++++ test/functional/scripting.ts | 8 ++--- test/unit/commander.ts | 17 ++++++++++ 5 files changed, 88 insertions(+), 6 deletions(-) diff --git a/lib/ScanStream.ts b/lib/ScanStream.ts index e74a7a2c..c6091b92 100644 --- a/lib/ScanStream.ts +++ b/lib/ScanStream.ts @@ -4,6 +4,7 @@ interface Options extends ReadableOptions { key?: string; match?: string; type?: string; + noscores?: boolean; command: string; redis: any; count?: string | number; @@ -39,6 +40,9 @@ export default class ScanStream extends Readable { if (this.opt.count) { args.push("COUNT", String(this.opt.count)); } + if (this.opt.noscores) { + args.push("noscores"); + } this.opt.redis[this.opt.command](args, (err, res) => { if (err) { diff --git a/lib/types.ts b/lib/types.ts index 8c897a8e..37821ae5 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -30,4 +30,5 @@ export interface ScanStreamOptions { match?: string; type?: string; count?: number; + noscores?: boolean; } diff --git a/lib/utils/RedisCommander.ts b/lib/utils/RedisCommander.ts index 49388d8e..215ed50b 100644 --- a/lib/utils/RedisCommander.ts +++ b/lib/utils/RedisCommander.ts @@ -13798,11 +13798,38 @@ interface RedisCommander { cursor: number | string, callback?: Callback<[cursor: Buffer, elements: Buffer[]]> ): Result<[cursor: Buffer, elements: Buffer[]], Context>; + zscan( + key: RedisKey, + cursor: number | string, + noscoresToken: "noscores", + callback?: Callback<[cursor: string, elements: string[]]> + ): Result<[cursor: string, elements: string[]], Context>; + zscanBuffer( + key: RedisKey, + cursor: number | string, + noscoresToken: "noscores", + callback?: Callback<[cursor: Buffer, elements: Buffer[]]> + ): Result<[cursor: Buffer, elements: Buffer[]], Context>; + zscan( + key: RedisKey, + cursor: number | string, + countToken: "COUNT", + count: number | string, + callback?: Callback<[cursor: string, elements: string[]]> + ): Result<[cursor: string, elements: string[]], Context>; + zscanBuffer( + key: RedisKey, + cursor: number | string, + countToken: "COUNT", + count: number | string, + callback?: Callback<[cursor: Buffer, elements: Buffer[]]> + ): Result<[cursor: Buffer, elements: Buffer[]], Context>; zscan( key: RedisKey, cursor: number | string, countToken: "COUNT", count: number | string, + noscoresToken: "noscores", callback?: Callback<[cursor: string, elements: string[]]> ): Result<[cursor: string, elements: string[]], Context>; zscanBuffer( @@ -13810,6 +13837,37 @@ interface RedisCommander { cursor: number | string, countToken: "COUNT", count: number | string, + noscoresToken: "noscores", + callback?: Callback<[cursor: Buffer, elements: Buffer[]]> + ): Result<[cursor: Buffer, elements: Buffer[]], Context>; + zscan( + key: RedisKey, + cursor: number | string, + patternToken: "MATCH", + pattern: string, + callback?: Callback<[cursor: string, elements: string[]]> + ): Result<[cursor: string, elements: string[]], Context>; + zscanBuffer( + key: RedisKey, + cursor: number | string, + patternToken: "MATCH", + pattern: string, + callback?: Callback<[cursor: Buffer, elements: Buffer[]]> + ): Result<[cursor: Buffer, elements: Buffer[]], Context>; + zscan( + key: RedisKey, + cursor: number | string, + patternToken: "MATCH", + pattern: string, + noscoresToken: "noscores", + callback?: Callback<[cursor: string, elements: string[]]> + ): Result<[cursor: string, elements: string[]], Context>; + zscanBuffer( + key: RedisKey, + cursor: number | string, + patternToken: "MATCH", + pattern: string, + noscoresToken: "noscores", callback?: Callback<[cursor: Buffer, elements: Buffer[]]> ): Result<[cursor: Buffer, elements: Buffer[]], Context>; zscan( @@ -13817,6 +13875,8 @@ interface RedisCommander { cursor: number | string, patternToken: "MATCH", pattern: string, + countToken: "COUNT", + count: number | string, callback?: Callback<[cursor: string, elements: string[]]> ): Result<[cursor: string, elements: string[]], Context>; zscanBuffer( @@ -13824,6 +13884,8 @@ interface RedisCommander { cursor: number | string, patternToken: "MATCH", pattern: string, + countToken: "COUNT", + count: number | string, callback?: Callback<[cursor: Buffer, elements: Buffer[]]> ): Result<[cursor: Buffer, elements: Buffer[]], Context>; zscan( @@ -13833,6 +13895,7 @@ interface RedisCommander { pattern: string, countToken: "COUNT", count: number | string, + noscoresToken: "noscores", callback?: Callback<[cursor: string, elements: string[]]> ): Result<[cursor: string, elements: string[]], Context>; zscanBuffer( @@ -13842,6 +13905,7 @@ interface RedisCommander { pattern: string, countToken: "COUNT", count: number | string, + noscoresToken: "noscores", callback?: Callback<[cursor: Buffer, elements: Buffer[]]> ): Result<[cursor: Buffer, elements: Buffer[]], Context>; diff --git a/test/functional/scripting.ts b/test/functional/scripting.ts index ee796bff..a0401f53 100644 --- a/test/functional/scripting.ts +++ b/test/functional/scripting.ts @@ -250,12 +250,8 @@ describe("scripting", () => { // @ts-expect-error const [a, b] = await redis.multi().test("foo").test("bar").exec(); - expect(a[0].message).to.equal( - "NOSCRIPT No matching script. Please use EVAL." - ); - expect(b[0].message).to.equal( - "NOSCRIPT No matching script. Please use EVAL." - ); + expect(a[0].message).to.match(/^NOSCRIPT No matching script/); + expect(b[0].message).to.match(/^NOSCRIPT No matching script/); }); spy.restore(); expect(spy.callCount).to.equal(4); diff --git a/test/unit/commander.ts b/test/unit/commander.ts index 109cbe6b..ed25d4af 100644 --- a/test/unit/commander.ts +++ b/test/unit/commander.ts @@ -1,6 +1,7 @@ import * as sinon from "sinon"; import { expect } from "chai"; import Commander from "../../lib/utils/Commander"; +import Command from "../../lib/Command"; describe("Commander", () => { describe("#getBuiltinCommands()", () => { @@ -63,4 +64,20 @@ describe("Commander", () => { Commander.prototype.sendCommand.restore(); }); + + describe("#zscan", () => { + it("should pass noscores option", async (done) => { + const args: any[] = ["key", "0", "MATCH", "pattern", "COUNT", "10", "noscores"]; + sinon.stub(Commander.prototype, "sendCommand").callsFake((command) => { + if(command.args.every((arg, index) => arg === args[index])) { + return done(); + } + return done(new Error(`args should be ${args.join(", ")}`)); + }); + const c = new Commander(); + + await c.zscan(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + (Commander.prototype.sendCommand as any).restore(); + }); + }); });