Implement SDL CLI 'get namespaces' -command
[ric-plt/sdlgo.git] / internal / cli / namespaces_test.go
diff --git a/internal/cli/namespaces_test.go b/internal/cli/namespaces_test.go
new file mode 100644 (file)
index 0000000..28b6343
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+   Copyright (c) 2021 AT&T Intellectual Property.
+   Copyright (c) 2018-2021 Nokia.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+/*
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+ */
+
+package cli_test
+
+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"
+       "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
+       "github.com/stretchr/testify/assert"
+       "testing"
+)
+
+var mNs *nsMock
+
+type nsMock struct {
+       dbIface    *mocks.MockDB
+       dbKeys     []string
+       dbState    sdlgoredis.DbState
+       dbKeysErr  error
+       dbStateErr error
+}
+
+func setupNamespacesCliMock(keys []string, addr string, keysErr, stateErr error) {
+       mNs = new(nsMock)
+       mNs.dbKeys = keys
+       mNs.dbState.MasterDbState.Fields.Role = "Master"
+       mNs.dbState.MasterDbState.Fields.Ip = addr
+       if addr != "" {
+               mNs.dbState.MasterDbState.Fields.Port = "6379"
+       }
+       mNs.dbKeysErr = keysErr
+       mNs.dbStateErr = stateErr
+}
+
+func newNsMockDatabase() *cli.Database {
+       db := &cli.Database{}
+       mNs.dbIface = new(mocks.MockDB)
+       mNs.dbIface.On("Keys", "*").Return(mNs.dbKeys, mNs.dbKeysErr)
+       mNs.dbIface.On("State").Return(&mNs.dbState, mNs.dbStateErr).Maybe()
+       db.Instances = append(db.Instances, mNs.dbIface)
+       return db
+}
+
+func TestNamespacesCmdShowHelp(t *testing.T) {
+       var expOkErr error
+       expNokErrTooManyArgs := errors.New("accepts 0 arg(s), received 1")
+       expHelp := "Usage:\n  namespaces [flags]"
+       tests := []struct {
+               args   []string
+               expOut string
+               expErr error
+       }{
+               {args: []string{"-h"}, expErr: expOkErr, expOut: expHelp},
+               {args: []string{"--help"}, expErr: expOkErr, expOut: expHelp},
+               {args: []string{"extra-arg"}, expErr: expNokErrTooManyArgs, expOut: expHelp},
+       }
+
+       for _, test := range tests {
+               buf := new(bytes.Buffer)
+               cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+               cmd.SetOut(buf)
+               cmd.SetErr(buf)
+               cmd.SetArgs(test.args)
+               err := cmd.Execute()
+               result := buf.String()
+
+               assert.Equal(t, test.expErr, err)
+               assert.Contains(t, result, test.expOut)
+       }
+}
+
+func TestNamespacesCmdSuccess(t *testing.T) {
+       expOut := "ns1\n" + "ns2\n" + "ns3\n"
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock([]string{
+               "{ns1},key1",
+               "{ns3},key1",
+               "{ns2},key1",
+               "{ns1},key2",
+       }, "1.2.3.4", nil, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Nil(t, err)
+       assert.Equal(t, expOut, result)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdWithPerDbFlagSuccess(t *testing.T) {
+       expOut := "1.2.3.4:6379: ns1\n" + "1.2.3.4:6379: ns2\n" + "1.2.3.4:6379: ns3\n"
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock([]string{
+               "{ns1},key1",
+               "{ns3},key1",
+               "{ns2},key1",
+               "{ns1},key2",
+       }, "1.2.3.4", nil, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+       cmd.SetArgs([]string{"--group"})
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Nil(t, err)
+       assert.Equal(t, expOut, result)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdNoKeysInDbSuccess(t *testing.T) {
+       expOut := ""
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock([]string{}, "1.2.3.4", nil, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Nil(t, err)
+       assert.Equal(t, expOut, result)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdWithPerDbFlagNoKeysInDbSuccess(t *testing.T) {
+       expOut := ""
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock([]string{}, "1.2.3.4", nil, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+       cmd.SetArgs([]string{"--group"})
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Nil(t, err)
+       assert.Equal(t, expOut, result)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdWithPerDbFlagStandaloneRedisAddressMissingSuccess(t *testing.T) {
+       expOut := "ns1\n" + "ns2\n" + "ns3\n"
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock([]string{
+               "{ns1},key1",
+               "{ns3},key1",
+               "{ns2},key1",
+               "{ns1},key2",
+       }, "", nil, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+       cmd.SetArgs([]string{"--group"})
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Nil(t, err)
+       assert.Equal(t, expOut, result)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdDbKeysFailure(t *testing.T) {
+       expNokErr := errors.New("Some error")
+       expOut := "Error: Some error"
+
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock(nil, "1.2.3.4", expNokErr, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Equal(t, expNokErr, err)
+       assert.Contains(t, result, expOut)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdDbStateFailure(t *testing.T) {
+       expNokErr := errors.New("Some error")
+       expOut := "Error: Some error"
+
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock(nil, "1.2.3.4", nil, expNokErr)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Equal(t, expNokErr, err)
+       assert.Contains(t, result, expOut)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdNsStartMarkerFailure(t *testing.T) {
+       expNokErr := errors.New("Namespace parsing error, no '{' in key string 'ns2},key1'")
+       expOut := "Error: Namespace parsing error, no '{' in key string 'ns2},key1'"
+
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock([]string{
+               "{ns1},key1",
+               "ns2},key1",
+               "{ns1},key2",
+       }, "1.2.3.4", nil, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Equal(t, expNokErr, err)
+       assert.Contains(t, result, expOut)
+       mNs.dbIface.AssertExpectations(t)
+}
+
+func TestNamespacesCmdNsEndMarkerFailure(t *testing.T) {
+       expNokErr := errors.New("Namespace parsing error, no '}' in key string '{ns2,key1'")
+       expOut := "Error: Namespace parsing error, no '}' in key string '{ns2,key1'"
+
+       buf := new(bytes.Buffer)
+       setupNamespacesCliMock([]string{
+               "{ns1},key1",
+               "{ns2,key1",
+               "{ns1},key2",
+       }, "1.2.3.4", nil, nil)
+       cmd := cli.NewNamespacesCmdForTest(newNsMockDatabase)
+       cmd.SetOut(buf)
+       cmd.SetErr(buf)
+
+       err := cmd.Execute()
+       result := buf.String()
+
+       assert.Equal(t, expNokErr, err)
+       assert.Contains(t, result, expOut)
+       mNs.dbIface.AssertExpectations(t)
+}