package config import ( "os" "path/filepath" "testing" ) func TestDefaults(t *testing.T) { cfg, err := Load(nil) if err != nil { t.Fatalf("Load: %v", err) } if cfg.Port != "8080" { t.Fatalf("Port = %q, want 8080", cfg.Port) } if cfg.DBDriver != "sqlite" { t.Fatalf("DBDriver = %q, want sqlite", cfg.DBDriver) } if got := cfg.Addresses(); len(got) != 1 || got[0] != "0.0.0.0:8080" { t.Fatalf("Addresses = %v, want [0.0.0.0:8080]", got) } } func TestPrecedence(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "config.yaml") content := ` logLevel: debug port: "9090" listenAddr: "127.0.0.1" dbDsn: "file:from-file.db" corsOrigins: - "https://forms.example.com" ` if err := os.WriteFile(path, []byte(content), 0o600); err != nil { t.Fatal(err) } t.Setenv("KERERU_LOG_LEVEL", "warn") t.Setenv("KERERU_PORT", "9091") cfg, err := Load([]string{"--conf", path, "--port", "9092"}) if err != nil { t.Fatalf("Load: %v", err) } if cfg.LogLevel != "warn" { t.Fatalf("LogLevel = %q, want env override warn", cfg.LogLevel) } if cfg.Port != "9092" { t.Fatalf("Port = %q, want flag override 9092", cfg.Port) } if cfg.HTTPAddr != "127.0.0.1" { t.Fatalf("HTTPAddr = %q, want file value", cfg.HTTPAddr) } if cfg.DBDSN != "file:from-file.db" { t.Fatalf("DBDSN = %q, want file value", cfg.DBDSN) } if len(cfg.CORSOrigins) != 1 || cfg.CORSOrigins[0] != "https://forms.example.com" { t.Fatalf("CORSOrigins = %v", cfg.CORSOrigins) } } func TestJSONConfigAndIPv6(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "config.json") content := `{"listenAddr":"","listenAddr6":"::1","port":"8081"}` if err := os.WriteFile(path, []byte(content), 0o600); err != nil { t.Fatal(err) } cfg, err := Load([]string{"--conf=" + path}) if err != nil { t.Fatalf("Load: %v", err) } addrs := cfg.Addresses() if len(addrs) != 1 || addrs[0] != "[::1]:8081" { t.Fatalf("Addresses = %v, want [[::1]:8081]", addrs) } } func TestValidateRequiresListener(t *testing.T) { cfg := Default() cfg.HTTPAddr = "" cfg.HTTPAddr6 = "" if err := cfg.Validate(); err == nil { t.Fatal("expected validation error when no listener is configured") } } func TestInvalidPort(t *testing.T) { if _, err := Load([]string{"--port", "not-a-port"}); err == nil { t.Fatal("expected validation error for invalid port") } }