| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- package config
- import (
- "os"
- "path/filepath"
- "testing"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- )
- func TestLoadConfig(t *testing.T) {
- // 创建临时配置文件
- tempDir := t.TempDir()
- configPath := filepath.Join(tempDir, "test_config.toml")
- configContent := `
- [server]
- ip = "127.0.0.1"
- port = 9090
- [log]
- level = "debug"
- development = true
- encoding = "console"
- output_paths = ["stdout", "test.log"]
- log_dir = "./test_logs"
- [audit]
- enabled = true
- database_path = "./test_audit.db"
- retention_days = 30
- buffer_size = 500
- [storage]
- type = "db"
- config_path = "./test_config.toml"
- sql_base_dir = "./test_sql"
- database_path = "./test_storage.db"
- data_file = "./test_data.toml"
- `
- err := os.WriteFile(configPath, []byte(configContent), 0644)
- require.NoError(t, err)
- // 加载配置
- cfg, err := LoadConfig(configPath)
- require.NoError(t, err)
- // 验证配置值
- assert.Equal(t, "127.0.0.1", cfg.Server.Ip)
- assert.Equal(t, 9090, cfg.Server.Port)
- assert.Equal(t, "debug", cfg.Log.Level)
- assert.True(t, cfg.Log.Development)
- assert.Equal(t, "console", cfg.Log.Encoding)
- assert.Equal(t, []string{"stdout", "test.log"}, cfg.Log.OutputPaths)
- assert.Equal(t, "./test_logs", cfg.Log.LogDir)
- assert.True(t, cfg.Audit.Enabled)
- assert.Equal(t, "./test_audit.db", cfg.Audit.DatabasePath)
- assert.Equal(t, 30, cfg.Audit.RetentionDays)
- assert.Equal(t, 500, cfg.Audit.BufferSize)
- assert.Equal(t, "db", cfg.Storage.Type)
- assert.Equal(t, "./test_config.toml", cfg.Storage.ConfigPath)
- assert.Equal(t, "./test_sql", cfg.Storage.SQLBaseDir)
- assert.Equal(t, "./test_storage.db", cfg.Storage.DatabasePath)
- assert.Equal(t, "./test_data.toml", cfg.Storage.DataFile)
- }
- func TestSetDefaults(t *testing.T) {
- cfg := &AppConfig{}
- // 设置默认值
- cfg.SetDefaults()
- // 验证默认值
- assert.Equal(t, 8080, cfg.Server.Port)
- assert.Equal(t, "info", cfg.Log.Level)
- assert.Equal(t, "json", cfg.Log.Encoding)
- assert.Equal(t, []string{"stdout"}, cfg.Log.OutputPaths)
- assert.Equal(t, "./DBconfig/logs", cfg.Log.LogDir)
- assert.Equal(t, "./DBconfig/audit.db", cfg.Audit.DatabasePath)
- assert.Equal(t, 90, cfg.Audit.RetentionDays)
- assert.Equal(t, 1000, cfg.Audit.BufferSize)
- assert.Equal(t, "./DBconfig/sqlfiles", cfg.Storage.SQLBaseDir)
- assert.Equal(t, "./DBconfig/data.toml", cfg.Storage.DataFile)
- }
- func TestValidate(t *testing.T) {
- // 有效的配置
- cfg := &AppConfig{}
- cfg.SetDefaults()
- err := cfg.Validate()
- assert.NoError(t, err)
- // 无效的端口
- invalidCfg := &AppConfig{}
- invalidCfg.SetDefaults()
- invalidCfg.Server.Port = 99999
- err = invalidCfg.Validate()
- assert.Error(t, err)
- assert.Contains(t, err.Error(), "invalid server port")
- // 无效的日志级别
- invalidCfg2 := &AppConfig{}
- invalidCfg2.SetDefaults()
- invalidCfg2.Log.Level = "invalid"
- err = invalidCfg2.Validate()
- assert.Error(t, err)
- assert.Contains(t, err.Error(), "invalid log level")
- // 无效的编码
- invalidCfg3 := &AppConfig{}
- invalidCfg3.SetDefaults()
- invalidCfg3.Log.Encoding = "invalid"
- err = invalidCfg3.Validate()
- assert.Error(t, err)
- assert.Contains(t, err.Error(), "invalid log encoding")
- }
- func TestGetLogLevel(t *testing.T) {
- logConfig := &LogConfig{}
- // 测试各种日志级别
- testCases := []struct {
- level string
- expected string
- }{
- {"debug", "debug"},
- {"info", "info"},
- {"warn", "warn"},
- {"warning", "warn"},
- {"error", "error"},
- {"fatal", "fatal"},
- {"invalid", "info"}, // 默认值
- }
- for _, tc := range testCases {
- logConfig.Level = tc.level
- level := logConfig.GetLogLevel()
- assert.Equal(t, tc.expected, level.String())
- }
- }
- func TestGetOutputPaths(t *testing.T) {
- logConfig := &LogConfig{
- LogDir: "/tmp/logs",
- OutputPaths: []string{"stdout", "app.log", "C:/absolute/path.log"},
- }
- paths := logConfig.GetOutputPaths()
- assert.Contains(t, paths, "stdout")
- assert.Contains(t, paths, "C:/absolute/path.log")
- // 相对路径应该被转换为绝对路径
- expectedPath := filepath.Join("/tmp/logs", "app.log")
- found := false
- for _, path := range paths {
- if path == expectedPath {
- found = true
- break
- }
- }
- assert.True(t, found, "相对路径应该被转换为绝对路径,期望: %s, 实际: %v", expectedPath, paths)
- }
- func TestCreateDirectories(t *testing.T) {
- tempDir := t.TempDir()
- cfg := &AppConfig{}
- cfg.SetDefaults()
- // 修改路径为临时目录
- cfg.Log.LogDir = filepath.Join(tempDir, "logs")
- cfg.Audit.DatabasePath = filepath.Join(tempDir, "audit.db")
- cfg.Storage.SQLBaseDir = filepath.Join(tempDir, "sql")
- cfg.Storage.DataFile = filepath.Join(tempDir, "data.toml")
- // 创建目录
- err := cfg.CreateDirectories()
- assert.NoError(t, err)
- // 验证目录是否创建成功
- dirs := []string{
- cfg.Log.LogDir,
- filepath.Dir(cfg.Audit.DatabasePath),
- cfg.Storage.SQLBaseDir,
- filepath.Dir(cfg.Storage.DataFile),
- }
- for _, dir := range dirs {
- _, err := os.Stat(dir)
- assert.NoError(t, err, "目录应该被创建: %s", dir)
- }
- }
|