setting_service_wechat_config_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. type settingWeChatRepoStub struct {
  10. values map[string]string
  11. }
  12. func (s *settingWeChatRepoStub) Get(context.Context, string) (*Setting, error) {
  13. panic("unexpected Get call")
  14. }
  15. func (s *settingWeChatRepoStub) GetValue(_ context.Context, key string) (string, error) {
  16. if value, ok := s.values[key]; ok {
  17. return value, nil
  18. }
  19. return "", ErrSettingNotFound
  20. }
  21. func (s *settingWeChatRepoStub) Set(context.Context, string, string) error {
  22. panic("unexpected Set call")
  23. }
  24. func (s *settingWeChatRepoStub) GetMultiple(_ context.Context, keys []string) (map[string]string, error) {
  25. out := make(map[string]string, len(keys))
  26. for _, key := range keys {
  27. if value, ok := s.values[key]; ok {
  28. out[key] = value
  29. }
  30. }
  31. return out, nil
  32. }
  33. func (s *settingWeChatRepoStub) SetMultiple(context.Context, map[string]string) error {
  34. panic("unexpected SetMultiple call")
  35. }
  36. func (s *settingWeChatRepoStub) GetAll(context.Context) (map[string]string, error) {
  37. panic("unexpected GetAll call")
  38. }
  39. func (s *settingWeChatRepoStub) Delete(context.Context, string) error {
  40. panic("unexpected Delete call")
  41. }
  42. func TestSettingService_GetWeChatConnectOAuthConfig_UsesDatabaseOverrides(t *testing.T) {
  43. repo := &settingWeChatRepoStub{
  44. values: map[string]string{
  45. SettingKeyWeChatConnectEnabled: "true",
  46. SettingKeyWeChatConnectAppID: "wx-db-app",
  47. SettingKeyWeChatConnectAppSecret: "wx-db-secret",
  48. SettingKeyWeChatConnectMode: "mp",
  49. SettingKeyWeChatConnectScopes: "snsapi_base",
  50. SettingKeyWeChatConnectOpenEnabled: "true",
  51. SettingKeyWeChatConnectMPEnabled: "true",
  52. SettingKeyWeChatConnectRedirectURL: "https://api.example.com/api/v1/auth/oauth/wechat/callback",
  53. SettingKeyWeChatConnectFrontendRedirectURL: "/auth/wechat/callback",
  54. },
  55. }
  56. svc := NewSettingService(repo, &config.Config{})
  57. got, err := svc.GetWeChatConnectOAuthConfig(context.Background())
  58. require.NoError(t, err)
  59. require.True(t, got.Enabled)
  60. require.Equal(t, "wx-db-app", got.AppIDForMode("mp"))
  61. require.Equal(t, "wx-db-secret", got.AppSecretForMode("mp"))
  62. require.True(t, got.OpenEnabled)
  63. require.True(t, got.MPEnabled)
  64. require.Equal(t, "mp", got.Mode)
  65. require.Equal(t, "snsapi_base", got.Scopes)
  66. require.Equal(t, "https://api.example.com/api/v1/auth/oauth/wechat/callback", got.RedirectURL)
  67. require.Equal(t, "/auth/wechat/callback", got.FrontendRedirectURL)
  68. }
  69. func TestSettingService_GetWeChatConnectOAuthConfig_FallsBackToConfigWhenDatabaseEmpty(t *testing.T) {
  70. repo := &settingWeChatRepoStub{values: map[string]string{}}
  71. svc := NewSettingService(repo, &config.Config{
  72. WeChat: config.WeChatConnectConfig{
  73. Enabled: true,
  74. OpenEnabled: true,
  75. MPEnabled: true,
  76. Mode: "open",
  77. OpenAppID: "wx-open-config",
  78. OpenAppSecret: "wx-open-secret",
  79. MPAppID: "wx-mp-config",
  80. MPAppSecret: "wx-mp-secret",
  81. FrontendRedirectURL: "/auth/wechat/config-callback",
  82. },
  83. })
  84. got, err := svc.GetWeChatConnectOAuthConfig(context.Background())
  85. require.NoError(t, err)
  86. require.True(t, got.Enabled)
  87. require.True(t, got.OpenEnabled)
  88. require.True(t, got.MPEnabled)
  89. require.Equal(t, "wx-open-config", got.AppIDForMode("open"))
  90. require.Equal(t, "wx-open-secret", got.AppSecretForMode("open"))
  91. require.Equal(t, "wx-mp-config", got.AppIDForMode("mp"))
  92. require.Equal(t, "wx-mp-secret", got.AppSecretForMode("mp"))
  93. require.Equal(t, "/auth/wechat/config-callback", got.FrontendRedirectURL)
  94. require.Empty(t, got.RedirectURL)
  95. }
  96. func TestSettingService_GetWeChatConnectOAuthConfig_IgnoresSyntheticDisabledCapabilitiesFromMigration118(t *testing.T) {
  97. repo := &settingWeChatRepoStub{
  98. values: map[string]string{
  99. SettingKeyWeChatConnectOpenEnabled: "false",
  100. SettingKeyWeChatConnectMPEnabled: "false",
  101. },
  102. }
  103. svc := NewSettingService(repo, &config.Config{
  104. WeChat: config.WeChatConnectConfig{
  105. Enabled: true,
  106. OpenEnabled: true,
  107. MPEnabled: true,
  108. Mode: "open",
  109. OpenAppID: "wx-open-config",
  110. OpenAppSecret: "wx-open-secret",
  111. MPAppID: "wx-mp-config",
  112. MPAppSecret: "wx-mp-secret",
  113. FrontendRedirectURL: "/auth/wechat/config-callback",
  114. },
  115. })
  116. got, err := svc.GetWeChatConnectOAuthConfig(context.Background())
  117. require.NoError(t, err)
  118. require.True(t, got.Enabled)
  119. require.True(t, got.OpenEnabled)
  120. require.True(t, got.MPEnabled)
  121. require.Equal(t, "wx-open-config", got.AppIDForMode("open"))
  122. require.Equal(t, "wx-mp-config", got.AppIDForMode("mp"))
  123. }
  124. func TestSettingService_ParseSettings_FallsBackToConfigForWeChatAdminView(t *testing.T) {
  125. svc := NewSettingService(&settingWeChatRepoStub{values: map[string]string{}}, &config.Config{
  126. WeChat: config.WeChatConnectConfig{
  127. Enabled: true,
  128. OpenEnabled: true,
  129. Mode: "open",
  130. OpenAppID: "wx-open-config",
  131. OpenAppSecret: "wx-open-secret",
  132. FrontendRedirectURL: "/auth/wechat/config-callback",
  133. },
  134. })
  135. got := svc.parseSettings(map[string]string{})
  136. require.True(t, got.WeChatConnectEnabled)
  137. require.True(t, got.WeChatConnectOpenEnabled)
  138. require.Equal(t, "wx-open-config", got.WeChatConnectOpenAppID)
  139. require.True(t, got.WeChatConnectOpenAppSecretConfigured)
  140. require.Equal(t, "/auth/wechat/config-callback", got.WeChatConnectFrontendRedirectURL)
  141. require.Equal(t, "open", got.WeChatConnectMode)
  142. require.Equal(t, "snsapi_login", got.WeChatConnectScopes)
  143. }