package auth import ( "encoding/json" "os" "path/filepath" "strings" "testing" ) func TestDefaultCredentialPath(t *testing.T) { path, err := DefaultCredentialPath() if err != nil { t.Fatalf("DefaultCredentialPath error: %v", err) } if !strings.HasSuffix(path, filepath.Join(".claude", ".credentials.json")) { t.Errorf("path = %q, want suffix .claude/.credentials.json", path) } } func TestLoadDefaultCredentials_MissingFile(t *testing.T) { // When credential file doesn't exist, returns nil, nil path, err := DefaultCredentialPath() if err != nil { t.Skip("cannot determine home dir") } if _, statErr := os.Stat(path); os.IsNotExist(statErr) { creds, err := LoadDefaultCredentials() if creds != nil { t.Errorf("expected nil creds for missing file, got %v", creds) } if err != nil { t.Errorf("expected nil error for missing file, got %v", err) } } } func TestClaudeCredentialsJSON_ParsesCorrectly(t *testing.T) { jsonData := `{"claudeAiOauth":{"accessToken":"test-token","refreshToken":"test-refresh","expiresAt":1234567890,"subscriptionType":"pro"}}` var cf claudeCredentialsJSON if err := json.Unmarshal([]byte(jsonData), &cf); err != nil { t.Fatalf("unmarshal: %v", err) } if cf.ClaudeAiOauth.AccessToken != "test-token" { t.Errorf("AccessToken = %q, want test-token", cf.ClaudeAiOauth.AccessToken) } if cf.ClaudeAiOauth.RefreshToken != "test-refresh" { t.Errorf("RefreshToken = %q, want test-refresh", cf.ClaudeAiOauth.RefreshToken) } if cf.ClaudeAiOauth.ExpiresAt != 1234567890 { t.Errorf("ExpiresAt = %d, want 1234567890", cf.ClaudeAiOauth.ExpiresAt) } if cf.ClaudeAiOauth.SubscriptionType != "pro" { t.Errorf("SubscriptionType = %q, want pro", cf.ClaudeAiOauth.SubscriptionType) } } func TestClaudeCredentialsJSON_EmptyAccessToken(t *testing.T) { jsonData := `{"claudeAiOauth":{"accessToken":"","refreshToken":"r","expiresAt":1}}` var cf claudeCredentialsJSON if err := json.Unmarshal([]byte(jsonData), &cf); err != nil { t.Fatalf("unmarshal: %v", err) } if cf.ClaudeAiOauth.AccessToken != "" { t.Errorf("expected empty access token") } }