From 049d4f96916fad3493cea451231e08aa98cc13e7 Mon Sep 17 00:00:00 2001 From: Anurag Bandyopadhyay Date: Sun, 19 Mar 2023 15:50:42 +0530 Subject: [PATCH] Add: Support for COMMAND LIST command (#2491) * feat: add support and tests for Command list command Co-authored-by: Anuragkillswitch <70265851+Anuragkillswitch@users.noreply.github.com> --- command.go | 7 +++++++ commands.go | 18 +++++++++++++++++ commands_test.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/command.go b/command.go index b62d50dd..f537594b 100644 --- a/command.go +++ b/command.go @@ -3992,3 +3992,10 @@ func (cmd *FunctionListCmd) readFunctions(rd *proto.Reader) ([]Function, error) } return functions, nil } + +type FilterBy struct { + Module string + ACLCat string + Pattern string +} + diff --git a/commands.go b/commands.go index ac93f39c..da23db22 100644 --- a/commands.go +++ b/commands.go @@ -124,6 +124,7 @@ type Cmdable interface { TxPipeline() Pipeliner Command(ctx context.Context) *CommandsInfoCmd + CommandList(ctx context.Context, filter *FilterBy) *StringSliceCmd ClientGetName(ctx context.Context) *StringCmd Echo(ctx context.Context, message interface{}) *StringCmd Ping(ctx context.Context) *StatusCmd @@ -537,6 +538,23 @@ func (c cmdable) Command(ctx context.Context) *CommandsInfoCmd { return cmd } +func (c cmdable) CommandList(ctx context.Context, filter *FilterBy) *StringSliceCmd { + args := make([]interface{}, 0, 5) + args = append(args, "command", "list") + if filter != nil { + if filter.Module != "" { + args = append(args, "filterby", "module", filter.Module) + } else if filter.ACLCat != "" { + args = append(args, "filterby", "aclcat", filter.ACLCat) + } else if filter.Pattern != "" { + args = append(args, "filterby", "pattern", filter.Pattern) + } + } + cmd := NewStringSliceCmd(ctx, args...) + _ = c(ctx, cmd) + return cmd +} + // ClientGetName returns the name of the connection. func (c cmdable) ClientGetName(ctx context.Context) *StringCmd { cmd := NewStringCmd(ctx, "client", "getname") diff --git a/commands_test.go b/commands_test.go index f806dc8f..1ddb6bae 100644 --- a/commands_test.go +++ b/commands_test.go @@ -6277,6 +6277,57 @@ var _ = Describe("Commands", func() { Expect(err).To(Equal(redis.Nil)) }) + It("should return all command names", func() { + cmdList := client.CommandList(ctx, nil) + Expect(cmdList.Err()).NotTo(HaveOccurred()) + cmdNames := cmdList.Val() + + Expect(cmdNames).NotTo(BeEmpty()) + + // Assert that some expected commands are present in the list + Expect(cmdNames).To(ContainElement("get")) + Expect(cmdNames).To(ContainElement("set")) + Expect(cmdNames).To(ContainElement("hset")) + }) + + It("should filter commands by module", func() { + filter := &redis.FilterBy{ + Module: "JSON", + } + cmdList := client.CommandList(ctx, filter) + Expect(cmdList.Err()).NotTo(HaveOccurred()) + Expect(cmdList.Val()).To(HaveLen(0)) + }) + + It("should filter commands by ACL category", func() { + + filter := &redis.FilterBy{ + ACLCat: "admin", + } + + cmdList := client.CommandList(ctx, filter) + Expect(cmdList.Err()).NotTo(HaveOccurred()) + cmdNames := cmdList.Val() + + // Assert that the returned list only contains commands from the admin ACL category + Expect(len(cmdNames)).To(BeNumerically(">", 10)) + }) + + It("should filter commands by pattern", func() { + filter := &redis.FilterBy{ + Pattern: "*GET*", + } + cmdList := client.CommandList(ctx, filter) + Expect(cmdList.Err()).NotTo(HaveOccurred()) + cmdNames := cmdList.Val() + + // Assert that the returned list only contains commands that match the given pattern + Expect(cmdNames).To(ContainElement("get")) + Expect(cmdNames).To(ContainElement("getbit")) + Expect(cmdNames).To(ContainElement("getrange")) + Expect(cmdNames).NotTo(ContainElement("set")) + }) + It("Dump and restores all libraries", func() { err := client.FunctionLoad(ctx, lib1Code).Err() Expect(err).NotTo(HaveOccurred())