github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/pkg/kubernetes/resources/ambassador/mapping/adapt_test.go (about)

     1  package mapping_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/caos/orbos/pkg/labels"
     7  
     8  	apixv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
     9  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    10  
    11  	"github.com/caos/orbos/mntr"
    12  	kubernetesmock "github.com/caos/orbos/pkg/kubernetes/mock"
    13  	"github.com/caos/orbos/pkg/kubernetes/resources"
    14  	"github.com/caos/orbos/pkg/kubernetes/resources/adaptertesting"
    15  	"github.com/caos/orbos/pkg/kubernetes/resources/ambassador/mapping"
    16  	"github.com/caos/orbos/pkg/labels/mocklabels"
    17  )
    18  
    19  func TestAdaptFuncToEnsure(t *testing.T) {
    20  
    21  	const (
    22  		namespace          = "test"
    23  		virtualHost        = "api.domain"
    24  		service            = "service:8080"
    25  		grpc               = true
    26  		prefix             = "/caos.zitadel.admin.api.v1.AdminService/"
    27  		rewrite            = "/caos.zitadel.admin.api.v1.AdminService/"
    28  		timeoutMS          = 30000
    29  		connectTimeoutMS   = 30000
    30  		corsOrigins        = "*"
    31  		corsMethods        = "POST, GET, OPTIONS, DELETE, PUT"
    32  		corsHeaders        = "*"
    33  		corsCredentials    = true
    34  		corsExposedHeaders = "*"
    35  		corsMaxAge         = "86400"
    36  	)
    37  	var (
    38  		monitor    = mntr.Monitor{}
    39  		nameLabels = mocklabels.Name
    40  		corsArgs   = &mapping.CORS{
    41  			Origins:        corsOrigins,
    42  			Methods:        corsMethods,
    43  			Headers:        corsHeaders,
    44  			Credentials:    corsCredentials,
    45  			ExposedHeaders: corsExposedHeaders,
    46  			MaxAge:         corsMaxAge,
    47  		}
    48  		expectFullSpec = func() map[string]interface{} {
    49  			return map[string]interface{}{
    50  				"connect_timeout_ms": timeoutMS,
    51  				"host":               virtualHost,
    52  				"prefix":             prefix,
    53  				"rewrite":            rewrite,
    54  				"service":            service,
    55  				"timeout_ms":         timeoutMS,
    56  				"cors": map[string]interface{}{
    57  					"origins":         corsOrigins,
    58  					"methods":         corsMethods,
    59  					"headers":         corsHeaders,
    60  					"credentials":     corsCredentials,
    61  					"exposed_headers": corsExposedHeaders,
    62  					"max_age":         corsMaxAge,
    63  				},
    64  				"grpc": grpc,
    65  			}
    66  		}
    67  		testAdaptFuncToEnsure = func(cors *mapping.CORS) func() (resources.QueryFunc, error) {
    68  			return func() (queryFunc resources.QueryFunc, err error) {
    69  				return mapping.AdaptFuncToEnsure(
    70  					monitor,
    71  					namespace,
    72  					nameLabels,
    73  					grpc,
    74  					virtualHost,
    75  					prefix,
    76  					rewrite,
    77  					service,
    78  					timeoutMS,
    79  					connectTimeoutMS,
    80  					cors)
    81  			}
    82  		}
    83  		expectSpec = func(spec map[string]interface{}) func(*kubernetesmock.MockClientInt) {
    84  			const (
    85  				apiGroup    = "getambassador.io"
    86  				apiVersion  = "v2"
    87  				mappingKind = "Mapping"
    88  			)
    89  
    90  			return func(k8sClient *kubernetesmock.MockClientInt) {
    91  				k8sClient.EXPECT().ApplyNamespacedCRDResource(apiGroup, apiVersion, mappingKind, namespace, nameLabels.Name(), &unstructured.Unstructured{
    92  					Object: map[string]interface{}{
    93  						"apiVersion": apiGroup + "/" + apiVersion,
    94  						"kind":       mappingKind,
    95  						"metadata": map[string]interface{}{
    96  							"labels":    labels.MustK8sMap(nameLabels),
    97  							"name":      nameLabels.Name(),
    98  							"namespace": namespace,
    99  						},
   100  						"spec": spec,
   101  					},
   102  				}).Times(1)
   103  			}
   104  		}
   105  	)
   106  
   107  	adaptertesting.RunScopes("Ambassador Mapping", []func() adaptertesting.Scope{
   108  		func() adaptertesting.Scope {
   109  			return adaptertesting.Scope{
   110  				Subscopes: nil,
   111  				Case: adaptertesting.Case{
   112  					Name:                "It should fill all the correct yaml keys with the given values",
   113  					Adapt:               testAdaptFuncToEnsure(corsArgs),
   114  					ExpectWhileQuerying: expectWhileQuerying,
   115  					ExpectWhileEnsuring: expectSpec(expectFullSpec()),
   116  					WantAdaptErr:        false,
   117  					WantQueryErr:        false,
   118  					WantEnsureErr:       false,
   119  				},
   120  			}
   121  		},
   122  		func() adaptertesting.Scope {
   123  			withoutCorsSpec := expectFullSpec()
   124  			delete(withoutCorsSpec, "cors")
   125  			return adaptertesting.Scope{
   126  				Subscopes: nil,
   127  				Case: adaptertesting.Case{
   128  					Name:                "It should omit the cors properties if cors argument is nil",
   129  					Adapt:               testAdaptFuncToEnsure(nil),
   130  					ExpectWhileQuerying: expectWhileQuerying,
   131  					ExpectWhileEnsuring: expectSpec(withoutCorsSpec),
   132  					WantAdaptErr:        false,
   133  					WantQueryErr:        false,
   134  					WantEnsureErr:       false,
   135  				},
   136  			}
   137  		},
   138  	}, t)
   139  }
   140  
   141  func expectWhileQuerying(k8sClient *kubernetesmock.MockClientInt) {
   142  	k8sClient.EXPECT().CheckCRD("mappings.getambassador.io").Times(1).Return(&apixv1beta1.CustomResourceDefinition{}, true, nil)
   143  }