0df28e9dd8
- Unify duplicate uTLS transports into shared internal/transport package - Extract shared version constant into internal/version - Move LoadDefaultCredentials from config to auth (remove config→auth import) - Deduplicate handler.go: extract telemetry/error helpers (324→268 lines) - Break up main.go::run() into initCredential/initEmbedded - Eliminate logging.Config duplication (use config.LoggingConfig directly) - Extract logWriter to embedded/log.go, SSE fixtures to consts in sniff.go - Use uTLS client for usage polling (consistent TLS fingerprint) - Handle sjson.SetBytes errors in sanitize.go instead of silently swallowing - Document reverse-engineered magic values in billing.go - Unexport Credential.CooldownUntil (internal state) - Replace hardcoded auth bypass paths with map in server.go
71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
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")
|
|
}
|
|
}
|