Merge pull request #2324 from mortent/BetterTransformerTesting

Better support for testing tranformers with kyaml support
This commit is contained in:
Jeff Regan
2020-04-03 08:28:29 -07:00
committed by GitHub
3 changed files with 103 additions and 68 deletions

View File

@@ -4,6 +4,9 @@
package kusttest_test package kusttest_test
import ( import (
"bytes"
"fmt"
"strconv"
"testing" "testing"
"sigs.k8s.io/kustomize/api/filesys" "sigs.k8s.io/kustomize/api/filesys"
@@ -16,6 +19,8 @@ import (
"sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resmap"
"sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/resource"
valtest_test "sigs.k8s.io/kustomize/api/testutils/valtest" 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. // HarnessEnhanced manages a full plugin environment for tests.
@@ -109,12 +114,69 @@ func (th *HarnessEnhanced) LoadAndRunTransformer(
return resMap 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( func (th *HarnessEnhanced) ErrorFromLoadAndRunTransformer(
config, input string) error { config, input string) error {
_, err := th.RunTransformer(config, input) _, err := th.RunTransformer(config, input)
return err 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( func (th *HarnessEnhanced) RunTransformer(
config, input string) (resmap.ResMap, error) { config, input string) (resmap.ResMap, error) {
resMap, err := th.rf.NewResMapFromBytes([]byte(input)) resMap, err := th.rf.NewResMapFromBytes([]byte(input))

View File

@@ -4,7 +4,6 @@
package main_test package main_test
import ( import (
"fmt"
"testing" "testing"
kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
@@ -19,7 +18,6 @@ metadata:
annotations: annotations:
app: myApp app: myApp
greeting/morning: a string with blanks greeting/morning: a string with blanks
yamlSupport: %v
fieldSpecs: fieldSpecs:
- path: metadata/annotations - path: metadata/annotations
create: true create: true
@@ -48,16 +46,9 @@ spec:
) )
func TestAnnotationsTransformer(t *testing.T) { 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). th := kusttest_test.MakeEnhancedHarness(t).
PrepBuiltin("AnnotationsTransformer") PrepBuiltin("AnnotationsTransformer")
defer th.Reset() defer th.Reset()
cfg := fmt.Sprintf(config, b) th.RunTransformerAndCheckResult(config, input, expectedOutput)
rm := th.LoadAndRunTransformer(cfg, input)
th.AssertActualEqualsExpected(rm, expectedOutput)
})
}
} }

View File

@@ -4,7 +4,6 @@
package main_test package main_test
import ( import (
"fmt"
"strings" "strings"
"testing" "testing"
@@ -12,18 +11,15 @@ import (
) )
func TestNamespaceTransformer1(t *testing.T) { 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). th := kusttest_test.MakeEnhancedHarness(t).
PrepBuiltin("NamespaceTransformer") PrepBuiltin("NamespaceTransformer")
defer th.Reset() defer th.Reset()
rm := th.LoadAndRunTransformer(fmt.Sprintf(` th.RunTransformerAndCheckResult(`
apiVersion: builtin apiVersion: builtin
kind: NamespaceTransformer kind: NamespaceTransformer
metadata: metadata:
name: notImportantHere name: notImportantHere
namespace: test namespace: test
yamlSupport: %v
fieldSpecs: fieldSpecs:
- path: metadata/namespace - path: metadata/namespace
create: true create: true
@@ -33,7 +29,7 @@ fieldSpecs:
- path: subjects - path: subjects
kind: ClusterRoleBinding kind: ClusterRoleBinding
group: rbac.authorization.k8s.io group: rbac.authorization.k8s.io
`, b), ` `, `
apiVersion: v1 apiVersion: v1
kind: ConfigMap kind: ConfigMap
metadata: metadata:
@@ -102,8 +98,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
name: crd name: crd
`) `,
// Import note: The namespace transformer is in charge of // Import note: The namespace transformer is in charge of
// the metadata.namespace field. The namespace transformer SHOULD // the metadata.namespace field. The namespace transformer SHOULD
// NOT modify neither the "namespace" subfield within the // NOT modify neither the "namespace" subfield within the
@@ -113,7 +108,7 @@ metadata:
// object reference changes (prefix/suffix and namespace). // object reference changes (prefix/suffix and namespace).
// For use cases involving simultaneous change of name and namespace, // For use cases involving simultaneous change of name and namespace,
// refer to namespaces tests in pkg/target test suites. // refer to namespaces tests in pkg/target test suites.
th.AssertActualEqualsExpected(rm, ` `
apiVersion: v1 apiVersion: v1
kind: ConfigMap kind: ConfigMap
metadata: metadata:
@@ -185,13 +180,9 @@ kind: CustomResourceDefinition
metadata: metadata:
name: crd name: crd
`) `)
})
}
} }
func TestNamespaceTransformerClusterLevelKinds(t *testing.T) { 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). th := kusttest_test.MakeEnhancedHarness(t).
PrepBuiltin("NamespaceTransformer") PrepBuiltin("NamespaceTransformer")
defer th.Reset() defer th.Reset()
@@ -218,13 +209,13 @@ kind: PersistentVolume
metadata: metadata:
name: pv1 name: pv1
` `
rm := th.LoadAndRunTransformer(fmt.Sprintf(`
th.RunTransformerAndCheckResult(`
apiVersion: builtin apiVersion: builtin
kind: NamespaceTransformer kind: NamespaceTransformer
metadata: metadata:
name: notImportantHere name: notImportantHere
namespace: test namespace: test
yamlSupport: %v
fieldSpecs: fieldSpecs:
- path: metadata/namespace - path: metadata/namespace
create: true create: true
@@ -234,32 +225,24 @@ fieldSpecs:
- path: subjects - path: subjects
kind: ClusterRoleBinding kind: ClusterRoleBinding
group: rbac.authorization.k8s.io group: rbac.authorization.k8s.io
`, b), noChangeExpected) `, noChangeExpected, noChangeExpected)
th.AssertActualEqualsExpected(rm, noChangeExpected)
})
}
} }
func TestNamespaceTransformerObjectConflict(t *testing.T) { 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). th := kusttest_test.MakeEnhancedHarness(t).
PrepBuiltin("NamespaceTransformer") PrepBuiltin("NamespaceTransformer")
defer th.Reset() defer th.Reset()
err := th.ErrorFromLoadAndRunTransformer(fmt.Sprintf(` th.RunTransformerAndCheckError(`
apiVersion: builtin apiVersion: builtin
kind: NamespaceTransformer kind: NamespaceTransformer
metadata: metadata:
name: notImportantHere name: notImportantHere
namespace: test namespace: test
yamlSupport: %v
fieldSpecs: fieldSpecs:
- path: metadata/namespace - path: metadata/namespace
create: true create: true
`, b), ` `, `
apiVersion: v1 apiVersion: v1
kind: ConfigMap kind: ConfigMap
metadata: metadata:
@@ -271,8 +254,8 @@ kind: ConfigMap
metadata: metadata:
name: cm name: cm
namespace: bar namespace: bar
`) `,
func(t *testing.T, err error) {
if err == nil { if err == nil {
t.Fatal("expected error") t.Fatal("expected error")
} }
@@ -281,4 +264,3 @@ metadata:
} }
}) })
} }
}