setting_service_auth_source_defaults_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //go:build unit
  2. package service
  3. import (
  4. "context"
  5. "encoding/json"
  6. "testing"
  7. "github.com/Wei-Shaw/sub2api/internal/config"
  8. "github.com/stretchr/testify/require"
  9. )
  10. type authSourceDefaultsRepoStub struct {
  11. values map[string]string
  12. updates map[string]string
  13. }
  14. func (s *authSourceDefaultsRepoStub) Get(ctx context.Context, key string) (*Setting, error) {
  15. panic("unexpected Get call")
  16. }
  17. func (s *authSourceDefaultsRepoStub) GetValue(ctx context.Context, key string) (string, error) {
  18. panic("unexpected GetValue call")
  19. }
  20. func (s *authSourceDefaultsRepoStub) Set(ctx context.Context, key, value string) error {
  21. panic("unexpected Set call")
  22. }
  23. func (s *authSourceDefaultsRepoStub) GetMultiple(ctx context.Context, keys []string) (map[string]string, error) {
  24. out := make(map[string]string, len(keys))
  25. for _, key := range keys {
  26. if value, ok := s.values[key]; ok {
  27. out[key] = value
  28. }
  29. }
  30. return out, nil
  31. }
  32. func (s *authSourceDefaultsRepoStub) SetMultiple(ctx context.Context, settings map[string]string) error {
  33. s.updates = make(map[string]string, len(settings))
  34. for key, value := range settings {
  35. s.updates[key] = value
  36. if s.values == nil {
  37. s.values = map[string]string{}
  38. }
  39. s.values[key] = value
  40. }
  41. return nil
  42. }
  43. func (s *authSourceDefaultsRepoStub) GetAll(ctx context.Context) (map[string]string, error) {
  44. panic("unexpected GetAll call")
  45. }
  46. func (s *authSourceDefaultsRepoStub) Delete(ctx context.Context, key string) error {
  47. panic("unexpected Delete call")
  48. }
  49. func TestSettingService_GetAuthSourceDefaultSettings_ParsesValuesAndDefaults(t *testing.T) {
  50. repo := &authSourceDefaultsRepoStub{
  51. values: map[string]string{
  52. SettingKeyAuthSourceDefaultEmailBalance: "12.5",
  53. SettingKeyAuthSourceDefaultEmailConcurrency: "7",
  54. SettingKeyAuthSourceDefaultEmailSubscriptions: `[{"group_id":11,"validity_days":30}]`,
  55. SettingKeyAuthSourceDefaultEmailGrantOnSignup: "false",
  56. SettingKeyAuthSourceDefaultLinuxDoGrantOnFirstBind: "true",
  57. SettingKeyForceEmailOnThirdPartySignup: "true",
  58. },
  59. }
  60. svc := NewSettingService(repo, &config.Config{})
  61. got, err := svc.GetAuthSourceDefaultSettings(context.Background())
  62. require.NoError(t, err)
  63. require.Equal(t, 12.5, got.Email.Balance)
  64. require.Equal(t, 7, got.Email.Concurrency)
  65. require.Equal(t, []DefaultSubscriptionSetting{{GroupID: 11, ValidityDays: 30}}, got.Email.Subscriptions)
  66. require.False(t, got.Email.GrantOnSignup)
  67. require.False(t, got.Email.GrantOnFirstBind)
  68. require.Equal(t, 0.0, got.LinuxDo.Balance)
  69. require.Equal(t, 5, got.LinuxDo.Concurrency)
  70. require.Equal(t, []DefaultSubscriptionSetting{}, got.LinuxDo.Subscriptions)
  71. require.False(t, got.LinuxDo.GrantOnSignup)
  72. require.True(t, got.LinuxDo.GrantOnFirstBind)
  73. require.Equal(t, 5, got.OIDC.Concurrency)
  74. require.Equal(t, 5, got.WeChat.Concurrency)
  75. require.False(t, got.OIDC.GrantOnSignup)
  76. require.False(t, got.WeChat.GrantOnSignup)
  77. require.True(t, got.ForceEmailOnThirdPartySignup)
  78. }
  79. func TestSettingService_UpdateAuthSourceDefaultSettings_PersistsAllKeys(t *testing.T) {
  80. repo := &authSourceDefaultsRepoStub{}
  81. svc := NewSettingService(repo, &config.Config{})
  82. err := svc.UpdateAuthSourceDefaultSettings(context.Background(), &AuthSourceDefaultSettings{
  83. Email: ProviderDefaultGrantSettings{
  84. Balance: 1.25,
  85. Concurrency: 3,
  86. Subscriptions: []DefaultSubscriptionSetting{{GroupID: 21, ValidityDays: 14}},
  87. GrantOnSignup: false,
  88. GrantOnFirstBind: true,
  89. },
  90. LinuxDo: ProviderDefaultGrantSettings{
  91. Balance: 2,
  92. Concurrency: 4,
  93. Subscriptions: []DefaultSubscriptionSetting{{GroupID: 22, ValidityDays: 30}},
  94. GrantOnSignup: true,
  95. GrantOnFirstBind: false,
  96. },
  97. OIDC: ProviderDefaultGrantSettings{
  98. Balance: 3,
  99. Concurrency: 5,
  100. Subscriptions: []DefaultSubscriptionSetting{{GroupID: 23, ValidityDays: 60}},
  101. GrantOnSignup: true,
  102. GrantOnFirstBind: true,
  103. },
  104. WeChat: ProviderDefaultGrantSettings{
  105. Balance: 4,
  106. Concurrency: 6,
  107. Subscriptions: []DefaultSubscriptionSetting{{GroupID: 24, ValidityDays: 90}},
  108. GrantOnSignup: false,
  109. GrantOnFirstBind: false,
  110. },
  111. ForceEmailOnThirdPartySignup: true,
  112. })
  113. require.NoError(t, err)
  114. require.Equal(t, "1.25000000", repo.updates[SettingKeyAuthSourceDefaultEmailBalance])
  115. require.Equal(t, "3", repo.updates[SettingKeyAuthSourceDefaultEmailConcurrency])
  116. require.Equal(t, "false", repo.updates[SettingKeyAuthSourceDefaultEmailGrantOnSignup])
  117. require.Equal(t, "true", repo.updates[SettingKeyAuthSourceDefaultEmailGrantOnFirstBind])
  118. require.Equal(t, "true", repo.updates[SettingKeyForceEmailOnThirdPartySignup])
  119. var got []DefaultSubscriptionSetting
  120. require.NoError(t, json.Unmarshal([]byte(repo.updates[SettingKeyAuthSourceDefaultWeChatSubscriptions]), &got))
  121. require.Equal(t, []DefaultSubscriptionSetting{{GroupID: 24, ValidityDays: 90}}, got)
  122. }