[object Object]

← 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

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 →