config_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package config
  2. import (
  3. "os"
  4. "path/filepath"
  5. "testing"
  6. "time"
  7. )
  8. var configEnvironment = []string{
  9. "VOCAT_CONFIG",
  10. "VOCAT_ADDR",
  11. "VOCAT_DATABASE_PATH",
  12. "VOCAT_ADMIN_USERNAME",
  13. "VOCAT_ADMIN_PASSWORD",
  14. "VOCAT_SESSION_TTL",
  15. "VOCAT_SECURE_COOKIES",
  16. "VOCAT_SHUTDOWN_TIMEOUT",
  17. "VOCAT_MAX_REQUEST_BODY_BYTES",
  18. }
  19. func clearConfigEnvironment(t *testing.T) {
  20. t.Helper()
  21. for _, name := range configEnvironment {
  22. t.Setenv(name, "")
  23. if err := os.Unsetenv(name); err != nil {
  24. t.Fatalf("unset %s: %v", name, err)
  25. }
  26. }
  27. }
  28. func TestLoadDefaults(t *testing.T) {
  29. clearConfigEnvironment(t)
  30. cfg, err := Load()
  31. if err != nil {
  32. t.Fatalf("Load() error = %v", err)
  33. }
  34. if cfg.Address != "0.0.0.0:7575" {
  35. t.Fatalf("Address = %q", cfg.Address)
  36. }
  37. if !cfg.UsesDefaultCredentials() {
  38. t.Fatal("expected bootstrap credentials")
  39. }
  40. }
  41. func TestLoadFileThenEnvironmentOverride(t *testing.T) {
  42. clearConfigEnvironment(t)
  43. path := filepath.Join(t.TempDir(), "vocat.json")
  44. content := []byte(`{
  45. "address": "127.0.0.1:8000",
  46. "database_path": "/tmp/from-file.db",
  47. "admin_username": "operator",
  48. "admin_password": "from-file",
  49. "session_ttl": "2h",
  50. "secure_cookies": false,
  51. "shutdown_timeout": "12s",
  52. "max_request_body_bytes": 4096
  53. }`)
  54. if err := os.WriteFile(path, content, 0o600); err != nil {
  55. t.Fatal(err)
  56. }
  57. t.Setenv("VOCAT_CONFIG", path)
  58. t.Setenv("VOCAT_ADDR", "0.0.0.0:9000")
  59. t.Setenv("VOCAT_SECURE_COOKIES", "true")
  60. cfg, err := Load()
  61. if err != nil {
  62. t.Fatalf("Load() error = %v", err)
  63. }
  64. if cfg.Address != "0.0.0.0:9000" || !cfg.SecureCookies {
  65. t.Fatalf("environment override not applied: %+v", cfg)
  66. }
  67. if cfg.AdminUsername != "operator" || cfg.SessionTTL != 2*time.Hour {
  68. t.Fatalf("file values not applied: %+v", cfg)
  69. }
  70. }
  71. func TestLoadRejectsUnknownJSONField(t *testing.T) {
  72. clearConfigEnvironment(t)
  73. path := filepath.Join(t.TempDir(), "vocat.json")
  74. if err := os.WriteFile(path, []byte(`{"unknown": true}`), 0o600); err != nil {
  75. t.Fatal(err)
  76. }
  77. t.Setenv("VOCAT_CONFIG", path)
  78. if _, err := Load(); err == nil {
  79. t.Fatal("Load() unexpectedly accepted unknown field")
  80. }
  81. }
  82. func TestLoadRejectsInvalidEnvironment(t *testing.T) {
  83. clearConfigEnvironment(t)
  84. t.Setenv("VOCAT_SESSION_TTL", "tomorrow")
  85. if _, err := Load(); err == nil {
  86. t.Fatal("Load() unexpectedly accepted invalid duration")
  87. }
  88. }