← back to Cli Printing Press
fix(cli): avoid duplicate token auth map keys (#775)
de34ec0ecd8ff1d807b049556f138b1131fd081b · 2026-05-08 21:33:40 -0700 · Trevin Chow
Files touched
M internal/generator/templates/config.go.tmplM internal/generator/templates_test.go
Diff
commit de34ec0ecd8ff1d807b049556f138b1131fd081b
Author: Trevin Chow <trevin@trevinchow.com>
Date: Fri May 8 21:33:40 2026 -0700
fix(cli): avoid duplicate token auth map keys (#775)
---
internal/generator/templates/config.go.tmpl | 6 ++++
internal/generator/templates_test.go | 55 +++++++++++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/internal/generator/templates/config.go.tmpl b/internal/generator/templates/config.go.tmpl
index ccff6502..49dc53c1 100644
--- a/internal/generator/templates/config.go.tmpl
+++ b/internal/generator/templates/config.go.tmpl
@@ -187,7 +187,9 @@ func (c *Config) AuthHeader() string {
return applyAuthFormat("{{$.Auth.Format}}", map[string]string{
"{{envVarPlaceholder .Name}}": c.{{resolveEnvVarField .Name}},
"{{.Name}}": c.{{resolveEnvVarField .Name}},
+ {{- if ne (envVarPlaceholder .Name) "token"}}
"token": c.{{resolveEnvVarField .Name}},
+ {{- end}}
})
{{- else}}
return c.{{resolveEnvVarField .Name}}
@@ -287,7 +289,9 @@ func (c *Config) AuthHeader() string {
return applyAuthFormat("{{$.Auth.Format}}", map[string]string{
"{{envVarPlaceholder .Name}}": c.{{resolveEnvVarField .Name}},
"{{.Name}}": c.{{resolveEnvVarField .Name}},
+ {{- if ne (envVarPlaceholder .Name) "token"}}
"token": c.{{resolveEnvVarField .Name}},
+ {{- end}}
})
{{- else}}
return "Bearer " + c.{{resolveEnvVarField .Name}}
@@ -302,7 +306,9 @@ func (c *Config) AuthHeader() string {
return applyAuthFormat("{{$.Auth.Format}}", map[string]string{
"{{envVarPlaceholder .Name}}": c.{{resolveEnvVarField .Name}},
"{{.Name}}": c.{{resolveEnvVarField .Name}},
+ {{- if ne (envVarPlaceholder .Name) "token"}}
"token": c.{{resolveEnvVarField .Name}},
+ {{- end}}
})
{{- else}}
return "Bearer " + c.{{resolveEnvVarField .Name}}
diff --git a/internal/generator/templates_test.go b/internal/generator/templates_test.go
index d3943fc2..f2fefd0a 100644
--- a/internal/generator/templates_test.go
+++ b/internal/generator/templates_test.go
@@ -194,3 +194,58 @@ func TestAuthHeaderBearerORCaseFallsThroughToAccessToken(t *testing.T) {
assert.Less(t, fanOutIdx, accessTokenIdx, "AccessToken fallback should remain reachable after OR fan-out")
require.NotContains(t, content[fanOutIdx:accessTokenIdx], `return ""`)
}
+
+func TestAuthHeaderTokenEnvVarsDoNotEmitDuplicateMapKeys(t *testing.T) {
+ t.Parallel()
+
+ orTokenEnvVars := []spec.AuthEnvVar{
+ {Name: "PRIMARY_TOKEN", Kind: spec.AuthEnvVarKindPerCall, Required: false, Sensitive: true, Description: "Set this OR SECONDARY_TOKEN."},
+ {Name: "SECONDARY_TOKEN", Kind: spec.AuthEnvVarKindPerCall, Required: false, Sensitive: true, Description: "Set this OR PRIMARY_TOKEN."},
+ }
+
+ tests := []struct {
+ name string
+ auth spec.AuthConfig
+ }{
+ {
+ name: "bearer-canonical-token",
+ auth: spec.AuthConfig{
+ Type: "bearer_token",
+ Header: "Authorization",
+ Format: "Bearer {token}",
+ EnvVars: []string{"CANONICAL_TOKEN"},
+ },
+ },
+ {
+ name: "bearer-or-token",
+ auth: spec.AuthConfig{
+ Type: "bearer_token",
+ Header: "Authorization",
+ Format: "Bearer {token}",
+ EnvVarSpecs: orTokenEnvVars,
+ },
+ },
+ {
+ name: "api-key-or-token",
+ auth: spec.AuthConfig{
+ Type: "api_key",
+ Header: "Authorization",
+ Format: "Bearer {token}",
+ EnvVarSpecs: orTokenEnvVars,
+ },
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
+
+ apiSpec := minimalSpec(tt.name)
+ apiSpec.Auth = tt.auth
+
+ outputDir := filepath.Join(t.TempDir(), tt.name+"-pp-cli")
+ require.NoError(t, New(apiSpec, outputDir).Generate())
+ runGoCommand(t, outputDir, "test", "./internal/config")
+ })
+ }
+}
← 838f5a49 feat(cli): support static config headers (#769)
·
back to Cli Printing Press
·
chore(main): release 4.2.0 (#772) 3b929c6e →