Files

129 lines
4.2 KiB
Go
Raw Permalink Normal View History

2025-06-25 14:27:19 +03:00
package ui
import (
"regexp"
2025-06-25 14:27:19 +03:00
"strings"
"testing"
"github.com/mark3labs/kit/internal/models"
2025-06-25 14:27:19 +03:00
)
// stripAnsi removes ANSI escape codes from a string for test comparisons.
var ansiRegex = regexp.MustCompile(`\x1b\[[0-9;]*m`)
func stripAnsi(s string) string {
return ansiRegex.ReplaceAllString(s, "")
}
2025-06-25 14:27:19 +03:00
func TestUsageTracker_RenderUsageInfo_OAuth(t *testing.T) {
// Create a mock model info with costs and context limit
modelInfo := &models.ModelInfo{
ID: "claude-3-5-sonnet-20241022",
Name: "Claude 3.5 Sonnet v2",
Cost: models.Cost{
Input: 3.0,
Output: 15.0,
},
Limit: models.Limit{
Context: 200000,
Output: 8192,
},
}
// Test OAuth rendering (should show $0.00)
oauthTracker := NewUsageTracker(modelInfo, "anthropic", 80, true)
oauthTracker.UpdateUsage(1500, 500, 0, 0) // 2000 total tokens (session/billing)
oauthTracker.SetContextTokens(1500 + 500) // context window utilization
2025-06-25 14:27:19 +03:00
rendered := stripAnsi(oauthTracker.RenderUsageInfo())
2025-06-25 17:24:37 +03:00
// Should show tokens and percentage, but cost should show "$0.00"
2025-06-25 14:27:19 +03:00
if !strings.Contains(rendered, "Tokens: 2.0K") {
t.Errorf("Expected rendered output to contain 'Tokens: 2.0K', got: %s", rendered)
}
if !strings.Contains(rendered, "(1%)") { // 2000/200000 = 1%
t.Errorf("Expected rendered output to contain percentage, got: %s", rendered)
}
if !strings.Contains(rendered, "Cost: $0.00") {
t.Errorf("Expected rendered output to contain 'Cost: $0.00', got: %s", rendered)
}
// Test regular API key rendering (should show actual cost)
regularTracker := NewUsageTracker(modelInfo, "anthropic", 80, false)
regularTracker.UpdateUsage(1500, 500, 0, 0) // Same token usage
regularTracker.SetContextTokens(1500 + 500) // context window utilization
2025-06-25 14:27:19 +03:00
regularRendered := stripAnsi(regularTracker.RenderUsageInfo())
2025-06-25 17:24:37 +03:00
2025-06-25 14:27:19 +03:00
// Should show tokens and actual cost
if !strings.Contains(regularRendered, "Tokens: 2.0K") {
t.Errorf("Expected regular rendered output to contain 'Tokens: 2.0K', got: %s", regularRendered)
}
if strings.Contains(regularRendered, "Cost: $0.00") {
2025-06-25 17:24:37 +03:00
t.Errorf("Expected regular rendered output to NOT show $0.00, got: %s", regularRendered)
2025-06-25 14:27:19 +03:00
}
// Should show actual calculated cost (1500*3 + 500*15)/1000000 = 0.0120
2025-06-25 17:24:37 +03:00
if !strings.Contains(regularRendered, "Cost: $0.0120") { // Now showing 4 decimal places
2025-06-25 14:27:19 +03:00
t.Errorf("Expected regular rendered output to show actual cost, got: %s", regularRendered)
}
2025-06-25 17:24:37 +03:00
}
func TestUsageTracker_RenderUsageInfo_StartupState(t *testing.T) {
// Create a mock model info with costs and context limit
modelInfo := &models.ModelInfo{
ID: "claude-3-5-sonnet-20241022",
Name: "Claude 3.5 Sonnet v2",
Cost: models.Cost{
Input: 3.0,
Output: 15.0,
},
Limit: models.Limit{
Context: 200000,
Output: 8192,
},
}
// Test startup state (no requests made yet) - Regular API key
regularTracker := NewUsageTracker(modelInfo, "anthropic", 80, false)
rendered := stripAnsi(regularTracker.RenderUsageInfo())
// Should NOT return empty string on startup
if rendered == "" {
t.Errorf("Expected non-empty output on startup, got empty string")
}
// Should show 0 tokens
if !strings.Contains(rendered, "Tokens: 0") {
t.Errorf("Expected 'Tokens: 0' on startup, got: %s", rendered)
}
// Should NOT show percentage when tokens are 0
if strings.Contains(rendered, "(%") {
t.Errorf("Expected no percentage on startup with 0 tokens, got: %s", rendered)
}
// Should show $0.0000 cost for regular API key
if !strings.Contains(rendered, "Cost: $0.0000") {
t.Errorf("Expected 'Cost: $0.0000' on startup, got: %s", rendered)
}
// Test startup state (no requests made yet) - OAuth
oauthTracker := NewUsageTracker(modelInfo, "anthropic", 80, true)
oauthRendered := stripAnsi(oauthTracker.RenderUsageInfo())
// Should NOT return empty string on startup
if oauthRendered == "" {
t.Errorf("Expected non-empty output on startup for OAuth, got empty string")
}
// Should show 0 tokens for OAuth
if !strings.Contains(oauthRendered, "Tokens: 0") {
t.Errorf("Expected 'Tokens: 0' on startup for OAuth, got: %s", oauthRendered)
}
// Should show $0.00 cost for OAuth
if !strings.Contains(oauthRendered, "Cost: $0.00") {
t.Errorf("Expected 'Cost: $0.00' on startup for OAuth, got: %s", oauthRendered)
}
}