mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-03-30 02:09:43 +00:00
- 打通 service_tier 在 OpenAI HTTP、WS、passthrough 与 usage 记录中的传递 - 修正 priority/flex 计费逻辑,并将 fast 归一化为 priority - 在用户端和管理端补齐服务档位与计费明细展示 - 补齐前后端测试,并修复 WS 限流信号重复持久化导致的全量回归失败 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
100 lines
2.6 KiB
Go
100 lines
2.6 KiB
Go
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"
|
|
log := &service.UsageLog{
|
|
RequestID: "req_3",
|
|
Model: "gpt-5.4",
|
|
ServiceTier: &serviceTier,
|
|
AccountRateMultiplier: f64Ptr(1.5),
|
|
}
|
|
|
|
userDTO := UsageLogFromService(log)
|
|
adminDTO := UsageLogFromServiceAdmin(log)
|
|
|
|
require.NotNil(t, userDTO.ServiceTier)
|
|
require.Equal(t, serviceTier, *userDTO.ServiceTier)
|
|
require.NotNil(t, adminDTO.ServiceTier)
|
|
require.Equal(t, serviceTier, *adminDTO.ServiceTier)
|
|
require.NotNil(t, adminDTO.AccountRateMultiplier)
|
|
require.InDelta(t, 1.5, *adminDTO.AccountRateMultiplier, 1e-12)
|
|
}
|
|
|
|
func f64Ptr(value float64) *float64 {
|
|
return &value
|
|
}
|