From 7593d6fe40ac5290322ec5fc29aed9d2a7e5bc12 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Apr 2026 23:24:32 +0000 Subject: [PATCH] test: add missing CLI>helmDefault and release>CLI postRendererArgs priority tests Agent-Logs-Url: https://github.com/helmfile/helmfile/sessions/37cf3613-a4e1-4eac-b6bc-002761256d31 Co-authored-by: yxxhero <11087727+yxxhero@users.noreply.github.com> --- pkg/app/app_test.go | 93 +++++++++++++++++++++++++++++++++++++ pkg/state/state_test.go | 100 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+) diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index 569dc276..1148f180 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -3121,6 +3121,99 @@ releases: } } +func TestTemplate_ReleasePostRendererArgsOverridesCLI(t *testing.T) { + tests := []struct { + name string + content string + }{ + { + name: "single-doc", + content: ` +helmDefaults: + postRenderer: foo + +releases: +- name: myrelease + chart: stable/mychart + postRendererArgs: + - --release-arg +`, + }, + { + name: "multi-doc", + content: ` +helmDefaults: + postRenderer: foo +--- +releases: +- name: myrelease + chart: stable/mychart + postRendererArgs: + - --release-arg +`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + files := map[string]string{"/path/to/helmfile.yaml": tt.content} + var helm = &mockHelmExec{} + + var buffer bytes.Buffer + syncWriter := testhelper.NewSyncWriter(&buffer) + logger := helmexec.NewLogger(syncWriter, "debug") + + valsRuntime, err := vals.New(vals.Options{CacheSize: 32}) + if err != nil { + t.Fatalf("unexpected error creating vals runtime: %v", err) + } + + app := appWithFs(&App{ + OverrideHelmBinary: DefaultHelmBinary, + fs: ffs.DefaultFileSystem(), + OverrideKubeContext: "default", + DisableKubeVersionAutoDetection: true, + Env: "default", + Logger: logger, + helms: map[helmKey]helmexec.Interface{ + createHelmKey("helm", "default"): helm, + }, + valsRuntime: valsRuntime, + }, files) + + // Release explicitly sets postRendererArgs, CLI also provides --post-renderer-args; release should win + if err := app.Template(configImpl{postRendererArgs: []string{"--cli-arg"}}); err != nil { + t.Fatalf("%v", err) + } + + if len(helm.templated) != 1 { + t.Fatalf("expected 1 release, got %d", len(helm.templated)) + } + + flags := helm.templated[0].flags + hasReleaseArg := false + hasCliArg := false + for i, f := range flags { + if f == "--post-renderer-args" && i+1 < len(flags) { + if flags[i+1] == "--release-arg" { + hasReleaseArg = true + } + if flags[i+1] == "--cli-arg" { + hasCliArg = true + } + } + } + + if !hasReleaseArg { + t.Errorf("expected --post-renderer-args --release-arg in flags (release should override CLI), got %v", flags) + } + if hasCliArg { + t.Errorf("unexpected --post-renderer-args --cli-arg in flags (release should override CLI), got %v", flags) + } + }) + } +} + func TestApply(t *testing.T) { type fields struct { skipNeeds bool diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index 64a57c29..0d10624a 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -976,6 +976,56 @@ func TestHelmState_flagsForUpgrade(t *testing.T) { "--namespace", "test-namespace", }, }, + { + name: "post-renderer-args-cli-overrides-helmdefault", + defaults: HelmSpec{ + Verify: false, + CreateNamespace: &enable, + PostRendererArgs: []string{"--default-arg"}, + }, + version: semver.MustParse("3.10.0"), + release: &ReleaseSpec{ + Chart: "test/chart", + Version: "0.1", + Verify: &disable, + Name: "test-charts", + Namespace: "test-namespace", + CreateNamespace: &disable, + }, + syncOpts: &SyncOpts{ + PostRendererArgs: []string{"--cli-arg"}, + }, + want: []string{ + "--version", "0.1", + "--post-renderer-args", "--cli-arg", + "--namespace", "test-namespace", + }, + }, + { + name: "post-renderer-args-release-overrides-cli", + defaults: HelmSpec{ + Verify: false, + CreateNamespace: &enable, + }, + version: semver.MustParse("3.10.0"), + release: &ReleaseSpec{ + Chart: "test/chart", + Version: "0.1", + Verify: &disable, + Name: "test-charts", + Namespace: "test-namespace", + CreateNamespace: &disable, + PostRendererArgs: []string{"--release-arg"}, + }, + syncOpts: &SyncOpts{ + PostRendererArgs: []string{"--cli-arg"}, + }, + want: []string{ + "--version", "0.1", + "--post-renderer-args", "--release-arg", + "--namespace", "test-namespace", + }, + }, { name: "description-from-release", defaults: HelmSpec{ @@ -1340,6 +1390,56 @@ func TestHelmState_flagsForTemplate(t *testing.T) { "--namespace", "test-namespace", }, }, + { + name: "post-renderer-args-cli-overrides-helmdefault", + defaults: HelmSpec{ + Verify: false, + CreateNamespace: &enable, + PostRendererArgs: []string{"--default-arg"}, + }, + version: semver.MustParse("3.10.0"), + release: &ReleaseSpec{ + Chart: "test/chart", + Version: "0.1", + Verify: &disable, + Name: "test-charts", + Namespace: "test-namespace", + CreateNamespace: &disable, + }, + templateOpts: TemplateOpts{ + PostRendererArgs: []string{"--cli-arg"}, + }, + want: []string{ + "--version", "0.1", + "--post-renderer-args", "--cli-arg", + "--namespace", "test-namespace", + }, + }, + { + name: "post-renderer-args-release-overrides-cli", + defaults: HelmSpec{ + Verify: false, + CreateNamespace: &enable, + }, + version: semver.MustParse("3.10.0"), + release: &ReleaseSpec{ + Chart: "test/chart", + Version: "0.1", + Verify: &disable, + Name: "test-charts", + Namespace: "test-namespace", + CreateNamespace: &disable, + PostRendererArgs: []string{"--release-arg"}, + }, + templateOpts: TemplateOpts{ + PostRendererArgs: []string{"--cli-arg"}, + }, + want: []string{ + "--version", "0.1", + "--post-renderer-args", "--release-arg", + "--namespace", "test-namespace", + }, + }, { name: "kube-version-flag-should-be-used", defaults: HelmSpec{