diff --git a/echovault/api_generic.go b/echovault/api_generic.go index c9a06a4..55fb62b 100644 --- a/echovault/api_generic.go +++ b/echovault/api_generic.go @@ -467,12 +467,12 @@ func (server *EchoVault) Decr(key string) (int, error) { // If the value stored at the key is not an integer, an error is returned. // // Parameters: -// - `key` (string): The key whose value is to be decremented. -// - `increment` (int): The amount by which to decrement the key's value. This can be a positive or negative integer. // -// Returns: -// - (int): The new value of the key after the decrement operation. - +// `key` - string - The key whose value is to be decremented. +// +// `increment` - int - The amount by which to decrement the key's value. This can be a positive or negative integer. +// +// Returns: The new value of the key after the decrement operation as an integer. func (server *EchoVault) DecrBy(key string, value string) (int, error) { // Construct the command cmd := []string{"DECRBY", key, value} diff --git a/echovault/api_generic_test.go b/echovault/api_generic_test.go index d3510eb..a084404 100644 --- a/echovault/api_generic_test.go +++ b/echovault/api_generic_test.go @@ -974,11 +974,11 @@ func TestEchoVault_INCR(t *testing.T) { } got, err := server.Incr(tt.key) if (err != nil) != tt.wantErr { - t.Errorf("TTL() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("INCR() error = %v, wantErr %v", err, tt.wantErr) return } if got != tt.want { - t.Errorf("TTL() got = %v, want %v", got, tt.want) + t.Errorf("INCR() got = %v, want %v", got, tt.want) } }) } @@ -1038,11 +1038,11 @@ func TestEchoVault_DECR(t *testing.T) { } got, err := server.Decr(tt.key) if (err != nil) != tt.wantErr { - t.Errorf("TTL() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("DECR() error = %v, wantErr %v", err, tt.wantErr) return } if got != tt.want { - t.Errorf("TTL() got = %v, want %v", got, tt.want) + t.Errorf("DECR() got = %v, want %v", got, tt.want) } }) } @@ -1107,11 +1107,11 @@ func TestEchoVault_DECRBY(t *testing.T) { } got, err := server.DecrBy(tt.key, tt.decrement) if (err != nil) != tt.wantErr { - t.Errorf("IncrBy() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("DecrBy() error = %v, wantErr %v", err, tt.wantErr) return } if got != tt.want { - t.Errorf("IncrBy() got = %v, want %v", got, tt.want) + t.Errorf("DecrBy() got = %v, want %v", got, tt.want) } }) } diff --git a/internal/modules/generic/commands.go b/internal/modules/generic/commands.go index 5b32446..52bad51 100644 --- a/internal/modules/generic/commands.go +++ b/internal/modules/generic/commands.go @@ -478,13 +478,8 @@ func handleDecr(params internal.HandlerFuncParams) ([]byte, error) { } func handleDecrBy(params internal.HandlerFuncParams) ([]byte, error) { - // Ensure command has the correct number of arguments - if len(params.Command) != 3 { - return nil, errors.New("wrong number of arguments for DECRBY") - } - // Extract key from command - keys, err := decrKeyByFunc(params.Command) + keys, err := decrByKeyFunc(params.Command) if err != nil { return nil, err } @@ -728,12 +723,15 @@ This operation is limited to 64 bit signed integers.`, HandlerFunc: handleDecr, }, { - Command: "decrby", - Module: constants.GenericModule, - Categories: []string{constants.KeyspaceCategory, constants.WriteCategory, constants.FastCategory}, - Description: `(DECRBY key decrement) The DECRBY command reduces the value stored at the specified key by the specified decrement. If the key does not exist, it is initialized with a value of 0 before performing the operation. If the key's value is not of the correct type or cannot be represented as an integer, an error is returned.`, + Command: "decrby", + Module: constants.GenericModule, + Categories: []string{constants.KeyspaceCategory, constants.WriteCategory, constants.FastCategory}, + Description: `(DECRBY key decrement) +The DECRBY command reduces the value stored at the specified key by the specified decrement. +If the key does not exist, it is initialized with a value of 0 before performing the operation. +If the key's value is not of the correct type or cannot be represented as an integer, an error is returned.`, Sync: true, - KeyExtractionFunc: decrKeyByFunc, + KeyExtractionFunc: decrByKeyFunc, HandlerFunc: handleDecrBy, }, } diff --git a/internal/modules/generic/commands_test.go b/internal/modules/generic/commands_test.go index 74f9c5a..253d042 100644 --- a/internal/modules/generic/commands_test.go +++ b/internal/modules/generic/commands_test.go @@ -2195,6 +2195,27 @@ func Test_Generic(t *testing.T) { expectedResponse: 3, expectedError: nil, }, + { + name: "5. Command too short", + key: "DecrByKey5", + presetValue: nil, + command: []resp.Value{resp.StringValue("DECRBY"), resp.StringValue("DecrByKey5")}, + expectedResponse: 0, + expectedError: errors.New(constants.WrongArgsResponse), + }, + { + name: "6. Command too long", + key: "DecrKey6", + presetValue: nil, + command: []resp.Value{ + resp.StringValue("DECRBY"), + resp.StringValue("DecrKey6"), + resp.StringValue("3"), + resp.StringValue("extra_arg"), + }, + expectedResponse: 0, + expectedError: errors.New(constants.WrongArgsResponse), + }, } for _, test := range tests { diff --git a/internal/modules/generic/key_funcs.go b/internal/modules/generic/key_funcs.go index 82f65b6..a68d74e 100644 --- a/internal/modules/generic/key_funcs.go +++ b/internal/modules/generic/key_funcs.go @@ -155,9 +155,9 @@ func decrKeyFunc(cmd []string) (internal.KeyExtractionFuncResult, error) { }, nil } -func decrKeyByFunc(cmd []string) (internal.KeyExtractionFuncResult, error) { - if len(cmd) < 3 { - return internal.KeyExtractionFuncResult{}, errors.New("wrong number of arguments for DECRBY") +func decrByKeyFunc(cmd []string) (internal.KeyExtractionFuncResult, error) { + if len(cmd) != 3 { + return internal.KeyExtractionFuncResult{}, errors.New(constants.WrongArgsResponse) } return internal.KeyExtractionFuncResult{ WriteKeys: []string{cmd[1]},