GoTest/test/config_test.go
Table f490a0dac5 将 @internal 目录重命名为 src 目录并做以下变更:
1、将 @pkg  目录移动到变更后的 src 目录;
2、将 @cmd  下的 @main.go 移动到  src 目录;
3、移除 cmd 目录
2025-11-29 04:58:41 +08:00

157 lines
3.5 KiB
Go

package test
import (
"os"
"testing"
"yinli-api/src/pkg/config"
"github.com/stretchr/testify/assert"
)
// TestLoadConfig 测试配置加载
func TestLoadConfig(t *testing.T) {
tests := []struct {
name string
env string
expectError bool
}{
{
name: "加载开发环境配置",
env: "dev",
expectError: false,
},
{
name: "加载预发布环境配置",
env: "stage",
expectError: false,
},
{
name: "加载生产环境配置",
env: "prod",
expectError: false,
},
{
name: "加载不存在的配置",
env: "nonexistent",
expectError: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cfg, err := config.LoadConfig(tt.env)
if tt.expectError {
assert.Error(t, err)
assert.Nil(t, cfg)
} else {
assert.NoError(t, err)
assert.NotNil(t, cfg)
// 验证配置结构
assert.NotEmpty(t, cfg.Server.Port)
assert.NotEmpty(t, cfg.Server.Mode)
assert.NotEmpty(t, cfg.Database.Host)
assert.NotEmpty(t, cfg.Database.Username)
assert.NotEmpty(t, cfg.Database.DBName)
assert.NotEmpty(t, cfg.Redis.Host)
assert.NotEmpty(t, cfg.JWT.Secret)
}
})
}
}
// TestGetDSN 测试数据库连接字符串生成
func TestGetDSN(t *testing.T) {
cfg, err := config.LoadConfig("dev")
assert.NoError(t, err)
assert.NotNil(t, cfg)
dsn := cfg.GetDSN()
assert.NotEmpty(t, dsn)
assert.Contains(t, dsn, cfg.Database.Username)
assert.Contains(t, dsn, cfg.Database.Host)
assert.Contains(t, dsn, cfg.Database.DBName)
}
// TestGetRedisAddr 测试Redis连接地址生成
func TestGetRedisAddr(t *testing.T) {
cfg, err := config.LoadConfig("dev")
assert.NoError(t, err)
assert.NotNil(t, cfg)
addr := cfg.GetRedisAddr()
assert.NotEmpty(t, addr)
assert.Contains(t, addr, cfg.Redis.Host)
}
// TestGetEnv 测试环境变量获取
func TestGetEnv(t *testing.T) {
// 设置测试环境变量
os.Setenv("TEST_VAR", "test_value")
defer os.Unsetenv("TEST_VAR")
tests := []struct {
name string
key string
defaultValue string
expected string
}{
{
name: "存在的环境变量",
key: "TEST_VAR",
defaultValue: "default",
expected: "test_value",
},
{
name: "不存在的环境变量",
key: "NON_EXISTENT_VAR",
defaultValue: "default",
expected: "default",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := config.GetEnv(tt.key, tt.defaultValue)
assert.Equal(t, tt.expected, result)
})
}
}
// TestConfigValidation 测试配置验证
func TestConfigValidation(t *testing.T) {
cfg, err := config.LoadConfig("dev")
assert.NoError(t, err)
assert.NotNil(t, cfg)
// 验证服务器配置
assert.True(t, cfg.Server.Port != "")
assert.Contains(t, []string{"debug", "release"}, cfg.Server.Mode)
// 验证数据库配置
assert.True(t, cfg.Database.Port > 0)
assert.True(t, cfg.Database.MaxIdleConns > 0)
assert.True(t, cfg.Database.MaxOpenConns > 0)
// 验证Redis配置
assert.True(t, cfg.Redis.Port > 0)
assert.True(t, cfg.Redis.PoolSize > 0)
// 验证JWT配置
assert.True(t, cfg.JWT.ExpireHours > 0)
assert.NotEmpty(t, cfg.JWT.Secret)
// 验证频率限制配置
if cfg.RateLimit.Enabled {
assert.True(t, cfg.RateLimit.Requests > 0)
assert.True(t, cfg.RateLimit.Window > 0)
}
// 验证CORS配置
assert.True(t, len(cfg.CORS.AllowOrigins) > 0)
assert.True(t, len(cfg.CORS.AllowMethods) > 0)
assert.True(t, len(cfg.CORS.AllowHeaders) > 0)
}