[RIC-433] Add DeleteEnb to Swagger
[ric-plt/e2mgr.git] / E2Manager / controllers / nodeb_controller_test.go
index c63d36b..d128dad 100644 (file)
@@ -54,6 +54,7 @@ import (
 const (
        RanName                      = "test"
        AssociatedE2TInstanceAddress = "10.0.2.15:38000"
+       CorruptedJson                = "{\"errorCode\":401,\"errorMessage\":\"corrupted json\"}"
        ValidationFailureJson        = "{\"errorCode\":402,\"errorMessage\":\"Validation error\"}"
        ResourceNotFoundJson         = "{\"errorCode\":404,\"errorMessage\":\"Resource not found\"}"
        NodebExistsJson              = "{\"errorCode\":406,\"errorMessage\":\"Nodeb already exists\"}"
@@ -66,6 +67,7 @@ var (
        ServedNrCellInformationRequiredFields = []string{"cellId", "choiceNrMode", "nrMode", "servedPlmns"}
        NrNeighbourInformationRequiredFields  = []string{"nrCgi", "choiceNrMode", "nrMode"}
        AddEnbRequestRequiredFields           = []string{"ranName", "enb", "globalNbId"}
+       GlobalIdRequiredFields                = []string{"plmnId", "nbId"}
        EnbRequiredFields                     = []string{"enbType", "servedCells"}
        ServedCellRequiredFields              = []string{"broadcastPlmns", "cellId", "choiceEutraMode", "eutraMode", "tac"}
 )
@@ -122,6 +124,12 @@ type controllerAddEnbTestContext struct {
        expectedJsonResponse string
 }
 
+type controllerDeleteEnbTestContext struct {
+       getNodebInfoResult   *getNodebInfoResult
+       expectedStatusCode   int
+       expectedJsonResponse string
+}
+
 func generateServedNrCells(cellIds ...string) []*entities.ServedNRCell {
 
        servedNrCells := []*entities.ServedNRCell{}
@@ -203,12 +211,9 @@ func buildServedCell(propToOmit string) map[string]interface{} {
 
 func getAddEnbRequest(propToOmit string) map[string]interface{} {
        ret := map[string]interface{}{
-               "ranName": RanName,
-               "globalNbId": map[string]interface{}{
-                       "plmnId": "whatever",
-                       "nbId":   "whatever2",
-               },
-               "enb": buildEnb(""),
+               "ranName":    RanName,
+               "globalNbId": buildGlobalNbId(""),
+               "enb":        buildEnb(""),
        }
 
        if len(propToOmit) != 0 {
@@ -232,6 +237,19 @@ func buildEnb(propToOmit string) map[string]interface{} {
        return ret
 }
 
+func buildGlobalNbId(propToOmit string) map[string]interface{} {
+       ret := map[string]interface{}{
+               "plmnId": "whatever",
+               "nbId":   "whatever2",
+       }
+
+       if len(propToOmit) != 0 {
+               delete(ret, propToOmit)
+       }
+
+       return ret
+}
+
 func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock) {
        log := initLog(t)
        config := configuration.ParseConfiguration()
@@ -250,7 +268,9 @@ func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock,
        ranAlarmService := &mocks.RanAlarmServiceMock{}
        ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
        nodebValidator := managers.NewNodebValidator()
-       handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator)
+       updateEnbManager := managers.NewUpdateEnbManager(log, rnibDataService, nodebValidator)
+
+       handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator, updateEnbManager)
        controller := NewNodebController(log, handlerProvider)
        return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager
 }
@@ -360,6 +380,14 @@ func assertControllerAddEnb(t *testing.T, context *controllerAddEnbTestContext,
        writerMock.AssertExpectations(t)
 }
 
+func assertControllerDeleteEnb(t *testing.T, context *controllerDeleteEnbTestContext, writer *httptest.ResponseRecorder, readerMock *mocks.RnibReaderMock, writerMock *mocks.RnibWriterMock) {
+       assert.Equal(t, context.expectedStatusCode, writer.Result().StatusCode)
+       bodyBytes, _ := ioutil.ReadAll(writer.Body)
+       assert.Equal(t, context.expectedJsonResponse, string(bodyBytes))
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+}
+
 func buildUpdateGnbRequest(context *controllerUpdateGnbTestContext) *http.Request {
        updateGnbUrl := fmt.Sprintf("/nodeb/%s/update", RanName)
        requestBody := getJsonRequestAsBuffer(context.requestBody)
@@ -396,6 +424,7 @@ func activateControllerAddEnbMocks(context *controllerAddEnbTestContext, readerM
                        RanName:          addEnbRequest.RanName,
                        Ip:               addEnbRequest.Ip,
                        Port:             addEnbRequest.Port,
+                       NodeType:         entities.Node_ENB,
                        GlobalNbId:       addEnbRequest.GlobalNbId,
                        Configuration:    &entities.NodebInfo_Enb{Enb: addEnbRequest.Enb},
                        ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,
@@ -423,6 +452,20 @@ func controllerAddEnbTestExecuter(t *testing.T, context *controllerAddEnbTestCon
        assertControllerAddEnb(t, context, writer, readerMock, writerMock)
 }
 
+func controllerDeleteEnbTestExecuter(t *testing.T, context *controllerDeleteEnbTestContext) {
+       controller, readerMock, writerMock, _, _ := setupControllerTest(t)
+       readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
+       if context.getNodebInfoResult.rnibError == nil && context.getNodebInfoResult.nodebInfo.GetNodeType() == entities.Node_ENB {
+               writerMock.On("RemoveEnb", context.getNodebInfoResult.nodebInfo).Return(nil)
+       }
+       writer := httptest.NewRecorder()
+       r, _ := http.NewRequest(http.MethodDelete, AddEnbUrl+"/"+RanName, nil)
+       r.Header.Set("Content-Type", "application/json")
+       r = mux.SetURLVars(r, map[string]string{"ranName": RanName})
+       controller.DeleteEnb(writer, r)
+       assertControllerDeleteEnb(t, context, writer, readerMock, writerMock)
+}
+
 func TestControllerUpdateGnbEmptyServedNrCells(t *testing.T) {
        context := controllerUpdateGnbTestContext{
                getNodebInfoResult: nil,
@@ -767,6 +810,38 @@ func TestControllerAddEnbMissingRequiredRequestProps(t *testing.T) {
        }
 }
 
+func TestControllerAddEnbInvalidRequest(t *testing.T) {
+       controller, _, _, _, _ := setupControllerTest(t)
+       writer := httptest.NewRecorder()
+
+       // Invalid json: attribute name without quotes (should be "cause":).
+       invalidJson := strings.NewReader("{ranName:\"whatever\"")
+       req, _ := http.NewRequest(http.MethodPost, AddEnbUrl, invalidJson)
+
+       controller.AddEnb(writer, req)
+       assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
+       bodyBytes, _ := ioutil.ReadAll(writer.Body)
+       assert.Equal(t, CorruptedJson, string(bodyBytes))
+
+}
+
+func TestControllerAddEnbMissingRequiredGlobalNbIdProps(t *testing.T) {
+
+       r := getAddEnbRequest("")
+
+       for _, v := range GlobalIdRequiredFields {
+               r["globalNbId"] = buildGlobalNbId(v)
+
+               context := controllerAddEnbTestContext{
+                       requestBody:          r,
+                       expectedStatusCode:   http.StatusBadRequest,
+                       expectedJsonResponse: ValidationFailureJson,
+               }
+
+               controllerAddEnbTestExecuter(t, &context)
+       }
+}
+
 func TestControllerAddEnbMissingRequiredEnbProps(t *testing.T) {
 
        r := getAddEnbRequest("")
@@ -830,12 +905,63 @@ func TestControllerAddEnbSuccess(t *testing.T) {
                        },
                },
                expectedStatusCode:   http.StatusCreated,
-               expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"DISCONNECTED\",\"globalNbId\":{\"plmnId\":\"whatever\",\"nbId\":\"whatever2\"},\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]}}",
+               expectedJsonResponse: "{\"ranName\":\"test\",\"connectionStatus\":\"DISCONNECTED\",\"globalNbId\":{\"plmnId\":\"whatever\",\"nbId\":\"whatever2\"},\"nodeType\":\"ENB\",\"enb\":{\"enbType\":\"MACRO_ENB\",\"servedCells\":[{\"pci\":1,\"cellId\":\"whatever\",\"tac\":\"whatever3\",\"broadcastPlmns\":[\"whatever\"],\"choiceEutraMode\":{\"fdd\":{}},\"eutraMode\":\"FDD\"}]}}",
        }
 
        controllerAddEnbTestExecuter(t, &context)
 }
 
+func TestControllerDeleteEnbGetNodebInternalError(t *testing.T) {
+       context := controllerDeleteEnbTestContext{
+               getNodebInfoResult: &getNodebInfoResult{
+                       nodebInfo: nil,
+                       rnibError: common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")),
+               },
+               expectedStatusCode: http.StatusInternalServerError,
+               expectedJsonResponse: RnibErrorJson,
+       }
+
+       controllerDeleteEnbTestExecuter(t, &context)
+}
+
+func TestControllerDeleteEnbNodebNotExistsFailure(t *testing.T) {
+       context := controllerDeleteEnbTestContext{
+               getNodebInfoResult: &getNodebInfoResult{
+                       nodebInfo: nil,
+                       rnibError: common.NewResourceNotFoundError("#reader.GetNodeb - Not found"),
+               },
+               expectedStatusCode:   http.StatusNotFound,
+               expectedJsonResponse: ResourceNotFoundJson,
+       }
+
+       controllerDeleteEnbTestExecuter(t, &context)
+}
+
+func TestControllerDeleteEnbNodebNotEnb(t *testing.T) {
+       context := controllerDeleteEnbTestContext{
+               getNodebInfoResult: &getNodebInfoResult{
+                       nodebInfo: &entities.NodebInfo{RanName: "ran1", NodeType: entities.Node_GNB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
+                       rnibError: nil,
+               },
+               expectedStatusCode:   http.StatusBadRequest,
+               expectedJsonResponse: ValidationFailureJson,
+       }
+
+       controllerDeleteEnbTestExecuter(t, &context)
+}
+
+func TestControllerDeleteEnbSuccess(t *testing.T) {
+       context := controllerDeleteEnbTestContext{
+               getNodebInfoResult: &getNodebInfoResult{
+                       nodebInfo: &entities.NodebInfo{RanName: "ran1", NodeType: entities.Node_ENB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
+                       rnibError: nil,
+               },
+               expectedStatusCode: http.StatusNoContent,
+               expectedJsonResponse: "",
+       }
+       controllerDeleteEnbTestExecuter(t, &context)
+}
+
 func getJsonRequestAsBuffer(requestJson map[string]interface{}) *bytes.Buffer {
        b := new(bytes.Buffer)
        _ = json.NewEncoder(b).Encode(requestJson)
@@ -904,7 +1030,7 @@ func TestControllerGetNodebIdListSuccess(t *testing.T) {
 
 func TestControllerGetNodebIdListEmptySuccess(t *testing.T) {
        var rnibError error
-       nodebIdList := []*entities.NbIdentity{}
+       var nodebIdList []*entities.NbIdentity
 
        context := controllerGetNodebIdListTestContext{
                nodebIdList:          nodebIdList,