setting_handler_public_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //go:build unit
  2. package handler
  3. import (
  4. "context"
  5. "encoding/json"
  6. "net/http"
  7. "net/http/httptest"
  8. "testing"
  9. "github.com/Wei-Shaw/sub2api/internal/config"
  10. "github.com/Wei-Shaw/sub2api/internal/service"
  11. "github.com/gin-gonic/gin"
  12. "github.com/stretchr/testify/require"
  13. )
  14. type settingHandlerPublicRepoStub struct {
  15. values map[string]string
  16. }
  17. func (s *settingHandlerPublicRepoStub) Get(ctx context.Context, key string) (*service.Setting, error) {
  18. panic("unexpected Get call")
  19. }
  20. func (s *settingHandlerPublicRepoStub) GetValue(ctx context.Context, key string) (string, error) {
  21. panic("unexpected GetValue call")
  22. }
  23. func (s *settingHandlerPublicRepoStub) Set(ctx context.Context, key, value string) error {
  24. panic("unexpected Set call")
  25. }
  26. func (s *settingHandlerPublicRepoStub) GetMultiple(ctx context.Context, keys []string) (map[string]string, error) {
  27. out := make(map[string]string, len(keys))
  28. for _, key := range keys {
  29. if value, ok := s.values[key]; ok {
  30. out[key] = value
  31. }
  32. }
  33. return out, nil
  34. }
  35. func (s *settingHandlerPublicRepoStub) SetMultiple(ctx context.Context, settings map[string]string) error {
  36. panic("unexpected SetMultiple call")
  37. }
  38. func (s *settingHandlerPublicRepoStub) GetAll(ctx context.Context) (map[string]string, error) {
  39. panic("unexpected GetAll call")
  40. }
  41. func (s *settingHandlerPublicRepoStub) Delete(ctx context.Context, key string) error {
  42. panic("unexpected Delete call")
  43. }
  44. func TestSettingHandler_GetPublicSettings_ExposesForceEmailOnThirdPartySignup(t *testing.T) {
  45. gin.SetMode(gin.TestMode)
  46. repo := &settingHandlerPublicRepoStub{
  47. values: map[string]string{
  48. service.SettingKeyForceEmailOnThirdPartySignup: "true",
  49. },
  50. }
  51. h := NewSettingHandler(service.NewSettingService(repo, &config.Config{}), "test-version")
  52. recorder := httptest.NewRecorder()
  53. c, _ := gin.CreateTestContext(recorder)
  54. c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/settings/public", nil)
  55. h.GetPublicSettings(c)
  56. require.Equal(t, http.StatusOK, recorder.Code)
  57. var resp struct {
  58. Code int `json:"code"`
  59. Data struct {
  60. ForceEmailOnThirdPartySignup bool `json:"force_email_on_third_party_signup"`
  61. } `json:"data"`
  62. }
  63. require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
  64. require.Equal(t, 0, resp.Code)
  65. require.True(t, resp.Data.ForceEmailOnThirdPartySignup)
  66. }
  67. func TestSettingHandler_GetPublicSettings_ExposesTencentCaptchaConfiguration(t *testing.T) {
  68. gin.SetMode(gin.TestMode)
  69. repo := &settingHandlerPublicRepoStub{
  70. values: map[string]string{
  71. service.SettingKeyTencentCaptchaEnabled: "true",
  72. service.SettingKeyTencentCaptchaAppID: "123456789",
  73. service.SettingKeyTencentCaptchaRegion: service.TencentCaptchaRegionINTL,
  74. },
  75. }
  76. h := NewSettingHandler(service.NewSettingService(repo, &config.Config{}), "test-version")
  77. recorder := httptest.NewRecorder()
  78. c, _ := gin.CreateTestContext(recorder)
  79. c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/settings/public", nil)
  80. h.GetPublicSettings(c)
  81. require.Equal(t, http.StatusOK, recorder.Code)
  82. var resp struct {
  83. Code int `json:"code"`
  84. Data struct {
  85. TencentCaptchaEnabled bool `json:"tencent_captcha_enabled"`
  86. TencentCaptchaAppID string `json:"tencent_captcha_app_id"`
  87. TencentCaptchaRegion string `json:"tencent_captcha_region"`
  88. } `json:"data"`
  89. }
  90. require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
  91. require.Equal(t, 0, resp.Code)
  92. require.True(t, resp.Data.TencentCaptchaEnabled)
  93. require.Equal(t, "123456789", resp.Data.TencentCaptchaAppID)
  94. require.Equal(t, service.TencentCaptchaRegionINTL, resp.Data.TencentCaptchaRegion)
  95. }
  96. func TestSettingHandler_GetPublicSettings_ExposesWeChatOAuthModeCapabilities(t *testing.T) {
  97. gin.SetMode(gin.TestMode)
  98. h := NewSettingHandler(service.NewSettingService(&settingHandlerPublicRepoStub{
  99. values: map[string]string{
  100. service.SettingKeyWeChatConnectEnabled: "true",
  101. service.SettingKeyWeChatConnectAppID: "wx-mp-app",
  102. service.SettingKeyWeChatConnectAppSecret: "wx-mp-secret",
  103. service.SettingKeyWeChatConnectMode: "mp",
  104. service.SettingKeyWeChatConnectScopes: "snsapi_base",
  105. service.SettingKeyWeChatConnectOpenEnabled: "true",
  106. service.SettingKeyWeChatConnectMPEnabled: "true",
  107. service.SettingKeyWeChatConnectRedirectURL: "https://api.example.com/api/v1/auth/oauth/wechat/callback",
  108. service.SettingKeyWeChatConnectFrontendRedirectURL: "/auth/wechat/callback",
  109. },
  110. }, &config.Config{}), "test-version")
  111. recorder := httptest.NewRecorder()
  112. c, _ := gin.CreateTestContext(recorder)
  113. c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/settings/public", nil)
  114. h.GetPublicSettings(c)
  115. require.Equal(t, http.StatusOK, recorder.Code)
  116. var resp struct {
  117. Code int `json:"code"`
  118. Data struct {
  119. WeChatOAuthEnabled bool `json:"wechat_oauth_enabled"`
  120. WeChatOAuthOpenEnabled bool `json:"wechat_oauth_open_enabled"`
  121. WeChatOAuthMPEnabled bool `json:"wechat_oauth_mp_enabled"`
  122. } `json:"data"`
  123. }
  124. require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
  125. require.Equal(t, 0, resp.Code)
  126. require.True(t, resp.Data.WeChatOAuthEnabled)
  127. require.True(t, resp.Data.WeChatOAuthOpenEnabled)
  128. require.True(t, resp.Data.WeChatOAuthMPEnabled)
  129. }