SDL CLI 'get' reads keys data in the given namespace
[ric-plt/sdlgo.git] / internal / cli / get_test.go
index 759ab11..22301b9 100644 (file)
@@ -26,14 +26,55 @@ import (
        "bytes"
        "errors"
        "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/cli"
+       "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/mocks"
        "github.com/stretchr/testify/assert"
        "testing"
 )
 
+var getMocks *GetMocks
+
+type GetMocks struct {
+       sdlIface *mocks.MockSdlApi
+       ns       string
+       keys     []string
+       result   map[string]interface{}
+       ret      error
+}
+
+func setupGetMock(ns string, keys []string, result map[string]interface{}, ret error) {
+       getMocks = new(GetMocks)
+       getMocks.ns = ns
+       getMocks.keys = keys
+       getMocks.result = result
+       getMocks.ret = ret
+}
+
+func newSdlGetApiMock() cli.ISyncStorage {
+       getMocks.sdlIface = new(mocks.MockSdlApi)
+       getMocks.sdlIface.On("Get", getMocks.ns, getMocks.keys).Return(getMocks.result, getMocks.ret)
+       return getMocks.sdlIface
+}
+
+func runGetCmdCli() (string, string, error) {
+       bufOut := new(bytes.Buffer)
+       bufErr := new(bytes.Buffer)
+
+       cmd := cli.NewGetCmdForTest(newSdlGetApiMock)
+       cmd.SetOut(bufOut)
+       cmd.SetErr(bufErr)
+       args := []string{getMocks.ns}
+       args = append(args, getMocks.keys...)
+       cmd.SetArgs(args)
+       err := cmd.Execute()
+
+       return bufOut.String(), bufErr.String(), err
+}
+
 func TestGetCmdShowHelp(t *testing.T) {
        var expOkErr error
-       expHelp := "Display one or many resources.\n\nPrints important information about the specified resources."
-       expExamples := "Examples:\n  # List keys in the given namespace."
+       expHelp := "Display one or many resources.\n\nPrints keys and keys data in the given namespace."
+       expHelpUsage := "Usage:\n  get <namespace> <key> [<key2> <key3>... <keyN>] [flags]"
+       expArgsErr := errors.New("accepts command or arguments, received 0")
        expNokErr := errors.New("unknown flag: --ff")
        tests := []struct {
                args   []string
@@ -42,13 +83,13 @@ func TestGetCmdShowHelp(t *testing.T) {
        }{
                {args: []string{"-h"}, expErr: expOkErr, expOut: expHelp},
                {args: []string{"--help"}, expErr: expOkErr, expOut: expHelp},
-               {args: []string{}, expErr: expOkErr, expOut: expHelp},
-               {args: []string{"--ff"}, expErr: expNokErr, expOut: expExamples},
+               {args: []string{}, expErr: expArgsErr, expOut: expHelpUsage},
+               {args: []string{"--ff"}, expErr: expNokErr, expOut: expHelpUsage},
        }
 
        for _, test := range tests {
                buf := new(bytes.Buffer)
-               cmd := cli.NewGetCmdForTest()
+               cmd := cli.NewGetCmdForTest(newSdlGetApiMock)
                cmd.SetOut(buf)
                cmd.SetErr(buf)
                cmd.SetArgs(test.args)
@@ -59,3 +100,40 @@ func TestGetCmdShowHelp(t *testing.T) {
                assert.Contains(t, result, test.expOut)
        }
 }
+
+func TestGetCmdSuccess(t *testing.T) {
+
+       tests := []struct {
+               ns     string
+               keys   []string
+               result map[string]interface{}
+               expOut string
+               expErr error
+       }{
+               {ns: "testns", keys: []string{"key1"}, result: map[string]interface{}{}, expOut: "", expErr: nil},
+               {ns: "testns", keys: []string{"key1"}, result: map[string]interface{}{"key1": "1"}, expOut: "key1:1\n", expErr: nil},
+               {ns: "testns", keys: []string{"key1 key2"}, result: map[string]interface{}{"key1": "1", "key2": "2"}, expOut: "key1:1\nkey2:2\n", expErr: nil},
+               {ns: "testns", keys: []string{"key1 key3 key2"}, result: map[string]interface{}{"key1": "1", "key3": "3", "key2": "2"}, expOut: "key1:1\nkey2:2\nkey3:3\n", expErr: nil},
+               {ns: "testns", keys: []string{"key1 keyDoesNotExist"}, result: map[string]interface{}{"key1": "1"}, expOut: "key1:1\n", expErr: nil},
+       }
+       for _, test := range tests {
+               setupGetMock(test.ns, test.keys, test.result, test.expErr)
+               stdout, stderr, err := runGetCmdCli()
+
+               assert.Nil(t, err)
+               assert.Equal(t, test.expOut, stdout)
+               assert.Equal(t, "", stderr)
+               getMocks.sdlIface.AssertExpectations(t)
+       }
+}
+
+func TestGetCmdFails(t *testing.T) {
+       expErr := errors.New("Boom!")
+
+       setupGetMock("testns", []string{"key1"}, map[string]interface{}{}, expErr)
+       _, stderr, err := runGetCmdCli()
+
+       assert.Equal(t, expErr, err)
+       assert.Contains(t, stderr, expErr.Error())
+       getMocks.sdlIface.AssertExpectations(t)
+}