package service import ( "net/http" "testing" ) func TestApplyClaudeRuntimeOptionalHeaders(t *testing.T) { t.Setenv("CLAUDE_CODE_CONTAINER_ID", "ctr-123") t.Setenv("CLAUDE_CODE_REMOTE_SESSION_ID", "remote-456") t.Setenv("CLAUDE_AGENT_SDK_CLIENT_APP", "desktop") t.Setenv("CLAUDE_CODE_ADDITIONAL_PROTECTION", "true") req, err := http.NewRequest(http.MethodPost, "https://api.anthropic.com/v1/messages", nil) if err != nil { t.Fatalf("NewRequest() error = %v", err) } applyClaudeRuntimeOptionalHeaders(req) if got := getHeaderRaw(req.Header, "x-claude-remote-container-id"); got != "ctr-123" { t.Fatalf("x-claude-remote-container-id = %q", got) } if got := getHeaderRaw(req.Header, "x-claude-remote-session-id"); got != "remote-456" { t.Fatalf("x-claude-remote-session-id = %q", got) } if got := getHeaderRaw(req.Header, "x-client-app"); got != "desktop" { t.Fatalf("x-client-app = %q", got) } if got := getHeaderRaw(req.Header, "x-anthropic-additional-protection"); got != "true" { t.Fatalf("x-anthropic-additional-protection = %q", got) } } func TestBuildAttributionBlock_UsesEntrypointAndWorkload(t *testing.T) { t.Setenv("CLAUDE_CODE_ATTRIBUTION_HEADER", "") got := buildAttributionBlock("2.1.104", "abc", attributionBlockOptions{ Entrypoint: "sdk-cli", Workload: "cron", }) want := "x-anthropic-billing-header: cc_version=2.1.104.abc; cc_entrypoint=sdk-cli; cch=00000; cc_workload=cron;" if got != want { t.Fatalf("buildAttributionBlock() = %q, want %q", got, want) } } func TestBuildAttributionBlock_OmitsCCHForBedrockLikeProviders(t *testing.T) { t.Setenv("CLAUDE_CODE_ATTRIBUTION_HEADER", "") got := buildAttributionBlock("2.1.104", "abc", attributionBlockOptions{ Entrypoint: "cli", OmitCCH: true, }) want := "x-anthropic-billing-header: cc_version=2.1.104.abc; cc_entrypoint=cli;" if got != want { t.Fatalf("buildAttributionBlock() = %q, want %q", got, want) } } func TestInjectAttributionBlock_DisabledByEnv(t *testing.T) { t.Setenv("CLAUDE_CODE_ATTRIBUTION_HEADER", "false") body := []byte(`{"messages":[{"role":"user","content":"hello"}]}`) got := injectAttributionBlock(body, "2.1.104", attributionBlockOptions{}) if string(got) != string(body) { t.Fatalf("injectAttributionBlock() should keep body unchanged when attribution disabled") } } func TestShouldOmitAttributionCCH(t *testing.T) { if !shouldOmitAttributionCCH(&Account{Type: AccountTypeBedrock}, "") { t.Fatal("expected bedrock account to omit cch") } if !shouldOmitAttributionCCH(&Account{Extra: map[string]any{"provider": "mantle"}}, "") { t.Fatal("expected mantle provider to omit cch") } if shouldOmitAttributionCCH(&Account{Type: AccountTypeOAuth}, "oauth") { t.Fatal("expected oauth account to keep cch") } }