Improve error messages and tests
[nonrtric/plt/sme.git] / capifcore / internal / invokermanagement / invokermanagement_test.go
index 63f7509..365a7d0 100644 (file)
@@ -23,6 +23,8 @@ import (
        "fmt"
        "net/http"
        "os"
+       "path"
+       "strings"
        "testing"
 
        "oransc.org/nonrtric/capifcore/internal/invokermanagementapi"
@@ -43,70 +45,40 @@ import (
 )
 
 func TestOnboardInvoker(t *testing.T) {
-       var err error
+       publishRegisterMock := publishmocks.PublishRegister{}
+       publishRegisterMock.On("AreAPIsPublished", mock.Anything).Return(true)
+       invokerUnderTest, requestHandler := getEcho(&publishRegisterMock)
+
+       aefProfiles := []publishserviceapi.AefProfile{
+               getAefProfile("aefId"),
+       }
        apiId := "apiId"
-       aefId := "aefId"
-       apiRegisterMock := publishmocks.APIRegister{}
-       apiRegisterMock.On("AreAPIsRegistered", mock.Anything).Return(true)
-       invokerUnderTest, requestHandler := getEcho(&apiRegisterMock)
-
-       description := "description"
-       domainName := "domain"
-       var protocol publishserviceapi.Protocol = "HTTP_1_1"
        var apiList invokermanagementapi.APIList = []publishserviceapi.ServiceAPIDescription{
                {
                        ApiId:       &apiId,
-                       ApiName:     "api",
-                       Description: &description,
-                       AefProfiles: &[]publishserviceapi.AefProfile{
-                               {
-                                       AefId:      aefId,
-                                       DomainName: &domainName,
-                                       Protocol:   &protocol,
-                                       Versions: []publishserviceapi.Version{
-                                               {
-                                                       ApiVersion: "v1",
-                                                       Resources: &[]publishserviceapi.Resource{
-                                                               {
-                                                                       ResourceName: "app",
-                                                                       CommType:     "REQUEST_RESPONSE",
-                                                                       Uri:          "uri",
-                                                                       Operations: &[]publishserviceapi.Operation{
-                                                                               "POST",
-                                                                       },
-                                                               },
-                                                       },
-                                               },
-                                       },
-                               },
-                       },
+                       AefProfiles: &aefProfiles,
                },
        }
        invokerInfo := "invoker a"
-       newInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
-               ApiInvokerInformation:   &invokerInfo,
-               NotificationDestination: "url",
-               OnboardingInformation: invokermanagementapi.OnboardingInformation{
-                       ApiInvokerPublicKey: "key",
-               },
-               ApiList: &apiList,
-       }
+       newInvoker := getInvoker(invokerInfo, apiList)
 
        // Onboard a valid invoker
        result := testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
 
        assert.Equal(t, http.StatusCreated, result.Code())
        var resultInvoker invokermanagementapi.APIInvokerEnrolmentDetails
-       err = result.UnmarshalBodyToObject(&resultInvoker)
+       err := result.UnmarshalBodyToObject(&resultInvoker)
        assert.NoError(t, err, "error unmarshaling response")
-       assert.Equal(t, "api_invoker_id_invoker_a", *resultInvoker.ApiInvokerId)
+       wantedInvokerId := "api_invoker_id_" + strings.Replace(invokerInfo, " ", "_", 1)
+       assert.Equal(t, wantedInvokerId, *resultInvoker.ApiInvokerId)
        assert.Equal(t, newInvoker.NotificationDestination, resultInvoker.NotificationDestination)
        assert.Equal(t, newInvoker.OnboardingInformation.ApiInvokerPublicKey, resultInvoker.OnboardingInformation.ApiInvokerPublicKey)
-       assert.Equal(t, "onboarding_secret_invoker_a", *resultInvoker.OnboardingInformation.OnboardingSecret)
+       wantedInvokerSecret := "onboarding_secret_" + strings.Replace(invokerInfo, " ", "_", 1)
+       assert.Equal(t, wantedInvokerSecret, *resultInvoker.OnboardingInformation.OnboardingSecret)
        assert.Equal(t, "http://example.com/onboardedInvokers/"+*resultInvoker.ApiInvokerId, result.Recorder.Header().Get(echo.HeaderLocation))
-       assert.True(t, invokerUnderTest.IsInvokerRegistered("api_invoker_id_invoker_a"))
-       assert.True(t, invokerUnderTest.VerifyInvokerSecret("api_invoker_id_invoker_a", "onboarding_secret_invoker_a"))
-       apiRegisterMock.AssertCalled(t, "AreAPIsRegistered", mock.Anything)
+       assert.True(t, invokerUnderTest.IsInvokerRegistered(wantedInvokerId))
+       assert.True(t, invokerUnderTest.VerifyInvokerSecret(wantedInvokerId, wantedInvokerSecret))
+       publishRegisterMock.AssertCalled(t, "AreAPIsPublished", mock.Anything)
 
        // Onboard an invoker missing required NotificationDestination, should get 400 with problem details
        invalidInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
@@ -120,10 +92,10 @@ func TestOnboardInvoker(t *testing.T) {
        var problemDetails common29122.ProblemDetails
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       badRequest := 400
+       badRequest := http.StatusBadRequest
        assert.Equal(t, &badRequest, problemDetails.Status)
-       errMsg := "Invoker missing required NotificationDestination"
-       assert.Equal(t, &errMsg, problemDetails.Cause)
+       assert.Contains(t, *problemDetails.Cause, "missing")
+       assert.Contains(t, *problemDetails.Cause, "NotificationDestination")
 
        // Onboard an invoker missing required OnboardingInformation.ApiInvokerPublicKey, should get 400 with problem details
        invalidInvoker = invokermanagementapi.APIInvokerEnrolmentDetails{
@@ -136,12 +108,12 @@ func TestOnboardInvoker(t *testing.T) {
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
        assert.Equal(t, &badRequest, problemDetails.Status)
-       errMsg = "Invoker missing required OnboardingInformation.ApiInvokerPublicKey"
-       assert.Equal(t, &errMsg, problemDetails.Cause)
+       assert.Contains(t, *problemDetails.Cause, "missing")
+       assert.Contains(t, *problemDetails.Cause, "OnboardingInformation.ApiInvokerPublicKey")
 }
 
 func TestDeleteInvoker(t *testing.T) {
-       _, requestHandler := getEcho(nil)
+       invokerUnderTest, requestHandler := getEcho(nil)
 
        newInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
                NotificationDestination: "url",
@@ -152,15 +124,15 @@ func TestDeleteInvoker(t *testing.T) {
 
        // Onboard an invoker
        result := testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
-       var resultInvoker invokermanagementapi.APIInvokerEnrolmentDetails
-       result.UnmarshalBodyToObject(&resultInvoker)
 
        invokerUrl := result.Recorder.Header().Get(echo.HeaderLocation)
+       assert.True(t, invokerUnderTest.IsInvokerRegistered(path.Base(invokerUrl)))
 
        // Delete the invoker
        result = testutil.NewRequest().Delete(invokerUrl).Go(t, requestHandler)
 
        assert.Equal(t, http.StatusNoContent, result.Code())
+       assert.False(t, invokerUnderTest.IsInvokerRegistered(path.Base(invokerUrl)))
 }
 
 func TestUpdateInvoker(t *testing.T) {
@@ -205,10 +177,10 @@ func TestUpdateInvoker(t *testing.T) {
        var problemDetails common29122.ProblemDetails
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       badRequest := 400
+       badRequest := http.StatusBadRequest
        assert.Equal(t, &badRequest, problemDetails.Status)
-       errMsg := "Invoker missing required NotificationDestination"
-       assert.Equal(t, &errMsg, problemDetails.Cause)
+       assert.Contains(t, *problemDetails.Cause, "missing")
+       assert.Contains(t, *problemDetails.Cause, "NotificationDestination")
 
        // Update with an invoker missing required OnboardingInformation.ApiInvokerPublicKey, should get 400 with problem details
        invalidInvoker.NotificationDestination = "url"
@@ -219,8 +191,8 @@ func TestUpdateInvoker(t *testing.T) {
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
        assert.Equal(t, &badRequest, problemDetails.Status)
-       errMsg = "Invoker missing required OnboardingInformation.ApiInvokerPublicKey"
-       assert.Equal(t, &errMsg, problemDetails.Cause)
+       assert.Contains(t, *problemDetails.Cause, "missing")
+       assert.Contains(t, *problemDetails.Cause, "OnboardingInformation.ApiInvokerPublicKey")
 
        // Update with an invoker with other ApiInvokerId than the one provided in the URL, should get 400 with problem details
        invalidId := "1"
@@ -232,8 +204,8 @@ func TestUpdateInvoker(t *testing.T) {
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
        assert.Equal(t, &badRequest, problemDetails.Status)
-       errMsg = "Invoker ApiInvokerId not matching"
-       assert.Equal(t, &errMsg, problemDetails.Cause)
+       assert.Contains(t, *problemDetails.Cause, "not matching")
+       assert.Contains(t, *problemDetails.Cause, "ApiInvokerId")
 
        // Update an invoker that has not been onboarded, shold get 404 with problem details
        missingId := "1"
@@ -243,14 +215,50 @@ func TestUpdateInvoker(t *testing.T) {
        assert.Equal(t, http.StatusNotFound, result.Code())
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       notFound := 404
+       notFound := http.StatusNotFound
        assert.Equal(t, &notFound, problemDetails.Status)
-       errMsg = "The invoker to update has not been onboarded"
-       assert.Equal(t, &errMsg, problemDetails.Cause)
+       assert.Contains(t, *problemDetails.Cause, "not been onboarded")
+       assert.Contains(t, *problemDetails.Cause, "invoker")
+}
+
+func TestGetInvokerApiList(t *testing.T) {
+       publishRegisterMock := publishmocks.PublishRegister{}
+       publishRegisterMock.On("AreAPIsPublished", mock.Anything).Return(true)
+       invokerUnderTest, requestHandler := getEcho(&publishRegisterMock)
 
+       // Onboard two invokers
+       aefProfiles := []publishserviceapi.AefProfile{
+               getAefProfile("aefId"),
+       }
+       apiId := "apiId"
+       var apiList invokermanagementapi.APIList = []publishserviceapi.ServiceAPIDescription{
+               {
+                       ApiId:       &apiId,
+                       AefProfiles: &aefProfiles,
+               },
+       }
+       invokerInfo := "invoker a"
+       newInvoker := getInvoker(invokerInfo, apiList)
+       testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
+       aefProfiles = []publishserviceapi.AefProfile{
+               getAefProfile("aefId2"),
+       }
+       apiId2 := "apiId2"
+       apiList = []publishserviceapi.ServiceAPIDescription{
+               {
+                       ApiId:       &apiId2,
+                       AefProfiles: &aefProfiles,
+               },
+       }
+       newInvoker = getInvoker("invoker b", apiList)
+       testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
+
+       wantedApiList := invokerUnderTest.GetInvokerApiList("api_invoker_id_" + strings.Replace(invokerInfo, " ", "_", 1))
+       assert.NotNil(t, wantedApiList)
+       assert.Equal(t, apiId, *(*wantedApiList)[0].ApiId)
 }
 
-func getEcho(apiRegister publishservice.APIRegister) (*InvokerManager, *echo.Echo) {
+func getEcho(publishRegister publishservice.PublishRegister) (*InvokerManager, *echo.Echo) {
        swagger, err := invokermanagementapi.GetSwagger()
        if err != nil {
                fmt.Fprintf(os.Stderr, "Error loading swagger spec\n: %s", err)
@@ -259,7 +267,7 @@ func getEcho(apiRegister publishservice.APIRegister) (*InvokerManager, *echo.Ech
 
        swagger.Servers = nil
 
-       im := NewInvokerManager(apiRegister)
+       im := NewInvokerManager(publishRegister)
 
        e := echo.New()
        e.Use(echomiddleware.Logger())
@@ -268,3 +276,30 @@ func getEcho(apiRegister publishservice.APIRegister) (*InvokerManager, *echo.Ech
        invokermanagementapi.RegisterHandlers(e, im)
        return im, e
 }
+
+func getAefProfile(aefId string) publishserviceapi.AefProfile {
+       return publishserviceapi.AefProfile{
+               AefId: aefId,
+               Versions: []publishserviceapi.Version{
+                       {
+                               Resources: &[]publishserviceapi.Resource{
+                                       {
+                                               CommType: "REQUEST_RESPONSE",
+                                       },
+                               },
+                       },
+               },
+       }
+}
+
+func getInvoker(invokerInfo string, apiList invokermanagementapi.APIList) invokermanagementapi.APIInvokerEnrolmentDetails {
+       newInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
+               ApiInvokerInformation:   &invokerInfo,
+               NotificationDestination: "url",
+               OnboardingInformation: invokermanagementapi.OnboardingInformation{
+                       ApiInvokerPublicKey: "key",
+               },
+               ApiList: &apiList,
+       }
+       return newInvoker
+}