Implement SDL CLI 'set' -command
[ric-plt/sdlgo.git] / internal / cli / set_test.go
1 /*
2    Copyright (c) 2021 AT&T Intellectual Property.
3    Copyright (c) 2018-2021 Nokia.
4
5    Licensed under the Apache License, Version 2.0 (the "License");
6    you may not use this file except in compliance with the License.
7    You may obtain a copy of the License at
8
9        http://www.apache.org/licenses/LICENSE-2.0
10
11    Unless required by applicable law or agreed to in writing, software
12    distributed under the License is distributed on an "AS IS" BASIS,
13    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14    See the License for the specific language governing permissions and
15    limitations under the License.
16 */
17
18 /*
19  * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20  * platform project (RICP).
21  */
22
23 package cli_test
24
25 import (
26         "bytes"
27         "fmt"
28         "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/cli"
29         "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/mocks"
30         "github.com/stretchr/testify/assert"
31         "testing"
32 )
33
34 var setMocks *SetMocks
35
36 type SetMocks struct {
37         sdlIface *mocks.MockSdlApi
38         ns       string
39         key      string
40         value    string
41         ret      error
42 }
43
44 func setupSetCliMock(ns, key, value string, ret error) {
45         setMocks = new(SetMocks)
46         setMocks.ns = ns
47         setMocks.key = key
48         setMocks.value = value
49         setMocks.ret = ret
50 }
51
52 func newMockSdlSetApi() cli.ISyncStorage {
53         setMocks.sdlIface = new(mocks.MockSdlApi)
54         setMocks.sdlIface.On("Set", setMocks.ns, []interface{}{setMocks.key, setMocks.value}).Return(setMocks.ret)
55         return setMocks.sdlIface
56 }
57
58 func runSetCli() (string, string, error) {
59         bufStdout := new(bytes.Buffer)
60         bufStderr := new(bytes.Buffer)
61         cmd := cli.NewSetCmdForTest(newMockSdlSetApi)
62         cmd.SetOut(bufStdout)
63         cmd.SetErr(bufStderr)
64         cmd.SetArgs([]string{setMocks.ns, setMocks.key, setMocks.value})
65         err := cmd.Execute()
66
67         return bufStdout.String(), bufStderr.String(), err
68 }
69
70 func TestCliSetCanShowHelp(t *testing.T) {
71         var expOkErr error
72         expHelp := "Usage:\n  " + "set <namespace> <key> <value> [flags]"
73         expFlagErr := fmt.Errorf("unknown flag: --some-unknown-flag")
74         expArgCntLtErr := fmt.Errorf("accepts 3 arg(s), received 2")
75         expArgCntGtErr := fmt.Errorf("accepts 3 arg(s), received 4")
76         tests := []struct {
77                 args      []string
78                 expErr    error
79                 expOutput string
80         }{
81                 {args: []string{"-h"}, expErr: expOkErr, expOutput: expHelp},
82                 {args: []string{"--help"}, expErr: expOkErr, expOutput: expHelp},
83                 {args: []string{"--some-unknown-flag"}, expErr: expFlagErr, expOutput: expHelp},
84                 {args: []string{"some-ns", "some-key"}, expErr: expArgCntLtErr, expOutput: expHelp},
85                 {args: []string{"some-ns", "some-key", "some-value", "some-extra"}, expErr: expArgCntGtErr, expOutput: expHelp},
86         }
87
88         for _, test := range tests {
89                 buf := new(bytes.Buffer)
90                 cmd := cli.NewSetCmdForTest(newMockSdlSetApi)
91                 cmd.SetOut(buf)
92                 cmd.SetArgs(test.args)
93
94                 err := cmd.Execute()
95
96                 stdout := buf.String()
97                 assert.Equal(t, test.expErr, err)
98                 assert.Contains(t, stdout, test.expOutput)
99         }
100 }
101
102 func TestCliSetCommandSuccess(t *testing.T) {
103         setupSetCliMock("some-ns", "some-key", "some-value", nil)
104
105         stdout, stderr, err := runSetCli()
106
107         assert.Nil(t, err)
108         assert.Equal(t, "", stdout)
109         assert.Equal(t, "", stderr)
110         setMocks.sdlIface.AssertExpectations(t)
111 }
112
113 func TestCliSetCommandFailure(t *testing.T) {
114         expErr := fmt.Errorf("some-error")
115         setupSetCliMock("some-ns", "some-key", "some-value", expErr)
116
117         _, stderr, err := runSetCli()
118
119         assert.Equal(t, expErr, err)
120         assert.Contains(t, stderr, expErr.Error())
121         setMocks.sdlIface.AssertExpectations(t)
122 }