package claude import ( "strings" "testing" ) // TestDefaultBundleVersions verifies the active Claude Code bundle snapshot // matches the reverse-engineered 2.1.145 binary. Bump this when DefaultBundle // is upgraded to a newer CLI release. func TestDefaultBundleVersions(t *testing.T) { if got := DefaultBundle.CLIVersion; got != "2.1.145" { t.Fatalf("DefaultBundle.CLIVersion = %q, want %q", got, "2.1.145") } if got := DefaultBundle.SDKVersion; got != "0.94.0" { t.Fatalf("DefaultBundle.SDKVersion = %q, want %q", got, "0.94.0") } } // TestDefaultBundleDrivesLegacyExports ensures all legacy exported vars stay // in sync with DefaultBundle (single source of truth). func TestDefaultBundleDrivesLegacyExports(t *testing.T) { if DefaultCLIVersion != DefaultBundle.CLIVersion { t.Fatalf("DefaultCLIVersion = %q, want %q (from DefaultBundle)", DefaultCLIVersion, DefaultBundle.CLIVersion) } if DefaultStainlessPackageVersion != DefaultBundle.SDKVersion { t.Fatalf("DefaultStainlessPackageVersion = %q, want %q (from DefaultBundle)", DefaultStainlessPackageVersion, DefaultBundle.SDKVersion) } if DefaultStainlessRuntimeVersion != DefaultBundle.RuntimeVersion { t.Fatalf("DefaultStainlessRuntimeVersion = %q, want %q (from DefaultBundle)", DefaultStainlessRuntimeVersion, DefaultBundle.RuntimeVersion) } if DefaultStainlessOS != DefaultBundle.DefaultOS { t.Fatalf("DefaultStainlessOS = %q, want %q (from DefaultBundle)", DefaultStainlessOS, DefaultBundle.DefaultOS) } if DefaultStainlessArch != DefaultBundle.DefaultArch { t.Fatalf("DefaultStainlessArch = %q, want %q (from DefaultBundle)", DefaultStainlessArch, DefaultBundle.DefaultArch) } if CLICurrentVersion != DefaultBundle.CLIVersion { t.Fatalf("CLICurrentVersion = %q, want %q (from DefaultBundle)", CLICurrentVersion, DefaultBundle.CLIVersion) } } // TestDefaultHeadersDrivenByBundle ensures DefaultHeaders map carries the // values from DefaultBundle, not stale hard-coded literals. func TestDefaultHeadersDrivenByBundle(t *testing.T) { if got := DefaultHeaders["X-Stainless-Package-Version"]; got != DefaultBundle.SDKVersion { t.Fatalf("DefaultHeaders[X-Stainless-Package-Version] = %q, want %q", got, DefaultBundle.SDKVersion) } if got := DefaultHeaders["X-Stainless-Runtime-Version"]; got != DefaultBundle.RuntimeVersion { t.Fatalf("DefaultHeaders[X-Stainless-Runtime-Version] = %q, want %q", got, DefaultBundle.RuntimeVersion) } if got := DefaultHeaders["X-Stainless-OS"]; got != DefaultBundle.DefaultOS { t.Fatalf("DefaultHeaders[X-Stainless-OS] = %q, want %q", got, DefaultBundle.DefaultOS) } if got := DefaultHeaders["X-Stainless-Arch"]; got != DefaultBundle.DefaultArch { t.Fatalf("DefaultHeaders[X-Stainless-Arch] = %q, want %q", got, DefaultBundle.DefaultArch) } ua := DefaultHeaders["User-Agent"] if !strings.Contains(ua, "claude-cli/"+DefaultBundle.CLIVersion) { t.Fatalf("DefaultHeaders[User-Agent] = %q, want substring %q", ua, "claude-cli/"+DefaultBundle.CLIVersion) } } func TestApplyFingerprintOverridesUpdatesSharedDefaults(t *testing.T) { t.Setenv("CLAUDE_CODE_ENTRYPOINT", "") t.Setenv("CLAUDE_AGENT_SDK_VERSION", "") t.Setenv("CLAUDE_AGENT_SDK_CLIENT_APP", "") t.Setenv("CLAUDE_CODE_WORKLOAD", "") originalVersion := DefaultCLIVersion originalPackageVersion := DefaultStainlessPackageVersion originalRuntimeVersion := DefaultStainlessRuntimeVersion originalOS := DefaultStainlessOS originalArch := DefaultStainlessArch t.Cleanup(func() { ApplyFingerprintOverrides( originalVersion, originalPackageVersion, originalRuntimeVersion, originalOS, originalArch, ) }) ApplyFingerprintOverrides("2.1.999", "0.99.0", "v99.0.0", "Linux", "x64") if got := DefaultCLIVersion; got != "2.1.999" { t.Fatalf("DefaultCLIVersion = %q, want %q", got, "2.1.999") } if got := DefaultUserAgent(); got != "claude-cli/2.1.999 (external, cli)" { t.Fatalf("DefaultUserAgent() = %q", got) } profile := DefaultDeviceProfile() if profile.StainlessPackageVersion != "0.99.0" { t.Fatalf("DefaultDeviceProfile().StainlessPackageVersion = %q", profile.StainlessPackageVersion) } if profile.StainlessRuntimeVersion != "v99.0.0" { t.Fatalf("DefaultDeviceProfile().StainlessRuntimeVersion = %q", profile.StainlessRuntimeVersion) } if profile.StainlessOS != "Linux" { t.Fatalf("DefaultDeviceProfile().StainlessOS = %q", profile.StainlessOS) } if profile.StainlessArch != "x64" { t.Fatalf("DefaultDeviceProfile().StainlessArch = %q", profile.StainlessArch) } if got := DefaultHeaders["User-Agent"]; got != profile.UserAgent { t.Fatalf("DefaultHeaders[User-Agent] = %q, want %q", got, profile.UserAgent) } if got := DefaultHeaders["X-Stainless-Package-Version"]; got != profile.StainlessPackageVersion { t.Fatalf("DefaultHeaders[X-Stainless-Package-Version] = %q, want %q", got, profile.StainlessPackageVersion) } if got := DefaultHeaders["X-Stainless-Runtime-Version"]; got != profile.StainlessRuntimeVersion { t.Fatalf("DefaultHeaders[X-Stainless-Runtime-Version] = %q, want %q", got, profile.StainlessRuntimeVersion) } if got := DefaultHeaders["X-Stainless-OS"]; got != profile.StainlessOS { t.Fatalf("DefaultHeaders[X-Stainless-OS] = %q, want %q", got, profile.StainlessOS) } if got := DefaultHeaders["X-Stainless-Arch"]; got != profile.StainlessArch { t.Fatalf("DefaultHeaders[X-Stainless-Arch] = %q, want %q", got, profile.StainlessArch) } if got := DefaultHeaders["anthropic-dangerous-direct-browser-access"]; got != "true" { t.Fatalf("DefaultHeaders[anthropic-dangerous-direct-browser-access] = %q, want %q", got, "true") } } func TestDefaultUserAgentReflectsLocalRuntimeDescriptors(t *testing.T) { t.Setenv("CLAUDE_CODE_ENTRYPOINT", "sdk-cli") t.Setenv("CLAUDE_AGENT_SDK_VERSION", "0.0.77") t.Setenv("CLAUDE_AGENT_SDK_CLIENT_APP", "cron-daemon") t.Setenv("CLAUDE_CODE_WORKLOAD", "cron") got := DefaultUserAgent() want := "claude-cli/2.1.145 (external, sdk-cli, agent-sdk/0.0.77, client-app/cron-daemon, workload/cron)" if got != want { t.Fatalf("DefaultUserAgent() = %q, want %q", got, want) } } func TestDetailedCodeUserAgentReflectsEntrypointAndSDK(t *testing.T) { t.Setenv("CLAUDE_CODE_ENTRYPOINT", "remote") t.Setenv("CLAUDE_AGENT_SDK_VERSION", "0.0.77") t.Setenv("CLAUDE_AGENT_SDK_CLIENT_APP", "desktop") got := DetailedCodeUserAgent() want := "claude-code/2.1.145 (remote, agent-sdk/0.0.77, client-app/desktop)" if got != want { t.Fatalf("DetailedCodeUserAgent() = %q, want %q", got, want) } } func TestOptionalAPIHeaders(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") headers := OptionalAPIHeaders() if got := headers["x-claude-remote-container-id"]; got != "ctr-123" { t.Fatalf("x-claude-remote-container-id = %q", got) } if got := headers["x-claude-remote-session-id"]; got != "remote-456" { t.Fatalf("x-claude-remote-session-id = %q", got) } if got := headers["x-client-app"]; got != "desktop" { t.Fatalf("x-client-app = %q", got) } if got := headers["x-anthropic-additional-protection"]; got != "true" { t.Fatalf("x-anthropic-additional-protection = %q", got) } } func TestAttributionHeaderDisabled(t *testing.T) { t.Setenv("CLAUDE_CODE_ATTRIBUTION_HEADER", "false") if !AttributionHeaderDisabled() { t.Fatal("expected AttributionHeaderDisabled() to be true when env=false") } }