From 2cad3ee78ecb765bba72185e7b26902084c47c7d Mon Sep 17 00:00:00 2001 From: elinuxhenrik Date: Wed, 6 Oct 2021 14:53:15 +0200 Subject: [PATCH] Add test for consumer restclient Issue-ID: NONRTRIC-588 Signed-off-by: elinuxhenrik Change-Id: Ide62b004551f1844454be817e531e737114caf4f --- .../internal/server/server_test.go | 2 +- .../internal/linkfailure/linkfailurehandler.go | 19 +- .../goversion/internal/restclient/client.go | 12 +- .../goversion/internal/restclient/client_test.go | 241 +++++++++++++++++++++ .../goversion/internal/ves/decoder.go | 17 ++ 5 files changed, 268 insertions(+), 23 deletions(-) create mode 100644 test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client_test.go diff --git a/dmaap-mediator-producer/internal/server/server_test.go b/dmaap-mediator-producer/internal/server/server_test.go index 2fe936fa..59439143 100644 --- a/dmaap-mediator-producer/internal/server/server_test.go +++ b/dmaap-mediator-producer/internal/server/server_test.go @@ -164,7 +164,7 @@ func TestDeleteJob(t *testing.T) { r := mux.SetURLVars(newRequest(http.MethodDelete, "/jobs/", nil, t), map[string]string{"infoJobId": "job1"}) handler := http.HandlerFunc(deleteInfoJobHandler) handler.ServeHTTP(responseRecorder, r) - assertions.Equal(http.StatusOK, http.StatusOK) + assertions.Equal(http.StatusOK, responseRecorder.Result().StatusCode) assertions.Equal("", responseRecorder.Body.String()) diff --git a/test/usecases/oruclosedlooprecovery/goversion/internal/linkfailure/linkfailurehandler.go b/test/usecases/oruclosedlooprecovery/goversion/internal/linkfailure/linkfailurehandler.go index ebcf3125..c21371a3 100644 --- a/test/usecases/oruclosedlooprecovery/goversion/internal/linkfailure/linkfailurehandler.go +++ b/test/usecases/oruclosedlooprecovery/goversion/internal/linkfailure/linkfailurehandler.go @@ -21,8 +21,6 @@ package linkfailure import ( - "encoding/json" - "io/ioutil" "net/http" "strings" @@ -59,7 +57,7 @@ func NewLinkFailureHandler(ls repository.LookupService, conf Configuration) *Lin func (lfh LinkFailureHandler) MessagesHandler(w http.ResponseWriter, r *http.Request) { log.Debug("Handling messages") - if messages := lfh.getVesMessages(r); messages != nil { + if messages := ves.GetVesMessages(r.Body); messages != nil { faultMessages := ves.GetFaultMessages(messages) for _, message := range faultMessages { @@ -96,18 +94,3 @@ func getSdnrPath(oRuId string, oDuId string) string { func (lfh LinkFailureHandler) getUnlockMessage(oRuId string) string { return strings.Replace(unlockMessage, "[O-RU-ID]", oRuId, 1) } - -func (lfh LinkFailureHandler) getVesMessages(r *http.Request) *[]string { - var messages []string - body, err := ioutil.ReadAll(r.Body) - if err != nil { - log.Warn(err) - return nil - } - err = json.Unmarshal(body, &messages) - if err != nil { - log.Warn(err) - return nil - } - return &messages -} diff --git a/test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client.go b/test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client.go index f038b25d..310a4493 100644 --- a/test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client.go +++ b/test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client.go @@ -56,11 +56,15 @@ func init() { func Get(url string) ([]byte, error) { if response, err := Client.Get(url); err == nil { - defer response.Body.Close() - if responseData, err := io.ReadAll(response.Body); err == nil { - return responseData, nil + if isResponseSuccess(response.StatusCode) { + defer response.Body.Close() + if responseData, err := io.ReadAll(response.Body); err == nil { + return responseData, nil + } else { + return nil, err + } } else { - return nil, err + return nil, getResponseError(response) } } else { return nil, err diff --git a/test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client_test.go b/test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client_test.go new file mode 100644 index 00000000..9b482b52 --- /dev/null +++ b/test/usecases/oruclosedlooprecovery/goversion/internal/restclient/client_test.go @@ -0,0 +1,241 @@ +// - +// ========================LICENSE_START================================= +// O-RAN-SC +// %% +// Copyright (C) 2021: Nordix Foundation +// %% +// 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. +// ========================LICENSE_END=================================== +// + +package restclient + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "oransc.org/usecase/oruclosedloop/mocks" +) + +func TestRequestError_Error(t *testing.T) { + assertions := require.New(t) + + actualError := RequestError{ + StatusCode: http.StatusBadRequest, + Body: []byte("error"), + } + assertions.Equal("Request failed due to error response with status: 400 and body: error", actualError.Error()) +} + +func TestGet(t *testing.T) { + assertions := require.New(t) + + type args struct { + url string + mockReturnStatus int + mockReturnBody []byte + mockReturnError error + } + tests := []struct { + name string + args args + want []byte + wantErr error + }{ + { + name: "Ok response", + args: args{ + url: "ok", + mockReturnStatus: http.StatusOK, + mockReturnBody: []byte("body"), + mockReturnError: nil, + }, + want: []byte("body"), + wantErr: nil, + }, + { + name: "Bad request should get RequestError", + args: args{ + url: "badRequest", + mockReturnStatus: http.StatusBadRequest, + mockReturnBody: []byte("bad request"), + mockReturnError: nil, + }, + want: nil, + wantErr: RequestError{ + StatusCode: http.StatusBadRequest, + Body: []byte("bad request"), + }, + }, + { + name: "Server unavailable should get error", + args: args{ + url: "serverUnavailable", + mockReturnError: fmt.Errorf("Server unavailable"), + }, + want: nil, + wantErr: fmt.Errorf("Server unavailable"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + clientMock := mocks.HTTPClient{} + clientMock.On("Get", tt.args.url).Return(&http.Response{ + StatusCode: tt.args.mockReturnStatus, + Body: ioutil.NopCloser(bytes.NewReader(tt.args.mockReturnBody)), + }, tt.args.mockReturnError) + Client = &clientMock + + got, err := Get(tt.args.url) + assertions.Equal(tt.wantErr, err, tt.name) + assertions.Equal(tt.want, got, tt.name) + clientMock.AssertCalled(t, "Get", tt.args.url) + }) + } +} + +func TestPutWithoutAuth(t *testing.T) { + assertions := require.New(t) + + clientMock := mocks.HTTPClient{} + clientMock.On("Do", mock.Anything).Return(&http.Response{ + StatusCode: http.StatusOK, + }, nil) + Client = &clientMock + + error := PutWithoutAuth("url", []byte("body")) + + assertions.Nil(error) + var actualRequest *http.Request + clientMock.AssertCalled(t, "Do", mock.MatchedBy(func(req *http.Request) bool { + actualRequest = req + return true + })) + assertions.Equal(http.MethodPut, actualRequest.Method) + assertions.Equal("url", actualRequest.URL.Path) + assertions.Equal("application/json; charset=utf-8", actualRequest.Header.Get("Content-Type")) + assertions.Empty(actualRequest.Header.Get("Authorization")) + body, _ := ioutil.ReadAll(actualRequest.Body) + expectedBody := []byte("body") + assertions.Equal(expectedBody, body) + clientMock.AssertNumberOfCalls(t, "Do", 1) +} + +func TestPut(t *testing.T) { + assertions := require.New(t) + + clientMock := mocks.HTTPClient{} + clientMock.On("Do", mock.Anything).Return(&http.Response{ + StatusCode: http.StatusOK, + }, nil) + Client = &clientMock + + error := Put("url", "body", "admin", "pwd") + + assertions.Nil(error) + var actualRequest *http.Request + clientMock.AssertCalled(t, "Do", mock.MatchedBy(func(req *http.Request) bool { + actualRequest = req + return true + })) + assertions.Equal(http.MethodPut, actualRequest.Method) + assertions.Equal("url", actualRequest.URL.Path) + assertions.Equal("application/json; charset=utf-8", actualRequest.Header.Get("Content-Type")) + tempRequest, _ := http.NewRequest("", "", nil) + tempRequest.SetBasicAuth("admin", "pwd") + assertions.Equal(tempRequest.Header.Get("Authorization"), actualRequest.Header.Get("Authorization")) + body, _ := ioutil.ReadAll(actualRequest.Body) + expectedBody := []byte("body") + assertions.Equal(expectedBody, body) + clientMock.AssertNumberOfCalls(t, "Do", 1) +} + +func TestDelete(t *testing.T) { + assertions := require.New(t) + + clientMock := mocks.HTTPClient{} + clientMock.On("Do", mock.Anything).Return(&http.Response{ + StatusCode: http.StatusOK, + }, nil) + Client = &clientMock + + error := Delete("url") + + assertions.Nil(error) + var actualRequest *http.Request + clientMock.AssertCalled(t, "Do", mock.MatchedBy(func(req *http.Request) bool { + actualRequest = req + return true + })) + assertions.Equal(http.MethodDelete, actualRequest.Method) + assertions.Equal("url", actualRequest.URL.Path) + assertions.Empty(actualRequest.Header.Get("Content-Type")) + assertions.Empty(actualRequest.Header.Get("Authorization")) + assertions.Equal(http.NoBody, actualRequest.Body) + clientMock.AssertNumberOfCalls(t, "Do", 1) +} + +func Test_doErrorCases(t *testing.T) { + assertions := require.New(t) + + type args struct { + url string + mockReturnStatus int + mockReturnBody []byte + mockReturnError error + } + tests := []struct { + name string + args args + wantErr error + }{ + { + name: "Bad request should get RequestError", + args: args{ + url: "badRequest", + mockReturnStatus: http.StatusBadRequest, + mockReturnBody: []byte("bad request"), + mockReturnError: nil, + }, + wantErr: RequestError{ + StatusCode: http.StatusBadRequest, + Body: []byte("bad request"), + }, + }, + { + name: "Server unavailable should get error", + args: args{ + url: "serverUnavailable", + mockReturnError: fmt.Errorf("Server unavailable"), + }, + wantErr: fmt.Errorf("Server unavailable"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + clientMock := mocks.HTTPClient{} + clientMock.On("Do", mock.Anything).Return(&http.Response{ + StatusCode: tt.args.mockReturnStatus, + Body: ioutil.NopCloser(bytes.NewReader(tt.args.mockReturnBody)), + }, tt.args.mockReturnError) + Client = &clientMock + + err := do("PUT", tt.args.url, nil) + assertions.Equal(tt.wantErr, err, tt.name) + }) + } +} diff --git a/test/usecases/oruclosedlooprecovery/goversion/internal/ves/decoder.go b/test/usecases/oruclosedlooprecovery/goversion/internal/ves/decoder.go index 22936125..28ee12f6 100644 --- a/test/usecases/oruclosedlooprecovery/goversion/internal/ves/decoder.go +++ b/test/usecases/oruclosedlooprecovery/goversion/internal/ves/decoder.go @@ -22,6 +22,8 @@ package ves import ( "encoding/json" + "io" + "io/ioutil" log "github.com/sirupsen/logrus" ) @@ -40,3 +42,18 @@ func GetFaultMessages(messageStrings *[]string) []FaultMessage { } return faultMessages } + +func GetVesMessages(r io.ReadCloser) *[]string { + var messages []string + body, err := ioutil.ReadAll(r) + if err != nil { + log.Warn(err) + return nil + } + err = json.Unmarshal(body, &messages) + if err != nil { + log.Warn(err) + return nil + } + return &messages +} -- 2.16.6