config_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package config
  2. import (
  3. "os"
  4. "path/filepath"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestLoadConfig(t *testing.T) {
  10. // 创建临时配置文件
  11. tempDir := t.TempDir()
  12. configPath := filepath.Join(tempDir, "test_config.toml")
  13. configContent := `
  14. [server]
  15. ip = "127.0.0.1"
  16. port = 9090
  17. [log]
  18. level = "debug"
  19. development = true
  20. encoding = "console"
  21. output_paths = ["stdout", "test.log"]
  22. log_dir = "./test_logs"
  23. [audit]
  24. enabled = true
  25. database_path = "./test_audit.db"
  26. retention_days = 30
  27. buffer_size = 500
  28. [storage]
  29. type = "db"
  30. config_path = "./test_config.toml"
  31. sql_base_dir = "./test_sql"
  32. database_path = "./test_storage.db"
  33. data_file = "./test_data.toml"
  34. `
  35. err := os.WriteFile(configPath, []byte(configContent), 0644)
  36. require.NoError(t, err)
  37. // 加载配置
  38. cfg, err := LoadConfig(configPath)
  39. require.NoError(t, err)
  40. // 验证配置值
  41. assert.Equal(t, "127.0.0.1", cfg.Server.Ip)
  42. assert.Equal(t, 9090, cfg.Server.Port)
  43. assert.Equal(t, "debug", cfg.Log.Level)
  44. assert.True(t, cfg.Log.Development)
  45. assert.Equal(t, "console", cfg.Log.Encoding)
  46. assert.Equal(t, []string{"stdout", "test.log"}, cfg.Log.OutputPaths)
  47. assert.Equal(t, "./test_logs", cfg.Log.LogDir)
  48. assert.True(t, cfg.Audit.Enabled)
  49. assert.Equal(t, "./test_audit.db", cfg.Audit.DatabasePath)
  50. assert.Equal(t, 30, cfg.Audit.RetentionDays)
  51. assert.Equal(t, 500, cfg.Audit.BufferSize)
  52. assert.Equal(t, "db", cfg.Storage.Type)
  53. assert.Equal(t, "./test_config.toml", cfg.Storage.ConfigPath)
  54. assert.Equal(t, "./test_sql", cfg.Storage.SQLBaseDir)
  55. assert.Equal(t, "./test_storage.db", cfg.Storage.DatabasePath)
  56. assert.Equal(t, "./test_data.toml", cfg.Storage.DataFile)
  57. }
  58. func TestSetDefaults(t *testing.T) {
  59. cfg := &AppConfig{}
  60. // 设置默认值
  61. cfg.SetDefaults()
  62. // 验证默认值
  63. assert.Equal(t, 8080, cfg.Server.Port)
  64. assert.Equal(t, "info", cfg.Log.Level)
  65. assert.Equal(t, "json", cfg.Log.Encoding)
  66. assert.Equal(t, []string{"stdout"}, cfg.Log.OutputPaths)
  67. assert.Equal(t, "./DBconfig/logs", cfg.Log.LogDir)
  68. assert.Equal(t, "./DBconfig/audit.db", cfg.Audit.DatabasePath)
  69. assert.Equal(t, 90, cfg.Audit.RetentionDays)
  70. assert.Equal(t, 1000, cfg.Audit.BufferSize)
  71. assert.Equal(t, "./DBconfig/sqlfiles", cfg.Storage.SQLBaseDir)
  72. assert.Equal(t, "./DBconfig/data.toml", cfg.Storage.DataFile)
  73. }
  74. func TestValidate(t *testing.T) {
  75. // 有效的配置
  76. cfg := &AppConfig{}
  77. cfg.SetDefaults()
  78. err := cfg.Validate()
  79. assert.NoError(t, err)
  80. // 无效的端口
  81. invalidCfg := &AppConfig{}
  82. invalidCfg.SetDefaults()
  83. invalidCfg.Server.Port = 99999
  84. err = invalidCfg.Validate()
  85. assert.Error(t, err)
  86. assert.Contains(t, err.Error(), "invalid server port")
  87. // 无效的日志级别
  88. invalidCfg2 := &AppConfig{}
  89. invalidCfg2.SetDefaults()
  90. invalidCfg2.Log.Level = "invalid"
  91. err = invalidCfg2.Validate()
  92. assert.Error(t, err)
  93. assert.Contains(t, err.Error(), "invalid log level")
  94. // 无效的编码
  95. invalidCfg3 := &AppConfig{}
  96. invalidCfg3.SetDefaults()
  97. invalidCfg3.Log.Encoding = "invalid"
  98. err = invalidCfg3.Validate()
  99. assert.Error(t, err)
  100. assert.Contains(t, err.Error(), "invalid log encoding")
  101. }
  102. func TestGetLogLevel(t *testing.T) {
  103. logConfig := &LogConfig{}
  104. // 测试各种日志级别
  105. testCases := []struct {
  106. level string
  107. expected string
  108. }{
  109. {"debug", "debug"},
  110. {"info", "info"},
  111. {"warn", "warn"},
  112. {"warning", "warn"},
  113. {"error", "error"},
  114. {"fatal", "fatal"},
  115. {"invalid", "info"}, // 默认值
  116. }
  117. for _, tc := range testCases {
  118. logConfig.Level = tc.level
  119. level := logConfig.GetLogLevel()
  120. assert.Equal(t, tc.expected, level.String())
  121. }
  122. }
  123. func TestGetOutputPaths(t *testing.T) {
  124. logConfig := &LogConfig{
  125. LogDir: "/tmp/logs",
  126. OutputPaths: []string{"stdout", "app.log", "C:/absolute/path.log"},
  127. }
  128. paths := logConfig.GetOutputPaths()
  129. assert.Contains(t, paths, "stdout")
  130. assert.Contains(t, paths, "C:/absolute/path.log")
  131. // 相对路径应该被转换为绝对路径
  132. expectedPath := filepath.Join("/tmp/logs", "app.log")
  133. found := false
  134. for _, path := range paths {
  135. if path == expectedPath {
  136. found = true
  137. break
  138. }
  139. }
  140. assert.True(t, found, "相对路径应该被转换为绝对路径,期望: %s, 实际: %v", expectedPath, paths)
  141. }
  142. func TestCreateDirectories(t *testing.T) {
  143. tempDir := t.TempDir()
  144. cfg := &AppConfig{}
  145. cfg.SetDefaults()
  146. // 修改路径为临时目录
  147. cfg.Log.LogDir = filepath.Join(tempDir, "logs")
  148. cfg.Audit.DatabasePath = filepath.Join(tempDir, "audit.db")
  149. cfg.Storage.SQLBaseDir = filepath.Join(tempDir, "sql")
  150. cfg.Storage.DataFile = filepath.Join(tempDir, "data.toml")
  151. // 创建目录
  152. err := cfg.CreateDirectories()
  153. assert.NoError(t, err)
  154. // 验证目录是否创建成功
  155. dirs := []string{
  156. cfg.Log.LogDir,
  157. filepath.Dir(cfg.Audit.DatabasePath),
  158. cfg.Storage.SQLBaseDir,
  159. filepath.Dir(cfg.Storage.DataFile),
  160. }
  161. for _, dir := range dirs {
  162. _, err := os.Stat(dir)
  163. assert.NoError(t, err, "目录应该被创建: %s", dir)
  164. }
  165. }