|
7 | 7 | "path/filepath" |
8 | 8 | "testing" |
9 | 9 |
|
| 10 | + chainsawvalues "github.com/kyverno/chainsaw/pkg/loaders/values" |
10 | 11 | "github.com/stretchr/testify/assert" |
| 12 | + "helm.sh/helm/v4/pkg/strvals" |
11 | 13 | ) |
12 | 14 |
|
13 | 15 | func TestChainsawCommand(t *testing.T) { |
@@ -146,6 +148,8 @@ func TestChainsawCommand(t *testing.T) { |
146 | 148 | "--include-test-regex=^.*$", |
147 | 149 | "--exclude-test-regex=^.*$", |
148 | 150 | "--force-termination-grace-period=5s", |
| 151 | + "--set=env=prod", |
| 152 | + "--set-string=image.tag=01", |
149 | 153 | }, |
150 | 154 | wantErr: false, |
151 | 155 | out: filepath.Join(basePath, "all_flags.txt"), |
@@ -182,3 +186,80 @@ func TestChainsawCommand(t *testing.T) { |
182 | 186 | }) |
183 | 187 | } |
184 | 188 | } |
| 189 | + |
| 190 | +func TestCommandHasSetFlags(t *testing.T) { |
| 191 | + cmd := Command() |
| 192 | + |
| 193 | + if f := cmd.Flags().Lookup("set"); f == nil { |
| 194 | + t.Fatalf("expected --set flag to be registered") |
| 195 | + } |
| 196 | + if f := cmd.Flags().Lookup("set-string"); f == nil { |
| 197 | + t.Fatalf("expected --set-string flag to be registered") |
| 198 | + } |
| 199 | +} |
| 200 | + |
| 201 | +func TestValuesMergeWithSetFlags(t *testing.T) { |
| 202 | + dir := t.TempDir() |
| 203 | + valuesFile := filepath.Join(dir, "values.yaml") |
| 204 | + if err := os.WriteFile(valuesFile, []byte( |
| 205 | + "env: poc\n"+ |
| 206 | + "nested:\n a: 1\n"+ |
| 207 | + "arr:\n - 1\n - 2\n"), 0o600); err != nil { |
| 208 | + t.Fatalf("failed to write values file: %v", err) |
| 209 | + } |
| 210 | + |
| 211 | + vals, err := chainsawvalues.Load(valuesFile) |
| 212 | + if err != nil { |
| 213 | + t.Fatalf("failed to load values: %v", err) |
| 214 | + } |
| 215 | + |
| 216 | + // simulate --set |
| 217 | + if err := strvals.ParseInto("env=prod,nested.b=two,arr={3,4},newkey=true", vals); err != nil { |
| 218 | + t.Fatalf("ParseInto failed: %v", err) |
| 219 | + } |
| 220 | + // simulate --set-string |
| 221 | + if err := strvals.ParseIntoString("num=08", vals); err != nil { |
| 222 | + t.Fatalf("ParseIntoString failed: %v", err) |
| 223 | + } |
| 224 | + |
| 225 | + if got, want := vals["env"], "prod"; got != want { |
| 226 | + t.Fatalf("env: got %v want %v", got, want) |
| 227 | + } |
| 228 | + nested, ok := vals["nested"].(map[string]any) |
| 229 | + if !ok { |
| 230 | + t.Fatalf("nested not a map: %T", vals["nested"]) |
| 231 | + } |
| 232 | + switch v := nested["a"].(type) { |
| 233 | + case int64: |
| 234 | + if v != 1 { |
| 235 | + t.Fatalf("nested.a: got %v want %v", v, 1) |
| 236 | + } |
| 237 | + case int: |
| 238 | + if v != 1 { |
| 239 | + t.Fatalf("nested.a: got %v want %v", v, 1) |
| 240 | + } |
| 241 | + case float64: |
| 242 | + if v != 1 { |
| 243 | + t.Fatalf("nested.a: got %v want %v", v, 1) |
| 244 | + } |
| 245 | + default: |
| 246 | + t.Fatalf("nested.a: unexpected type %T with value %v", v, v) |
| 247 | + } |
| 248 | + if got, want := nested["b"], "two"; got != want { |
| 249 | + t.Fatalf("nested.b: got %v want %v", got, want) |
| 250 | + } |
| 251 | + // arrays are replaced by --set list literal |
| 252 | + arr, ok := vals["arr"].([]any) |
| 253 | + if !ok { |
| 254 | + t.Fatalf("arr not a list: %T", vals["arr"]) |
| 255 | + } |
| 256 | + if len(arr) != 2 || arr[0] != int64(3) || arr[1] != int64(4) { |
| 257 | + t.Fatalf("arr: got %#v want [3,4]", arr) |
| 258 | + } |
| 259 | + if got, want := vals["newkey"], true; got != want { |
| 260 | + t.Fatalf("newkey: got %v want %v", got, want) |
| 261 | + } |
| 262 | + if got, want := vals["num"], "08"; got != want { |
| 263 | + t.Fatalf("num: got %v want %v", got, want) |
| 264 | + } |
| 265 | +} |
0 commit comments