"fmt"
"net/http"
"os"
- "path"
+ "strings"
"testing"
"oransc.org/nonrtric/capifcore/internal/invokermanagementapi"
"github.com/deepmap/oapi-codegen/pkg/testutil"
echomiddleware "github.com/labstack/echo/v4/middleware"
"github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/mock"
)
func TestOnboardInvoker(t *testing.T) {
- publishRegisterMock := publishmocks.PublishRegister{}
- publishRegisterMock.On("AreAPIsPublished", mock.Anything).Return(true)
- invokerUnderTest, requestHandler := getEcho(&publishRegisterMock)
-
aefProfiles := []publishserviceapi.AefProfile{
getAefProfile("aefId"),
}
apiId := "apiId"
- var apiList invokermanagementapi.APIList = []publishserviceapi.ServiceAPIDescription{
+ publishedServices := []publishserviceapi.ServiceAPIDescription{
{
ApiId: &apiId,
AefProfiles: &aefProfiles,
},
}
- newInvoker := getInvoker("invoker a", apiList)
+ publishRegisterMock := publishmocks.PublishRegister{}
+ publishRegisterMock.On("GetAllPublishedServices").Return(publishedServices)
+ invokerUnderTest, requestHandler := getEcho(&publishRegisterMock)
+
+ invokerInfo := "invoker a"
+ newInvoker := getInvoker(invokerInfo)
// Onboard a valid invoker
result := testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
var resultInvoker invokermanagementapi.APIInvokerEnrolmentDetails
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"))
- publishRegisterMock.AssertCalled(t, "AreAPIsPublished", mock.Anything)
+ assert.True(t, invokerUnderTest.IsInvokerRegistered(wantedInvokerId))
+ assert.True(t, invokerUnderTest.VerifyInvokerSecret(wantedInvokerId, wantedInvokerSecret))
+ publishRegisterMock.AssertCalled(t, "GetAllPublishedServices")
+ assert.Equal(t, invokermanagementapi.APIList(publishedServices), *resultInvoker.ApiList)
// Onboard an invoker missing required NotificationDestination, should get 400 with problem details
invalidInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
assert.NoError(t, err, "error unmarshaling response")
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{
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) {
invokerUnderTest, requestHandler := getEcho(nil)
+ invokerId := "invokerId"
newInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
+ ApiInvokerId: &invokerId,
NotificationDestination: "url",
OnboardingInformation: invokermanagementapi.OnboardingInformation{
ApiInvokerPublicKey: "key",
},
}
-
- // Onboard an invoker
- result := testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
-
- invokerUrl := result.Recorder.Header().Get(echo.HeaderLocation)
- assert.True(t, invokerUnderTest.IsInvokerRegistered(path.Base(invokerUrl)))
+ invokerUnderTest.onboardedInvokers[invokerId] = newInvoker
+ assert.True(t, invokerUnderTest.IsInvokerRegistered(invokerId))
// Delete the invoker
- result = testutil.NewRequest().Delete(invokerUrl).Go(t, requestHandler)
+ result := testutil.NewRequest().Delete("/onboardedInvokers/"+invokerId).Go(t, requestHandler)
assert.Equal(t, http.StatusNoContent, result.Code())
- assert.False(t, invokerUnderTest.IsInvokerRegistered(path.Base(invokerUrl)))
+ assert.False(t, invokerUnderTest.IsInvokerRegistered(invokerId))
}
func TestUpdateInvoker(t *testing.T) {
- _, requestHandler := getEcho(nil)
+ publishRegisterMock := publishmocks.PublishRegister{}
+ publishRegisterMock.On("GetAllPublishedServices").Return([]publishserviceapi.ServiceAPIDescription{})
+ serviceUnderTest, requestHandler := getEcho(&publishRegisterMock)
- newInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
+ invokerId := "invokerId"
+ invoker := invokermanagementapi.APIInvokerEnrolmentDetails{
+ ApiInvokerId: &invokerId,
NotificationDestination: "url",
OnboardingInformation: invokermanagementapi.OnboardingInformation{
ApiInvokerPublicKey: "key",
},
}
+ serviceUnderTest.onboardedInvokers[invokerId] = invoker
- // Onboard an invoker
- result := testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
- var resultInvoker invokermanagementapi.APIInvokerEnrolmentDetails
- result.UnmarshalBodyToObject(&resultInvoker)
-
- invokerId := resultInvoker.ApiInvokerId
- invokerUrl := result.Recorder.Header().Get(echo.HeaderLocation)
-
- // Update the invoker with valid invoker, should return 200 with invoker details
- result = testutil.NewRequest().Put(invokerUrl).WithJsonBody(resultInvoker).Go(t, requestHandler)
+ // Update the invoker with valid invoker, should return 200 with updated invoker details
+ newNotifURL := "newUrl"
+ invoker.NotificationDestination = common29122.Uri(newNotifURL)
+ newPublicKey := "newPublicKey"
+ invoker.OnboardingInformation.ApiInvokerPublicKey = newPublicKey
+ result := testutil.NewRequest().Put("/onboardedInvokers/"+invokerId).WithJsonBody(invoker).Go(t, requestHandler)
+ var resultInvoker invokermanagementapi.APIInvokerEnrolmentDetails
assert.Equal(t, http.StatusOK, result.Code())
err := result.UnmarshalBodyToObject(&resultInvoker)
assert.NoError(t, err, "error unmarshaling response")
- assert.Equal(t, invokerId, resultInvoker.ApiInvokerId)
- assert.Equal(t, newInvoker.NotificationDestination, resultInvoker.NotificationDestination)
- assert.Equal(t, newInvoker.OnboardingInformation.ApiInvokerPublicKey, resultInvoker.OnboardingInformation.ApiInvokerPublicKey)
+ assert.Equal(t, invokerId, *resultInvoker.ApiInvokerId)
+ assert.Equal(t, newNotifURL, string(resultInvoker.NotificationDestination))
+ assert.Equal(t, newPublicKey, resultInvoker.OnboardingInformation.ApiInvokerPublicKey)
// Update with an invoker missing required NotificationDestination, should get 400 with problem details
validOnboardingInfo := invokermanagementapi.OnboardingInformation{
ApiInvokerPublicKey: "key",
}
invalidInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
- ApiInvokerId: invokerId,
+ ApiInvokerId: &invokerId,
OnboardingInformation: validOnboardingInfo,
}
- result = testutil.NewRequest().Put(invokerUrl).WithJsonBody(invalidInvoker).Go(t, requestHandler)
+ result = testutil.NewRequest().Put("/onboardedInvokers/"+invokerId).WithJsonBody(invalidInvoker).Go(t, requestHandler)
assert.Equal(t, http.StatusBadRequest, result.Code())
var problemDetails common29122.ProblemDetails
assert.NoError(t, err, "error unmarshaling response")
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"
invalidInvoker.OnboardingInformation = invokermanagementapi.OnboardingInformation{}
- result = testutil.NewRequest().Put(invokerUrl).WithJsonBody(invalidInvoker).Go(t, requestHandler)
+ result = testutil.NewRequest().Put("/onboardedInvokers/"+invokerId).WithJsonBody(invalidInvoker).Go(t, requestHandler)
assert.Equal(t, http.StatusBadRequest, result.Code())
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"
invalidInvoker.ApiInvokerId = &invalidId
invalidInvoker.OnboardingInformation = validOnboardingInfo
- result = testutil.NewRequest().Put(invokerUrl).WithJsonBody(invalidInvoker).Go(t, requestHandler)
+ result = testutil.NewRequest().Put("/onboardedInvokers/"+invokerId).WithJsonBody(invalidInvoker).Go(t, requestHandler)
assert.Equal(t, http.StatusBadRequest, result.Code())
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"
- newInvoker.ApiInvokerId = &missingId
- result = testutil.NewRequest().Put("/onboardedInvokers/"+missingId).WithJsonBody(newInvoker).Go(t, requestHandler)
+ invoker.ApiInvokerId = &missingId
+ result = testutil.NewRequest().Put("/onboardedInvokers/"+missingId).WithJsonBody(invoker).Go(t, requestHandler)
assert.Equal(t, http.StatusNotFound, result.Code())
err = result.UnmarshalBodyToObject(&problemDetails)
assert.NoError(t, err, "error unmarshaling response")
notFound := http.StatusNotFound
assert.Equal(t, ¬Found, 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{
+ aefProfiles1 := []publishserviceapi.AefProfile{
getAefProfile("aefId"),
}
apiId := "apiId"
- var apiList invokermanagementapi.APIList = []publishserviceapi.ServiceAPIDescription{
+ apiList := []publishserviceapi.ServiceAPIDescription{
{
ApiId: &apiId,
- AefProfiles: &aefProfiles,
+ AefProfiles: &aefProfiles1,
},
}
- newInvoker := getInvoker("invoker a", apiList)
- testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
- aefProfiles = []publishserviceapi.AefProfile{
+ aefProfiles2 := []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_invoker_a")
+ apiList = append(apiList, publishserviceapi.ServiceAPIDescription{
+ ApiId: &apiId2,
+ AefProfiles: &aefProfiles2,
+ })
+ publishRegisterMock := publishmocks.PublishRegister{}
+ publishRegisterMock.On("GetAllPublishedServices").Return(apiList)
+ invokerUnderTest, _ := getEcho(&publishRegisterMock)
+
+ invokerInfo := "invoker a"
+ newInvoker := getInvoker(invokerInfo)
+ invokerAId := "api_invoker_id_" + strings.ReplaceAll(invokerInfo, " ", "_")
+ newInvoker.ApiInvokerId = &invokerAId
+ invokerUnderTest.onboardedInvokers[invokerAId] = newInvoker
+ invokerInfo = "invoker b"
+ newInvoker = getInvoker(invokerInfo)
+ invokerId := "api_invoker_id_" + strings.ReplaceAll(invokerInfo, " ", "_")
+ newInvoker.ApiInvokerId = &invokerId
+ invokerUnderTest.onboardedInvokers[invokerId] = newInvoker
+
+ wantedApiList := invokerUnderTest.GetInvokerApiList(invokerAId)
assert.NotNil(t, wantedApiList)
+ assert.Len(t, *wantedApiList, 2)
assert.Equal(t, apiId, *(*wantedApiList)[0].ApiId)
}
}
}
-func getInvoker(invokerInfo string, apiList invokermanagementapi.APIList) invokermanagementapi.APIInvokerEnrolmentDetails {
+func getInvoker(invokerInfo string) invokermanagementapi.APIInvokerEnrolmentDetails {
newInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
ApiInvokerInformation: &invokerInfo,
NotificationDestination: "url",
OnboardingInformation: invokermanagementapi.OnboardingInformation{
ApiInvokerPublicKey: "key",
},
- ApiList: &apiList,
+ ApiList: nil,
}
return newInvoker
}