Files
sub2api/backend/internal/service/auth_email_oauth_auto_test.go
T
feeeei 4a4b50d807 fix(quota): 平台限额表只保存已配置限额的记录,仪表盘按用量与限额展示平台
user_platform_quotas 只保存至少配置了一档限额的记录;不存在的行等价于不限额。

- 注册播种只为配置了限额的平台建行,一个都没有时不写入
- IncrementUsageWithReset 无行时不再 fail-open 建行
- BatchSnapshotUsage 改为只更新既有活跃行,不再插入无限额的新行
- 仓储 BulkInsertInitial/UpsertForUser 把三档全空的记录视为未配置;
  管理员全量替换接口同样剔除,清空限额即软删并放弃累计用量
- 迁移 238 删除三档全 NULL 的历史行
- 用户仪表盘平台卡片 = 有用量的平台 ∪ 配置了限额的平台,计数改为卡片数
- 管理员限额弹窗对未保存限额的平台禁用"重置窗口"
2026-09-10 16:41:58 +08:00

90 lines
2.3 KiB
Go

//go:build unit
package service
import (
"context"
"testing"
"github.com/Wei-Shaw/sub2api/internal/config"
"github.com/stretchr/testify/require"
)
func newEmailOAuthAutoAuthService(
userRepo UserRepository,
settings map[string]string,
quotaRepo UserPlatformQuotaRepository,
) *AuthService {
cfg := &config.Config{
JWT: config.JWTConfig{
Secret: "test-secret",
ExpireHour: 1,
AccessTokenExpireMinutes: 60,
RefreshTokenExpireDays: 7,
},
Default: config.DefaultConfig{
UserBalance: 3.5,
UserConcurrency: 2,
},
}
settingService := NewSettingService(&settingRepoStub{values: settings}, cfg)
return NewAuthService(
nil, // entClient — nil, updateUserSignupSource early return
userRepo,
nil, // redeemRepo — invitationCode="" 时不触发
&refreshTokenCacheStub{},
cfg,
settingService,
nil, // emailService
nil, // turnstileService
nil, // emailQueueService
nil, // promoService
nil, // defaultSubAssigner — nil, assignSubscriptions early return
nil, // affiliateService — nil, bindOAuthAffiliate early return
quotaRepo,
)
}
func TestEmailOAuthAuto_SnapshotsPlatformQuotaDefaults(t *testing.T) {
userRepo := &userRepoStub{nextID: 88}
quotaRepo := &userPlatformQuotaRepoStub{}
svc := newEmailOAuthAutoAuthService(
userRepo,
map[string]string{
SettingKeyRegistrationEnabled: "true",
SettingKeyDefaultPlatformQuotas: `{"gemini": {"monthly": 100.0}}`,
},
quotaRepo,
)
user, err := svc.createEmailOAuthUser(
context.Background(),
"newoauth@example.com",
"newoauth",
"github",
"", // invitationCode
"", // affiliateCode
)
require.NoError(t, err)
require.NotNil(t, user)
require.Equal(t, int64(88), user.ID)
require.Len(t, quotaRepo.bulkInsertCalls, 1, "createEmailOAuthUser must snapshot platform quotas via BulkInsertInitial")
records := quotaRepo.bulkInsertCalls[0]
require.Len(t, records, 1, "only platforms with a configured limit get a row")
var geminiRecord *UserPlatformQuotaRecord
for i := range records {
if records[i].Platform == "gemini" {
geminiRecord = &records[i]
break
}
}
require.NotNil(t, geminiRecord, "expected gemini platform record")
require.NotNil(t, geminiRecord.MonthlyLimitUSD)
require.InDelta(t, 100.0, *geminiRecord.MonthlyLimitUSD, 0.0001)
}