NONRTRIC-946: Add support for Kong routes
[nonrtric/plt/sme.git] / servicemanager / main_test.go
diff --git a/servicemanager/main_test.go b/servicemanager/main_test.go
new file mode 100644 (file)
index 0000000..0f6e4cd
--- /dev/null
@@ -0,0 +1,186 @@
+// -
+//   ========================LICENSE_START=================================
+//   O-RAN-SC
+//   %%
+//   Copyright (C) 2023-2024: OpenInfra Foundation Europe
+//   %%
+//   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 main
+
+import (
+       "net/http"
+       "os"
+       "testing"
+
+       "github.com/deepmap/oapi-codegen/pkg/testutil"
+       "github.com/getkin/kin-openapi/openapi3"
+       "github.com/labstack/echo/v4"
+       "github.com/stretchr/testify/assert"
+       log "github.com/sirupsen/logrus"
+
+       "oransc.org/nonrtric/servicemanager/internal/common29122"
+       "oransc.org/nonrtric/servicemanager/internal/envreader"
+)
+
+var e *echo.Echo
+var myPorts map [string]int
+
+func TestMain(m *testing.M) {
+    // Init code to run before tests
+       myEnv, myPorts, err := envreader.ReadDotEnv()
+       if err != nil {
+               log.Fatal("error loading environment file")
+               return
+       }
+
+       e, err = getEcho(myEnv, myPorts)
+       if err != nil {
+               log.Fatal("getEcho fatal error")
+               return
+       }
+    
+    // Run tests
+    exitVal := m.Run()
+    
+    // Finalization code to run after tests
+
+    // Exit with exit value from tests
+    os.Exit(exitVal)
+}
+
+
+func Test_routing(t *testing.T) {
+       type args struct {
+               url          string
+               returnStatus int
+               method       string
+       }
+       tests := []struct {
+               name string
+               args args
+       }{
+               {
+                       name: "Default path",
+                       args: args{
+                               url:          "/",
+                               returnStatus: http.StatusOK,
+                               method:       "GET",
+                       },
+               },
+               {
+                       name: "Provider path",
+                       args: args{
+                               url:          "/api-provider-management/v1/registrations/provider",
+                               returnStatus: http.StatusNoContent,
+                               method:       "DELETE",
+                       },
+               },
+               {
+                       name: "Publish path",
+                       args: args{
+                               url:          "/published-apis/v1/apfId/service-apis/serviceId",
+                               returnStatus: http.StatusNotFound,
+                               method:       "GET",
+                       },
+               },
+               {
+                       name: "Discover path",
+                       args: args{
+                               url:          "/service-apis/v1/allServiceAPIs?api-invoker-id=api_invoker_id",
+                               returnStatus: http.StatusNotFound,
+                               method:       "GET",
+                       },
+               },
+               {
+                       name: "Invoker path",
+                       args: args{
+                               url:          "/api-invoker-management/v1/onboardedInvokers/invoker",
+                               returnStatus: http.StatusNoContent,
+                               method:       "DELETE",
+                       },
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       var result *testutil.CompletedRequest
+                       if tt.args.method == "GET" {
+                               result = testutil.NewRequest().Get(tt.args.url).Go(t, e)
+                       } else if tt.args.method == "DELETE" {
+                               result = testutil.NewRequest().Delete(tt.args.url).Go(t, e)
+                       }
+
+                       assert.Equal(t, tt.args.returnStatus, result.Code(), tt.name)
+               })
+       }
+}
+
+func TestGetSwagger(t *testing.T) {
+       type args struct {
+               apiPath string
+               apiName string
+       }
+       tests := []struct {
+               name string
+               args args
+       }{
+               {
+                       name: "Provider api",
+                       args: args{
+                               apiPath: "provider",
+                               apiName: "Provider",
+                       },
+               },
+               {
+                       name: "Publish api",
+                       args: args{
+                               apiPath: "publish",
+                               apiName: "Publish",
+                       },
+               },
+               {
+                       name: "Invoker api",
+                       args: args{
+                               apiPath: "invoker",
+                               apiName: "Invoker",
+                       },
+               },
+               {
+                       name: "Discover api",
+                       args: args{
+                               apiPath: "discover",
+                               apiName: "Discover",
+                       },
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       result := testutil.NewRequest().Get("/swagger/"+tt.args.apiPath).Go(t, e)
+                       assert.Equal(t, http.StatusOK, result.Code())
+                       var swaggerResponse openapi3.T
+                       err := result.UnmarshalJsonToObject(&swaggerResponse)
+                       assert.Nil(t, err)
+                       assert.Contains(t, swaggerResponse.Info.Title, tt.args.apiName)
+               })
+       }
+       invalidApi := "foobar"
+       result := testutil.NewRequest().Get("/swagger/"+invalidApi).Go(t, e)
+       assert.Equal(t, http.StatusBadRequest, result.Code())
+       var errorResponse common29122.ProblemDetails
+       err := result.UnmarshalJsonToObject(&errorResponse)
+       assert.Nil(t, err)
+       assert.Contains(t, *errorResponse.Cause, "Invalid API")
+       assert.Contains(t, *errorResponse.Cause, invalidApi)
+}
\ No newline at end of file