99 lines
2.9 KiB
Go
99 lines
2.9 KiB
Go
|
|
package auth
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
"net/http/httptest"
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestFetchAnthropicUsage_Success(t *testing.T) {
|
||
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if got := r.Header.Get("Authorization"); got != "Bearer test-token" {
|
||
|
|
t.Errorf("Authorization = %q, want %q", got, "Bearer test-token")
|
||
|
|
}
|
||
|
|
if got := r.Header.Get("Anthropic-Beta"); got != anthropicBetaHeader {
|
||
|
|
t.Errorf("Anthropic-Beta = %q, want %q", got, anthropicBetaHeader)
|
||
|
|
}
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
w.Write([]byte(`{"five_hour":{"utilization":0.42},"seven_day":{"utilization":0.85}}`))
|
||
|
|
}))
|
||
|
|
defer srv.Close()
|
||
|
|
|
||
|
|
// Temporarily override the URL by using the test server
|
||
|
|
origURL := anthropicUsageURL
|
||
|
|
defer func() { setAnthropicUsageURL(origURL) }()
|
||
|
|
setAnthropicUsageURL(srv.URL)
|
||
|
|
|
||
|
|
usage, err := FetchAnthropicUsage("test-token")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("unexpected error: %v", err)
|
||
|
|
}
|
||
|
|
if usage.FiveHourUtilization != 0.42 {
|
||
|
|
t.Errorf("FiveHourUtilization = %v, want 0.42", usage.FiveHourUtilization)
|
||
|
|
}
|
||
|
|
if usage.SevenDayUtilization != 0.85 {
|
||
|
|
t.Errorf("SevenDayUtilization = %v, want 0.85", usage.SevenDayUtilization)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFetchAnthropicUsage_Forbidden(t *testing.T) {
|
||
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusForbidden)
|
||
|
|
w.Write([]byte(`{"error":"forbidden"}`))
|
||
|
|
}))
|
||
|
|
defer srv.Close()
|
||
|
|
|
||
|
|
origURL := anthropicUsageURL
|
||
|
|
defer func() { setAnthropicUsageURL(origURL) }()
|
||
|
|
setAnthropicUsageURL(srv.URL)
|
||
|
|
|
||
|
|
_, err := FetchAnthropicUsage("test-token")
|
||
|
|
if err == nil {
|
||
|
|
t.Fatal("expected error for 403, got nil")
|
||
|
|
}
|
||
|
|
if !strings.Contains(err.Error(), "insufficient scope") {
|
||
|
|
t.Errorf("expected 'insufficient scope' error, got %q", err.Error())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFetchAnthropicUsage_ServerError(t *testing.T) {
|
||
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
|
w.Write([]byte(`internal error`))
|
||
|
|
}))
|
||
|
|
defer srv.Close()
|
||
|
|
|
||
|
|
origURL := anthropicUsageURL
|
||
|
|
defer func() { setAnthropicUsageURL(origURL) }()
|
||
|
|
setAnthropicUsageURL(srv.URL)
|
||
|
|
|
||
|
|
_, err := FetchAnthropicUsage("test-token")
|
||
|
|
if err == nil {
|
||
|
|
t.Fatal("expected error for 500, got nil")
|
||
|
|
}
|
||
|
|
if !strings.Contains(err.Error(), "500") {
|
||
|
|
t.Errorf("expected error containing '500', got %q", err.Error())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFetchAnthropicUsage_MalformedJSON(t *testing.T) {
|
||
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
w.Write([]byte(`not json`))
|
||
|
|
}))
|
||
|
|
defer srv.Close()
|
||
|
|
|
||
|
|
origURL := anthropicUsageURL
|
||
|
|
defer func() { setAnthropicUsageURL(origURL) }()
|
||
|
|
setAnthropicUsageURL(srv.URL)
|
||
|
|
|
||
|
|
_, err := FetchAnthropicUsage("test-token")
|
||
|
|
if err == nil {
|
||
|
|
t.Fatal("expected error for malformed JSON, got nil")
|
||
|
|
}
|
||
|
|
if !strings.Contains(err.Error(), "parsing usage response") {
|
||
|
|
t.Errorf("expected 'parsing usage response' error, got %q", err.Error())
|
||
|
|
}
|
||
|
|
}
|