auth_email_oauth_auto_test.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //go:build unit
  2. package service
  3. import (
  4. "context"
  5. "testing"
  6. "github.com/Wei-Shaw/sub2api/internal/config"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func newEmailOAuthAutoAuthService(
  10. userRepo UserRepository,
  11. settings map[string]string,
  12. quotaRepo UserPlatformQuotaRepository,
  13. ) *AuthService {
  14. cfg := &config.Config{
  15. JWT: config.JWTConfig{
  16. Secret: "test-secret",
  17. ExpireHour: 1,
  18. AccessTokenExpireMinutes: 60,
  19. RefreshTokenExpireDays: 7,
  20. },
  21. Default: config.DefaultConfig{
  22. UserBalance: 3.5,
  23. UserConcurrency: 2,
  24. },
  25. }
  26. settingService := NewSettingService(&settingRepoStub{values: settings}, cfg)
  27. return NewAuthService(
  28. nil, // entClient — nil, updateUserSignupSource early return
  29. userRepo,
  30. nil, // redeemRepo — invitationCode="" 时不触发
  31. &refreshTokenCacheStub{},
  32. cfg,
  33. settingService,
  34. nil, // emailService
  35. nil, // turnstileService
  36. nil, // emailQueueService
  37. nil, // promoService
  38. nil, // defaultSubAssigner — nil, assignSubscriptions early return
  39. nil, // affiliateService — nil, bindOAuthAffiliate early return
  40. quotaRepo,
  41. )
  42. }
  43. func TestEmailOAuthAuto_SnapshotsPlatformQuotaDefaults(t *testing.T) {
  44. userRepo := &userRepoStub{nextID: 88}
  45. quotaRepo := &userPlatformQuotaRepoStub{}
  46. svc := newEmailOAuthAutoAuthService(
  47. userRepo,
  48. map[string]string{
  49. SettingKeyRegistrationEnabled: "true",
  50. SettingKeyDefaultPlatformQuotas: `{"gemini": {"monthly": 100.0}}`,
  51. },
  52. quotaRepo,
  53. )
  54. user, err := svc.createEmailOAuthUser(
  55. context.Background(),
  56. "newoauth@example.com",
  57. "newoauth",
  58. "github",
  59. "", // invitationCode
  60. "", // affiliateCode
  61. )
  62. require.NoError(t, err)
  63. require.NotNil(t, user)
  64. require.Equal(t, int64(88), user.ID)
  65. require.Len(t, quotaRepo.bulkInsertCalls, 1, "createEmailOAuthUser must snapshot platform quotas via BulkInsertInitial")
  66. records := quotaRepo.bulkInsertCalls[0]
  67. var geminiRecord *UserPlatformQuotaRecord
  68. for i := range records {
  69. if records[i].Platform == "gemini" {
  70. geminiRecord = &records[i]
  71. break
  72. }
  73. }
  74. require.NotNil(t, geminiRecord, "expected gemini platform record")
  75. require.NotNil(t, geminiRecord.MonthlyLimitUSD)
  76. require.InDelta(t, 100.0, *geminiRecord.MonthlyLimitUSD, 0.0001)
  77. }