billing_search_audio_cost_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package service
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/require"
  5. )
  6. func TestCalculateSearchCost(t *testing.T) {
  7. t.Parallel()
  8. s := &BillingService{}
  9. require.Equal(t, 0.0, s.CalculateSearchCost(0, floatPtr(10), 1).ActualCost)
  10. // nil price -> official xAI default $5/1k: 5 calls = 0.025
  11. require.InDelta(t, 0.025, s.CalculateSearchCost(5, nil, 1).ActualCost, 1e-9)
  12. // explicit 0 → free
  13. require.Equal(t, 0.0, s.CalculateSearchCost(5, floatPtr(0), 1).ActualCost)
  14. price := 10.0
  15. cost := s.CalculateSearchCost(100, &price, 1.5)
  16. // 10 / 1000 * 100 * 1.5 = 1.5
  17. require.InDelta(t, 1.0, cost.TotalCost, 1e-9)
  18. require.InDelta(t, 1.5, cost.ActualCost, 1e-9)
  19. }
  20. func TestCalculateAudioCost(t *testing.T) {
  21. t.Parallel()
  22. s := &BillingService{}
  23. rt, tts, stt := 0.10, 15.0, 0.50
  24. cfg := &audioPriceConfig{RealtimePerMin: &rt, TTSPerMChars: &tts, STTPerHour: &stt}
  25. require.InDelta(t, 0.20, s.CalculateAudioCost("realtime", 2, cfg, 1).ActualCost, 1e-9)
  26. require.InDelta(t, 1.5, s.CalculateAudioCost("tts", 0.1, cfg, 1).ActualCost, 1e-9)
  27. require.InDelta(t, 0.25, s.CalculateAudioCost("stt", 0.5, cfg, 1).ActualCost, 1e-9)
  28. require.Equal(t, 0.0, s.CalculateAudioCost("unknown", 1, cfg, 1).ActualCost)
  29. // nil config -> official defaults (think-fast-1 $0.05/min, TTS $15/M, REST STT $0.10/hr)
  30. require.InDelta(t, 0.05, s.CalculateAudioCost("realtime", 1, nil, 1).ActualCost, 1e-9)
  31. require.InDelta(t, 15.0, s.CalculateAudioCost("tts", 1, nil, 1).ActualCost, 1e-9)
  32. require.InDelta(t, 0.10, s.CalculateAudioCost("stt", 1, nil, 1).ActualCost, 1e-9)
  33. // explicit 0 → free
  34. zero := 0.0
  35. require.Equal(t, 0.0, s.CalculateAudioCost("realtime", 1, &audioPriceConfig{RealtimePerMin: &zero}, 1).ActualCost)
  36. }
  37. func floatPtr(v float64) *float64 { return &v }