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) } }