package main import ( "os" "path/filepath" "reflect" "testing" ) func TestReadConfig(t *testing.T) { configContent := ` # http listen address http-address :8080 # Log level (either debug, info, warning, error) log-level info # When multiple alerts are grouped together by Alertmanager, they can either be sent # each on their own (single mode) or be kept together (multi mode) (either single or multi; default is single) alert-mode multi # Optionally protect with HTTP basic authentication user webhookUser password webhookPass labels { order "severity,instance" severity "critical" { priority 5 tags "rotating_light" } severity "info" { priority 1 } instance "example.com" { tags "computer,example" } } ntfy { # URL of the ntfy topic - required topic https://ntfy.sh/alertmanager-alerts # ntfy access control (https://ntfy.sh/docs/config/#access-control) user user password pass } ` expectedCfg := &config{ HTTPAddress: ":8080", LogLevel: "info", alertMode: multi, User: "webhookUser", Password: "webhookPass", ntfy: ntfyConfig{Topic: "https://ntfy.sh/alertmanager-alerts", User: "user", Password: "pass"}, labels: labels{Order: []string{"severity", "instance"}, Label: map[string]labelConfig{ "severity:critical": {Priority: "5", Tags: []string{"rotating_light"}}, "severity:info": {Priority: "1"}, "instance:example.com": {Tags: []string{"computer", "example"}}}}} configPath := filepath.Join(t.TempDir(), "config") err := os.WriteFile(configPath, []byte(configContent), 0600) if err != nil { t.Errorf("failed to write config file: %v", err) } cfg, err := readConfig(configPath) if err != nil { t.Errorf("failed to read config file: %v", err) } if !reflect.DeepEqual(cfg, expectedCfg) { t.Errorf("expected: %v, got %v", expectedCfg, cfg) } }