margin_service_test.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package service
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/require"
  7. )
  8. type stubMarginChannels struct {
  9. status map[int64]string
  10. updates int
  11. }
  12. func (s *stubMarginChannels) GetByID(_ context.Context, id int64) (*Channel, error) {
  13. st, ok := s.status[id]
  14. if !ok {
  15. st = StatusActive
  16. }
  17. return &Channel{ID: id, Status: st}, nil
  18. }
  19. func (s *stubMarginChannels) Update(_ context.Context, id int64, input *UpdateChannelInput) (*Channel, error) {
  20. if s.status == nil {
  21. s.status = make(map[int64]string)
  22. }
  23. s.status[id] = input.Status
  24. s.updates++
  25. return &Channel{ID: id, Status: input.Status}, nil
  26. }
  27. func TestNormalizeMarginFuseSettings(t *testing.T) {
  28. norm := normalizeMarginFuseSettings(MarginFuseSettings{})
  29. require.True(t, norm.WindowHours > 0)
  30. require.True(t, norm.CooldownHours > 0)
  31. require.True(t, norm.IntervalMinutes >= 1)
  32. }
  33. func TestMarginRowWithoutBilling(t *testing.T) {
  34. svc := NewMarginService(nil, &stubMarginChannels{}, nil, &stubHealthSettingRepo{})
  35. row := svc.toMarginRow(marginAggRow{model: "gpt-5", requests: 3, revenue: 1.5})
  36. require.Equal(t, "gpt-5", row.Model)
  37. require.Nil(t, row.EstCost)
  38. require.Nil(t, row.Margin)
  39. }
  40. func TestMarginUnfuse(t *testing.T) {
  41. ch := &stubMarginChannels{status: map[int64]string{9: StatusDisabled}}
  42. svc := NewMarginService(nil, ch, nil, &stubHealthSettingRepo{})
  43. svc.mu.Lock()
  44. svc.fused[9] = time.Now()
  45. svc.mu.Unlock()
  46. require.NoError(t, svc.Unfuse(context.Background(), 9))
  47. require.Equal(t, StatusActive, ch.status[9])
  48. svc.mu.RLock()
  49. _, tracked := svc.fused[9]
  50. svc.mu.RUnlock()
  51. require.False(t, tracked)
  52. require.Len(t, svc.Events(), 1)
  53. require.Equal(t, "recovered", svc.Events()[0].Action)
  54. }