diff --git a/api/testutils/kusttest/harnessenhanced.go b/api/testutils/kusttest/harnessenhanced.go index 0f6c93a94..4fb3ac6fa 100644 --- a/api/testutils/kusttest/harnessenhanced.go +++ b/api/testutils/kusttest/harnessenhanced.go @@ -4,6 +4,9 @@ package kusttest_test import ( + "bytes" + "fmt" + "strconv" "testing" "sigs.k8s.io/kustomize/api/filesys" @@ -16,6 +19,8 @@ import ( "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" valtest_test "sigs.k8s.io/kustomize/api/testutils/valtest" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" ) // HarnessEnhanced manages a full plugin environment for tests. @@ -109,12 +114,69 @@ func (th *HarnessEnhanced) LoadAndRunTransformer( return resMap } +func (th *HarnessEnhanced) RunTransformerAndCheckResult( + config, input, expected string) { + for _, b := range []bool{true, false} { + th.t.Run(fmt.Sprintf("yaml-%v", b), func(t *testing.T) { + c, err := toggleYamlSupportField(config, b) + if err != nil { + th.t.Fatalf("Err: %v", err) + } + resMap, err := th.RunTransformer(c, input) + if err != nil { + th.t.Fatalf("Err: %v", err) + } + th.AssertActualEqualsExpected(resMap, expected) + }) + } +} + +func toggleYamlSupportField(config string, yamlSupport bool) (string, error) { + var out bytes.Buffer + rw := kio.ByteReadWriter{ + Reader: bytes.NewBufferString(config), + Writer: &out, + } + + err := kio.Pipeline{ + Inputs: []kio.Reader{&rw}, + Filters: []kio.Filter{ + kio.FilterAll(yaml.FilterFunc( + func(node *yaml.RNode) (*yaml.RNode, error) { + return node.Pipe(yaml.FieldSetter{ + Name: "yamlSupport", + StringValue: strconv.FormatBool(yamlSupport), + }) + }), + ), + }, + Outputs: []kio.Writer{&rw}, + }.Execute() + return out.String(), err +} + func (th *HarnessEnhanced) ErrorFromLoadAndRunTransformer( config, input string) error { _, err := th.RunTransformer(config, input) return err } +type AssertFunc func(t *testing.T, err error) + +func (th *HarnessEnhanced) RunTransformerAndCheckError( + config, input string, assertFn AssertFunc) { + for _, b := range []bool{true, false} { + th.t.Run(fmt.Sprintf("yaml-%v", b), func(t *testing.T) { + c, err := toggleYamlSupportField(config, b) + if err != nil { + th.t.Fatalf("Err: %v", err) + } + _, err = th.RunTransformer(c, input) + assertFn(t, err) + }) + } +} + func (th *HarnessEnhanced) RunTransformer( config, input string) (resmap.ResMap, error) { resMap, err := th.rf.NewResMapFromBytes([]byte(input)) diff --git a/plugin/builtin/annotationstransformer/AnnotationsTransformer_test.go b/plugin/builtin/annotationstransformer/AnnotationsTransformer_test.go index fb26c6ca1..8c35f74a7 100644 --- a/plugin/builtin/annotationstransformer/AnnotationsTransformer_test.go +++ b/plugin/builtin/annotationstransformer/AnnotationsTransformer_test.go @@ -4,7 +4,6 @@ package main_test import ( - "fmt" "testing" kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" @@ -19,7 +18,6 @@ metadata: annotations: app: myApp greeting/morning: a string with blanks -yamlSupport: %v fieldSpecs: - path: metadata/annotations create: true @@ -48,16 +46,9 @@ spec: ) func TestAnnotationsTransformer(t *testing.T) { - for _, b := range []bool{true, false} { - t.Run(fmt.Sprintf("yaml-%v", b), func(t *testing.T) { - th := kusttest_test.MakeEnhancedHarness(t). - PrepBuiltin("AnnotationsTransformer") - defer th.Reset() + th := kusttest_test.MakeEnhancedHarness(t). + PrepBuiltin("AnnotationsTransformer") + defer th.Reset() - cfg := fmt.Sprintf(config, b) - rm := th.LoadAndRunTransformer(cfg, input) - - th.AssertActualEqualsExpected(rm, expectedOutput) - }) - } + th.RunTransformerAndCheckResult(config, input, expectedOutput) } diff --git a/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go b/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go index a31a1b318..1b57ed1bf 100644 --- a/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go +++ b/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go @@ -4,7 +4,6 @@ package main_test import ( - "fmt" "strings" "testing" @@ -12,18 +11,15 @@ import ( ) func TestNamespaceTransformer1(t *testing.T) { - for _, b := range []bool{true, false} { - t.Run(fmt.Sprintf("yaml-%v", b), func(t *testing.T) { - th := kusttest_test.MakeEnhancedHarness(t). - PrepBuiltin("NamespaceTransformer") - defer th.Reset() - rm := th.LoadAndRunTransformer(fmt.Sprintf(` + th := kusttest_test.MakeEnhancedHarness(t). + PrepBuiltin("NamespaceTransformer") + defer th.Reset() + th.RunTransformerAndCheckResult(` apiVersion: builtin kind: NamespaceTransformer metadata: name: notImportantHere namespace: test -yamlSupport: %v fieldSpecs: - path: metadata/namespace create: true @@ -33,7 +29,7 @@ fieldSpecs: - path: subjects kind: ClusterRoleBinding group: rbac.authorization.k8s.io -`, b), ` +`, ` apiVersion: v1 kind: ConfigMap metadata: @@ -102,18 +98,17 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: crd -`) - - // Import note: The namespace transformer is in charge of - // the metadata.namespace field. The namespace transformer SHOULD - // NOT modify neither the "namespace" subfield within the - // ClusterRoleBinding.subjects field nor the "namespace" - // subfield in the ValidatingWebhookConfiguration.webhooks field. - // This is the role of the namereference Transformer to handle - // object reference changes (prefix/suffix and namespace). - // For use cases involving simultaneous change of name and namespace, - // refer to namespaces tests in pkg/target test suites. - th.AssertActualEqualsExpected(rm, ` +`, +// Import note: The namespace transformer is in charge of +// the metadata.namespace field. The namespace transformer SHOULD +// NOT modify neither the "namespace" subfield within the +// ClusterRoleBinding.subjects field nor the "namespace" +// subfield in the ValidatingWebhookConfiguration.webhooks field. +// This is the role of the namereference Transformer to handle +// object reference changes (prefix/suffix and namespace). +// For use cases involving simultaneous change of name and namespace, +// refer to namespaces tests in pkg/target test suites. +` apiVersion: v1 kind: ConfigMap metadata: @@ -185,18 +180,14 @@ kind: CustomResourceDefinition metadata: name: crd `) - }) - } } func TestNamespaceTransformerClusterLevelKinds(t *testing.T) { - for _, b := range []bool{true, false} { - t.Run(fmt.Sprintf("yaml-%v", b), func(t *testing.T) { - th := kusttest_test.MakeEnhancedHarness(t). - PrepBuiltin("NamespaceTransformer") - defer th.Reset() + th := kusttest_test.MakeEnhancedHarness(t). + PrepBuiltin("NamespaceTransformer") + defer th.Reset() - const noChangeExpected = ` + const noChangeExpected = ` apiVersion: v1 kind: Namespace metadata: @@ -218,13 +209,13 @@ kind: PersistentVolume metadata: name: pv1 ` - rm := th.LoadAndRunTransformer(fmt.Sprintf(` + + th.RunTransformerAndCheckResult(` apiVersion: builtin kind: NamespaceTransformer metadata: name: notImportantHere namespace: test -yamlSupport: %v fieldSpecs: - path: metadata/namespace create: true @@ -234,32 +225,24 @@ fieldSpecs: - path: subjects kind: ClusterRoleBinding group: rbac.authorization.k8s.io -`, b), noChangeExpected) - - th.AssertActualEqualsExpected(rm, noChangeExpected) - }) - } +`, noChangeExpected, noChangeExpected) } func TestNamespaceTransformerObjectConflict(t *testing.T) { - for _, b := range []bool{true, false} { - t.Run(fmt.Sprintf("yaml-%v", b), func(t *testing.T) { + th := kusttest_test.MakeEnhancedHarness(t). + PrepBuiltin("NamespaceTransformer") + defer th.Reset() - th := kusttest_test.MakeEnhancedHarness(t). - PrepBuiltin("NamespaceTransformer") - defer th.Reset() - - err := th.ErrorFromLoadAndRunTransformer(fmt.Sprintf(` + th.RunTransformerAndCheckError(` apiVersion: builtin kind: NamespaceTransformer metadata: name: notImportantHere namespace: test -yamlSupport: %v fieldSpecs: - path: metadata/namespace create: true -`, b), ` +`, ` apiVersion: v1 kind: ConfigMap metadata: @@ -271,14 +254,13 @@ kind: ConfigMap metadata: name: cm namespace: bar -`) - - if err == nil { - t.Fatal("expected error") - } - if !strings.Contains(err.Error(), "ID conflict") { - t.Fatalf("unexpected error: %s", err.Error()) - } - }) - } +`, + func(t *testing.T, err error) { + if err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "ID conflict") { + t.Fatalf("unexpected error: %s", err.Error()) + } + }) }