| package dto |
|
|
| import ( |
| "testing" |
|
|
| "github.com/Wei-Shaw/sub2api/internal/service" |
| "github.com/stretchr/testify/require" |
| ) |
|
|
| func TestUsageLogFromService_IncludesOpenAIWSMode(t *testing.T) { |
| t.Parallel() |
|
|
| wsLog := &service.UsageLog{ |
| RequestID: "req_1", |
| Model: "gpt-5.3-codex", |
| OpenAIWSMode: true, |
| } |
| httpLog := &service.UsageLog{ |
| RequestID: "resp_1", |
| Model: "gpt-5.3-codex", |
| OpenAIWSMode: false, |
| } |
|
|
| require.True(t, UsageLogFromService(wsLog).OpenAIWSMode) |
| require.False(t, UsageLogFromService(httpLog).OpenAIWSMode) |
| require.True(t, UsageLogFromServiceAdmin(wsLog).OpenAIWSMode) |
| require.False(t, UsageLogFromServiceAdmin(httpLog).OpenAIWSMode) |
| } |
|
|
| func TestUsageLogFromService_PrefersRequestTypeForLegacyFields(t *testing.T) { |
| t.Parallel() |
|
|
| log := &service.UsageLog{ |
| RequestID: "req_2", |
| Model: "gpt-5.3-codex", |
| RequestType: service.RequestTypeWSV2, |
| Stream: false, |
| OpenAIWSMode: false, |
| } |
|
|
| userDTO := UsageLogFromService(log) |
| adminDTO := UsageLogFromServiceAdmin(log) |
|
|
| require.Equal(t, "ws_v2", userDTO.RequestType) |
| require.True(t, userDTO.Stream) |
| require.True(t, userDTO.OpenAIWSMode) |
| require.Equal(t, "ws_v2", adminDTO.RequestType) |
| require.True(t, adminDTO.Stream) |
| require.True(t, adminDTO.OpenAIWSMode) |
| } |
|
|
| func TestUsageCleanupTaskFromService_RequestTypeMapping(t *testing.T) { |
| t.Parallel() |
|
|
| requestType := int16(service.RequestTypeStream) |
| task := &service.UsageCleanupTask{ |
| ID: 1, |
| Status: service.UsageCleanupStatusPending, |
| Filters: service.UsageCleanupFilters{ |
| RequestType: &requestType, |
| }, |
| } |
|
|
| dtoTask := UsageCleanupTaskFromService(task) |
| require.NotNil(t, dtoTask) |
| require.NotNil(t, dtoTask.Filters.RequestType) |
| require.Equal(t, "stream", *dtoTask.Filters.RequestType) |
| } |
|
|
| func TestRequestTypeStringPtrNil(t *testing.T) { |
| t.Parallel() |
| require.Nil(t, requestTypeStringPtr(nil)) |
| } |
|
|
| func TestUsageLogFromService_IncludesServiceTierForUserAndAdmin(t *testing.T) { |
| t.Parallel() |
|
|
| serviceTier := "priority" |
| inboundEndpoint := "/v1/chat/completions" |
| upstreamEndpoint := "/v1/responses" |
| log := &service.UsageLog{ |
| RequestID: "req_3", |
| Model: "gpt-5.4", |
| ServiceTier: &serviceTier, |
| InboundEndpoint: &inboundEndpoint, |
| UpstreamEndpoint: &upstreamEndpoint, |
| AccountRateMultiplier: f64Ptr(1.5), |
| } |
|
|
| userDTO := UsageLogFromService(log) |
| adminDTO := UsageLogFromServiceAdmin(log) |
|
|
| require.NotNil(t, userDTO.ServiceTier) |
| require.Equal(t, serviceTier, *userDTO.ServiceTier) |
| require.NotNil(t, userDTO.InboundEndpoint) |
| require.Equal(t, inboundEndpoint, *userDTO.InboundEndpoint) |
| require.NotNil(t, userDTO.UpstreamEndpoint) |
| require.Equal(t, upstreamEndpoint, *userDTO.UpstreamEndpoint) |
| require.NotNil(t, adminDTO.ServiceTier) |
| require.Equal(t, serviceTier, *adminDTO.ServiceTier) |
| require.NotNil(t, adminDTO.InboundEndpoint) |
| require.Equal(t, inboundEndpoint, *adminDTO.InboundEndpoint) |
| require.NotNil(t, adminDTO.UpstreamEndpoint) |
| require.Equal(t, upstreamEndpoint, *adminDTO.UpstreamEndpoint) |
| require.NotNil(t, adminDTO.AccountRateMultiplier) |
| require.InDelta(t, 1.5, *adminDTO.AccountRateMultiplier, 1e-12) |
| } |
|
|
| func f64Ptr(value float64) *float64 { |
| return &value |
| } |
|
|