| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- //go:build unit
- package service
- import (
- "context"
- "testing"
- "github.com/Wei-Shaw/sub2api/internal/config"
- "github.com/stretchr/testify/require"
- )
- type settingPublicRepoStub struct {
- values map[string]string
- err error
- }
- func (s *settingPublicRepoStub) Get(ctx context.Context, key string) (*Setting, error) {
- panic("unexpected Get call")
- }
- func (s *settingPublicRepoStub) GetValue(ctx context.Context, key string) (string, error) {
- panic("unexpected GetValue call")
- }
- func (s *settingPublicRepoStub) Set(ctx context.Context, key, value string) error {
- panic("unexpected Set call")
- }
- func (s *settingPublicRepoStub) GetMultiple(ctx context.Context, keys []string) (map[string]string, error) {
- if s.err != nil {
- return nil, s.err
- }
- out := make(map[string]string, len(keys))
- for _, key := range keys {
- if value, ok := s.values[key]; ok {
- out[key] = value
- }
- }
- return out, nil
- }
- func (s *settingPublicRepoStub) SetMultiple(ctx context.Context, settings map[string]string) error {
- panic("unexpected SetMultiple call")
- }
- func (s *settingPublicRepoStub) GetAll(ctx context.Context) (map[string]string, error) {
- panic("unexpected GetAll call")
- }
- func (s *settingPublicRepoStub) Delete(ctx context.Context, key string) error {
- panic("unexpected Delete call")
- }
- func TestSettingService_GetPublicSettings_ExposesRegistrationEmailSuffixWhitelist(t *testing.T) {
- repo := &settingPublicRepoStub{
- values: map[string]string{
- SettingKeyRegistrationEnabled: "true",
- SettingKeyEmailVerifyEnabled: "true",
- SettingKeyRegistrationEmailSuffixWhitelist: `["@EXAMPLE.com"," @foo.bar ","*.EDU.CN","@invalid_domain",""]`,
- },
- }
- svc := NewSettingService(repo, &config.Config{})
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.Equal(t, []string{"@example.com", "@foo.bar", "*.edu.cn"}, settings.RegistrationEmailSuffixWhitelist)
- }
- func TestSettingService_GetPublicSettings_ExposesTablePreferences(t *testing.T) {
- repo := &settingPublicRepoStub{
- values: map[string]string{
- SettingKeyTableDefaultPageSize: "50",
- SettingKeyTablePageSizeOptions: "[20,50,100]",
- },
- }
- svc := NewSettingService(repo, &config.Config{})
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.Equal(t, 50, settings.TableDefaultPageSize)
- require.Equal(t, []int{20, 50, 100}, settings.TablePageSizeOptions)
- }
- func TestSettingService_GetPublicSettings_ExposesCompactHomeEnabled(t *testing.T) {
- repo := &settingPublicRepoStub{
- values: map[string]string{
- SettingKeyCompactHomeEnabled: "true",
- },
- }
- svc := NewSettingService(repo, &config.Config{})
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.True(t, settings.CompactHomeEnabled)
- missingSettings, err := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{}).
- GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.False(t, missingSettings.CompactHomeEnabled)
- }
- func TestSettingService_ChannelMonitorHideThroughputDefaultsToPrivate(t *testing.T) {
- missing := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{}).GetChannelMonitorRuntime(context.Background())
- require.True(t, missing.HideThroughput)
- public, err := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{}).GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.True(t, public.ChannelMonitorHideThroughput)
- for _, value := range []string{"false", "0", "off", "disabled"} {
- runtime := NewSettingService(&settingPublicRepoStub{values: map[string]string{
- SettingKeyChannelMonitorHideThroughput: value,
- }}, &config.Config{}).GetChannelMonitorRuntime(context.Background())
- require.False(t, runtime.HideThroughput, "value=%q", value)
- }
- }
- func TestSettingService_ChannelMonitorShowQuotaFailsClosed(t *testing.T) {
- // 缺省(迁移插入 'false' / 老库无行)一律不展示。
- missingRuntime := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{}).GetChannelMonitorRuntime(context.Background())
- require.False(t, missingRuntime.ShowQuota)
- missingPublic, err := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{}).
- GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.False(t, missingPublic.ChannelMonitorShowQuota)
- // 仅字面 "true" 视为开启;其余值(含异常值)fail-closed。
- runtime := NewSettingService(&settingPublicRepoStub{values: map[string]string{
- SettingKeyChannelMonitorShowQuota: "true",
- }}, &config.Config{}).GetChannelMonitorRuntime(context.Background())
- require.True(t, runtime.ShowQuota)
- for _, value := range []string{"false", "TRUE", "1", "yes", "on", "garbage"} {
- rt := NewSettingService(&settingPublicRepoStub{values: map[string]string{
- SettingKeyChannelMonitorShowQuota: value,
- }}, &config.Config{}).GetChannelMonitorRuntime(context.Background())
- require.False(t, rt.ShowQuota, "value=%q", value)
- }
- }
- func TestSettingService_ChannelMonitorHideUserRankingDefaultsToVisible(t *testing.T) {
- missing := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{}).GetChannelMonitorRuntime(context.Background())
- require.False(t, missing.HideUserRanking)
- public, err := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{}).GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.False(t, public.ChannelMonitorHideUserRanking)
- for _, value := range []string{"true", "1", "on", "enabled"} {
- runtime := NewSettingService(&settingPublicRepoStub{values: map[string]string{
- SettingKeyChannelMonitorHideUserRanking: value,
- }}, &config.Config{}).GetChannelMonitorRuntime(context.Background())
- require.True(t, runtime.HideUserRanking, "value=%q", value)
- }
- }
- func TestSettingService_GetPublicSettings_ExposesForceEmailOnThirdPartySignup(t *testing.T) {
- repo := &settingPublicRepoStub{
- values: map[string]string{
- SettingKeyForceEmailOnThirdPartySignup: "true",
- },
- }
- svc := NewSettingService(repo, &config.Config{})
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.True(t, settings.ForceEmailOnThirdPartySignup)
- }
- func TestSettingService_GetPublicSettings_ExposesAllowUserViewErrorRequests(t *testing.T) {
- repo := &settingPublicRepoStub{
- values: map[string]string{
- SettingKeyAllowUserViewErrorRequests: "true",
- },
- }
- svc := NewSettingService(repo, &config.Config{})
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.True(t, settings.AllowUserViewErrorRequests)
- }
- func TestSettingService_GetPublicSettings_ExposesWeChatOAuthModeCapabilities(t *testing.T) {
- svc := NewSettingService(&settingPublicRepoStub{
- values: map[string]string{
- SettingKeyWeChatConnectEnabled: "true",
- SettingKeyWeChatConnectAppID: "wx-mp-app",
- SettingKeyWeChatConnectAppSecret: "wx-mp-secret",
- SettingKeyWeChatConnectMode: "mp",
- SettingKeyWeChatConnectScopes: "snsapi_base",
- SettingKeyWeChatConnectOpenEnabled: "true",
- SettingKeyWeChatConnectMPEnabled: "true",
- SettingKeyWeChatConnectRedirectURL: "https://api.example.com/api/v1/auth/oauth/wechat/callback",
- SettingKeyWeChatConnectFrontendRedirectURL: "/auth/wechat/callback",
- },
- }, &config.Config{})
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.True(t, settings.WeChatOAuthEnabled)
- require.True(t, settings.WeChatOAuthOpenEnabled)
- require.True(t, settings.WeChatOAuthMPEnabled)
- }
- func TestSettingService_GetPublicSettings_DoesNotExposeMobileOnlyWeChatAsWebOAuthAvailable(t *testing.T) {
- svc := NewSettingService(&settingPublicRepoStub{
- values: map[string]string{
- SettingKeyWeChatConnectEnabled: "true",
- SettingKeyWeChatConnectMobileEnabled: "true",
- SettingKeyWeChatConnectMode: "mobile",
- SettingKeyWeChatConnectMobileAppID: "wx-mobile-app",
- SettingKeyWeChatConnectMobileAppSecret: "wx-mobile-secret",
- SettingKeyWeChatConnectFrontendRedirectURL: "/auth/wechat/callback",
- },
- }, &config.Config{})
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.False(t, settings.WeChatOAuthEnabled)
- require.False(t, settings.WeChatOAuthOpenEnabled)
- require.False(t, settings.WeChatOAuthMPEnabled)
- require.True(t, settings.WeChatOAuthMobileEnabled)
- }
- func TestSettingService_GetPublicSettings_FallsBackToConfigForWeChatOAuthCapabilities(t *testing.T) {
- svc := NewSettingService(&settingPublicRepoStub{values: map[string]string{}}, &config.Config{
- WeChat: config.WeChatConnectConfig{
- Enabled: true,
- OpenEnabled: true,
- OpenAppID: "wx-open-config",
- OpenAppSecret: "wx-open-secret",
- FrontendRedirectURL: "/auth/wechat/config-callback",
- },
- })
- settings, err := svc.GetPublicSettings(context.Background())
- require.NoError(t, err)
- require.True(t, settings.WeChatOAuthEnabled)
- require.True(t, settings.WeChatOAuthOpenEnabled)
- require.False(t, settings.WeChatOAuthMPEnabled)
- require.False(t, settings.WeChatOAuthMobileEnabled)
- }
|