File: setters_test.go

package info (click to toggle)
golang-k8s-sigs-kustomize-api 0.20.1%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,768 kB
  • sloc: makefile: 206; sh: 67
file content (108 lines) | stat: -rw-r--r-- 2,737 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Copyright 2022 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0

package filtersutil_test

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"sigs.k8s.io/kustomize/api/filters/filtersutil"
	"sigs.k8s.io/kustomize/kyaml/yaml"
)

func TestTrackableSetter_SetScalarIfEmpty(t *testing.T) {
	tests := []struct {
		name  string
		input *yaml.RNode
		value string
		want  string
	}{
		{
			name:  "sets null values",
			input: yaml.MakeNullNode(),
			value: "foo",
			want:  "foo",
		},
		{
			name:  "sets empty values",
			input: yaml.NewScalarRNode(""),
			value: "foo",
			want:  "foo",
		},
		{
			name:  "does not overwrite values",
			input: yaml.NewStringRNode("a"),
			value: "foo",
			want:  "a",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			wasSet := false
			s := (&filtersutil.TrackableSetter{}).WithMutationTracker(func(_, _, _ string, _ *yaml.RNode) {
				wasSet = true
			})
			wantSet := tt.value == tt.want
			fn := s.SetScalarIfEmpty(tt.value)
			require.NoError(t, fn(tt.input))
			assert.Equal(t, tt.want, yaml.GetValue(tt.input))
			assert.Equal(t, wantSet, wasSet, "tracker invoked even though value was not changed")
		})
	}
}

func TestTrackableSetter_SetEntryIfEmpty(t *testing.T) {
	tests := []struct {
		name  string
		input *yaml.RNode
		key   string
		value string
		want  string
	}{
		{
			name:  "sets empty values",
			input: yaml.NewMapRNode(&map[string]string{"setMe": ""}),
			key:   "setMe",
			value: "foo",
			want:  "foo",
		},
		{
			name:  "sets missing keys",
			input: yaml.NewMapRNode(&map[string]string{}),
			key:   "setMe",
			value: "foo",
			want:  "foo",
		},
		{
			name:  "does not overwrite values",
			input: yaml.NewMapRNode(&map[string]string{"existing": "original"}),
			key:   "existing",
			value: "foo",
			want:  "original",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			wasSet := false
			s := (&filtersutil.TrackableSetter{}).WithMutationTracker(func(_, _, _ string, _ *yaml.RNode) {
				wasSet = true
			})
			wantSet := tt.value == tt.want
			fn := s.SetEntryIfEmpty(tt.key, tt.value, "")
			require.NoError(t, fn(tt.input))
			assert.Equal(t, tt.want, yaml.GetValue(tt.input.Field(tt.key).Value))
			assert.Equal(t, wantSet, wasSet, "tracker invoked even though value was not changed")
		})
	}
}

func TestTrackableSetter_SetEntryIfEmpty_BadInputNodeKind(t *testing.T) {
	fn := filtersutil.TrackableSetter{}.SetEntryIfEmpty("foo", "false", yaml.NodeTagBool)
	rn := yaml.NewListRNode("nope")
	rn.AppendToFieldPath("dummy", "path")
	assert.EqualError(t, fn(rn), `wrong node kind: expected MappingNode but got SequenceNode: node contents:
- nope
`)
}