package sdlgo_test import ( "errors" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "gerrit.oran-osc.org/r/ric-plt/sdlgo" ) type mockDB struct { mock.Mock } func (m *mockDB) MSet(pairs ...interface{}) error { a := m.Called(pairs) return a.Error(0) } func (m *mockDB) MGet(keys []string) ([]interface{}, error) { a := m.Called(keys) return a.Get(0).([]interface{}), a.Error(1) } func (m *mockDB) Close() error { a := m.Called() return a.Error(0) } func (m *mockDB) Del(keys []string) error { a := m.Called(keys) return a.Error(0) } func (m *mockDB) Keys(pattern string) ([]string, error) { a := m.Called(pattern) return a.Get(0).([]string), a.Error(1) } func setup() (*mockDB, *sdlgo.SdlInstance) { m := new(mockDB) i := &sdlgo.SdlInstance{ NameSpace: "namespace", NsPrefix: "{namespace},", Idatabase: m, } return m, i } func TestGetOneKey(t *testing.T) { m, i := setup() mgetExpected := []string{"{namespace},key"} mReturn := []interface{}{"somevalue"} mReturnExpected := make(map[string]interface{}) mReturnExpected["key"] = "somevalue" m.On("MGet", mgetExpected).Return(mReturn, nil) retVal, err := i.Get([]string{"key"}) assert.Nil(t, err) assert.Equal(t, mReturnExpected, retVal) m.AssertExpectations(t) } func TestGetSeveralKeys(t *testing.T) { m, i := setup() mgetExpected := []string{"{namespace},key1", "{namespace},key2", "{namespace},key3"} mReturn := []interface{}{"somevalue1", 2, "someothervalue"} mReturnExpected := make(map[string]interface{}) mReturnExpected["key1"] = "somevalue1" mReturnExpected["key2"] = 2 mReturnExpected["key3"] = "someothervalue" m.On("MGet", mgetExpected).Return(mReturn, nil) retVal, err := i.Get([]string{"key1", "key2", "key3"}) assert.Nil(t, err) assert.Equal(t, mReturnExpected, retVal) m.AssertExpectations(t) } func TestGetSeveralKeysSomeFail(t *testing.T) { m, i := setup() mgetExpected := []string{"{namespace},key1", "{namespace},key2", "{namespace},key3"} mReturn := []interface{}{"somevalue1", nil, "someothervalue"} mReturnExpected := make(map[string]interface{}) mReturnExpected["key1"] = "somevalue1" mReturnExpected["key2"] = nil mReturnExpected["key3"] = "someothervalue" m.On("MGet", mgetExpected).Return(mReturn, nil) retVal, err := i.Get([]string{"key1", "key2", "key3"}) assert.Nil(t, err) assert.Equal(t, mReturnExpected, retVal) m.AssertExpectations(t) } func TestGetKeyReturnError(t *testing.T) { m, i := setup() mgetExpected := []string{"{namespace},key"} mReturn := []interface{}{nil} mReturnExpected := make(map[string]interface{}) m.On("MGet", mgetExpected).Return(mReturn, errors.New("Some error")) retVal, err := i.Get([]string{"key"}) assert.NotNil(t, err) assert.Equal(t, mReturnExpected, retVal) m.AssertExpectations(t) } func TestGetEmptyList(t *testing.T) { m, i := setup() mgetExpected := []string{} retval, err := i.Get([]string{}) assert.Nil(t, err) assert.Len(t, retval, 0) m.AssertNotCalled(t, "MGet", mgetExpected) } func TestWriteOneKey(t *testing.T) { m, i := setup() msetExpected := []interface{}{"{namespace},key1", "data1"} m.On("MSet", msetExpected).Return(nil) err := i.Set("key1", "data1") assert.Nil(t, err) m.AssertExpectations(t) } func TestWriteSeveralKeysSlice(t *testing.T) { m, i := setup() msetExpected := []interface{}{"{namespace},key1", "data1", "{namespace},key2", 22} m.On("MSet", msetExpected).Return(nil) err := i.Set([]interface{}{"key1", "data1", "key2", 22}) assert.Nil(t, err) m.AssertExpectations(t) } func TestWriteSeveralKeysArray(t *testing.T) { m, i := setup() msetExpected := []interface{}{"{namespace},key1", "data1", "{namespace},key2", "data2"} m.On("MSet", msetExpected).Return(nil) err := i.Set([4]string{"key1", "data1", "key2", "data2"}) assert.Nil(t, err) m.AssertExpectations(t) } func TestWriteFail(t *testing.T) { m, i := setup() msetExpected := []interface{}{"{namespace},key1", "data1"} m.On("MSet", msetExpected).Return(errors.New("Some error")) err := i.Set("key1", "data1") assert.NotNil(t, err) m.AssertExpectations(t) } func TestWriteEmptyList(t *testing.T) { m, i := setup() msetExpected := []interface{}{} err := i.Set() assert.Nil(t, err) m.AssertNotCalled(t, "MSet", msetExpected) } func TestRemoveSuccessfully(t *testing.T) { m, i := setup() msetExpected := []string{"{namespace},key1", "{namespace},key2"} m.On("Del", msetExpected).Return(nil) err := i.Remove([]string{"key1", "key2"}) assert.Nil(t, err) m.AssertExpectations(t) } func TestRemoveFail(t *testing.T) { m, i := setup() msetExpected := []string{"{namespace},key"} m.On("Del", msetExpected).Return(errors.New("Some error")) err := i.Remove([]string{"key"}) assert.NotNil(t, err) m.AssertExpectations(t) } func TestRemoveEmptyList(t *testing.T) { m, i := setup() err := i.Remove([]string{}) assert.Nil(t, err) m.AssertNotCalled(t, "Del", []string{}) } func TestGetAllSuccessfully(t *testing.T) { m, i := setup() mKeysExpected := string("{namespace},*") mReturnExpected := []string{"{namespace},key1", "{namespace},key2"} expectedReturn := []string{"key1", "key2"} m.On("Keys", mKeysExpected).Return(mReturnExpected, nil) retVal, err := i.GetAll() assert.Nil(t, err) assert.Equal(t, expectedReturn, retVal) m.AssertExpectations(t) } func TestGetAllFail(t *testing.T) { m, i := setup() mKeysExpected := string("{namespace},*") mReturnExpected := []string{} m.On("Keys", mKeysExpected).Return(mReturnExpected, errors.New("some error")) retVal, err := i.GetAll() assert.NotNil(t, err) assert.Nil(t, retVal) assert.Equal(t, len(retVal), 0) m.AssertExpectations(t) } func TestGetAllReturnEmpty(t *testing.T) { m, i := setup() mKeysExpected := string("{namespace},*") var mReturnExpected []string = nil m.On("Keys", mKeysExpected).Return(mReturnExpected, nil) retVal, err := i.GetAll() assert.Nil(t, err) assert.Nil(t, retVal) assert.Equal(t, len(retVal), 0) m.AssertExpectations(t) } func TestRemoveAllSuccessfully(t *testing.T) { m, i := setup() mKeysExpected := string("{namespace},*") mKeysReturn := []string{"{namespace},key1", "{namespace},key2"} mDelExpected := mKeysReturn m.On("Keys", mKeysExpected).Return(mKeysReturn, nil) m.On("Del", mDelExpected).Return(nil) err := i.RemoveAll() assert.Nil(t, err) m.AssertExpectations(t) } func TestRemoveAllNoKeysFound(t *testing.T) { m, i := setup() mKeysExpected := string("{namespace},*") var mKeysReturn []string = nil m.On("Keys", mKeysExpected).Return(mKeysReturn, nil) m.AssertNumberOfCalls(t, "Del", 0) err := i.RemoveAll() assert.Nil(t, err) m.AssertExpectations(t) } func TestRemoveAllKeysReturnError(t *testing.T) { m, i := setup() mKeysExpected := string("{namespace},*") var mKeysReturn []string = nil m.On("Keys", mKeysExpected).Return(mKeysReturn, errors.New("Some error")) m.AssertNumberOfCalls(t, "Del", 0) err := i.RemoveAll() assert.NotNil(t, err) m.AssertExpectations(t) } func TestRemoveAllDelReturnError(t *testing.T) { m, i := setup() mKeysExpected := string("{namespace},*") mKeysReturn := []string{"{namespace},key1", "{namespace},key2"} mDelExpected := mKeysReturn m.On("Keys", mKeysExpected).Return(mKeysReturn, nil) m.On("Del", mDelExpected).Return(errors.New("Some Error")) err := i.RemoveAll() assert.NotNil(t, err) m.AssertExpectations(t) }