mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-14 12:02:27 +08:00
OpenCode Go 上游(https://opencode.ai/zen/go/v1)官方提供用量端点 GET /zen/go/v1/usage(Bearer 复用消费 key),返回 rolling(5h)/weekly/monthly 三窗口的 percent 与 resetsAt。本提交为 openai apikey 账号(base_url 为 opencode.ai/zen/go/v1)接入该用量窗口: - 后端:OpenCodeGoUsageService——手动刷新(每账号 10s 节流)、 周期自动刷新(全局开关 + 账号开关双开启,interval 5-1440 分钟, leader lock + 每轮 20 账号 + 并发 4)、失败指数退避(上限 24h)、 Retry-After 尊重;401→unauthorized、403→failed;snapshot 持久化于 accounts.extra(单账号写入,无分组 CAS、无会话加密) - admin API:settings GET/PUT、/:id/opencode-go-usage GET、 auto-refresh PUT、refresh POST(与 Ollama Cloud usage 同构) - 前端:账号列表行内三窗口进度条(复用 UsageProgressBar)、 编辑弹窗内配置面板(详情+手动刷新+auto-refresh)、全局设置卡片、 en/zh i18n 验证: - 上游端点已用生产真实 Go key 实测 200,响应 {"usage":{"rolling":{"status":"ok","percent":6,...},...}}(2026-08-13) - go build ./... OK;service/handler/repo/dto/cmd 全量回归 OK - 新增单测 20 例(解析 401/403/畸形 JSON、退避、节流等)全绿 - frontend vitest 新增 7 例 + Ollama 回归 4 例全绿;vue-tsc 零错误
109 lines
3.1 KiB
Go
109 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/Wei-Shaw/sub2api/internal/config"
|
|
"github.com/Wei-Shaw/sub2api/internal/handler"
|
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestProvideServiceBuildInfo(t *testing.T) {
|
|
in := handler.BuildInfo{
|
|
Version: "v-test",
|
|
BuildType: "release",
|
|
}
|
|
out := provideServiceBuildInfo(in)
|
|
require.Equal(t, in.Version, out.Version)
|
|
require.Equal(t, in.BuildType, out.BuildType)
|
|
}
|
|
|
|
func TestProvideCleanup_WithMinimalDependencies_NoPanic(t *testing.T) {
|
|
cfg := &config.Config{}
|
|
|
|
oauthSvc := service.NewOAuthService(nil, nil)
|
|
openAIOAuthSvc := service.NewOpenAIOAuthService(nil, nil)
|
|
geminiOAuthSvc := service.NewGeminiOAuthService(nil, nil, nil, nil, cfg)
|
|
antigravityOAuthSvc := service.NewAntigravityOAuthService(nil)
|
|
|
|
tokenRefreshSvc := service.NewTokenRefreshService(
|
|
nil,
|
|
oauthSvc,
|
|
openAIOAuthSvc,
|
|
geminiOAuthSvc,
|
|
antigravityOAuthSvc,
|
|
nil,
|
|
nil,
|
|
cfg,
|
|
nil,
|
|
)
|
|
accountExpirySvc := service.NewAccountExpiryService(nil, time.Second)
|
|
codexVersionSyncSvc := service.NewOpenAICodexVersionSyncService(nil, nil, nil, time.Second)
|
|
claudeCodeVersionSyncSvc := service.NewClaudeCodeVersionSyncService(nil, nil, nil, time.Second)
|
|
proxyExpirySvc := service.NewProxyExpiryService(nil, time.Second)
|
|
subscriptionExpirySvc := service.NewSubscriptionExpiryService(nil, time.Second)
|
|
pricingSvc := service.NewPricingService(cfg, nil)
|
|
emailQueueSvc := service.NewEmailQueueService(nil, 1)
|
|
billingCacheSvc := service.NewBillingCacheService(nil, nil, nil, nil, nil, nil, cfg, nil)
|
|
idempotencyCleanupSvc := service.NewIdempotencyCleanupService(nil, cfg)
|
|
schedulerSnapshotSvc := service.NewSchedulerSnapshotService(nil, nil, nil, nil, cfg)
|
|
opsSystemLogSinkSvc := service.NewOpsSystemLogSink(nil)
|
|
|
|
cleanup := provideCleanup(
|
|
nil, // entClient
|
|
nil, // redis
|
|
&service.OpsMetricsCollector{},
|
|
&service.OpsAggregationService{},
|
|
&service.OpsAlertEvaluatorService{},
|
|
&service.OpsCleanupService{},
|
|
&service.OpsScheduledReportService{},
|
|
opsSystemLogSinkSvc,
|
|
nil, // opsService
|
|
nil, // opsIngressRejectAggregator
|
|
nil, // apiKeyService
|
|
nil, // authCacheInvalidationWorker
|
|
schedulerSnapshotSvc,
|
|
tokenRefreshSvc,
|
|
accountExpirySvc,
|
|
nil, // cnProviderBalanceCheck
|
|
codexVersionSyncSvc,
|
|
claudeCodeVersionSyncSvc,
|
|
proxyExpirySvc,
|
|
subscriptionExpirySvc,
|
|
&service.UsageCleanupService{},
|
|
idempotencyCleanupSvc,
|
|
&service.BatchImageCleanupService{},
|
|
nil, // batchImageWorker
|
|
pricingSvc,
|
|
emailQueueSvc,
|
|
billingCacheSvc,
|
|
&service.UsageRecordWorkerPool{},
|
|
&service.SubscriptionService{},
|
|
oauthSvc,
|
|
openAIOAuthSvc,
|
|
geminiOAuthSvc,
|
|
antigravityOAuthSvc,
|
|
nil, // grokOAuth
|
|
nil, // openAIGateway
|
|
nil, // scheduledTestRunner
|
|
nil, // backupSvc
|
|
nil, // paymentOrderExpiry
|
|
nil, // channelMonitorRunner
|
|
nil, // channelMonitorV2Aggregator
|
|
nil, // quotaFlusher
|
|
nil, // upstreamBillingProbe
|
|
nil, // ollamaCloudUsage
|
|
nil, // opencodeGoUsage
|
|
nil, // auditLog
|
|
nil, // openAIAutoReset
|
|
nil, // promptAudit
|
|
nil, // pluginManager
|
|
)
|
|
|
|
require.NotPanics(t, func() {
|
|
cleanup()
|
|
})
|
|
}
|