package main import ( "bytes" "os" "path/filepath" "strings" "testing" ) func TestServeRejectsMissingConfig(t *testing.T) { var out, errOut bytes.Buffer code := runServe([]string{"--config", "/gibt/es/nicht.yaml"}, &out, &errOut) if code == 0 { t.Fatal("fehlende Config muss zum Abbruch führen") } if !strings.Contains(errOut.String(), "nicht.yaml") { t.Errorf("Fehlermeldung muss den Pfad nennen: %q", errOut.String()) } } func TestServeRejectsLooseConfigPermissions(t *testing.T) { dir := t.TempDir() p := filepath.Join(dir, "config.yaml") os.WriteFile(p, []byte("portal:\n listen: \"127.0.0.1:0\"\n"), 0o644) os.Chmod(p, 0o644) var out, errOut bytes.Buffer if code := runServe([]string{"--config", p}, &out, &errOut); code == 0 { t.Fatal("zu offene Dateirechte müssen den Start verhindern") } if !strings.Contains(errOut.String(), "chmod") { t.Errorf("Fehlermeldung sollte den Reparaturbefehl nennen: %q", errOut.String()) } } func TestCheckRejectsUnknownConfigField(t *testing.T) { dir := t.TempDir() p := filepath.Join(dir, "config.yaml") os.WriteFile(p, []byte("portal:\n tls_cert_typo: \"x\"\n"), 0o600) os.Chmod(p, 0o600) var out, errOut bytes.Buffer code := runCheck([]string{"--config", p}, &out, &errOut) if code == 0 { t.Fatal("Tippfehler in der Config muss zum Abbruch führen") } combined := out.String() + errOut.String() if !strings.Contains(combined, "tls_cert_typo") { t.Errorf("das unbekannte Feld muss genannt werden: %q", combined) } } func TestConfigChecksumIsStable(t *testing.T) { dir := t.TempDir() p := filepath.Join(dir, "config.yaml") os.WriteFile(p, []byte("inhalt"), 0o600) os.Chmod(p, 0o600) a, err := configChecksum(p) if err != nil { t.Fatal(err) } b, _ := configChecksum(p) if a != b || a == "" { t.Fatalf("Prüfsumme instabil: %q vs %q", a, b) } if len(a) != 12 { t.Errorf("Prüfsumme sollte gekürzt sein (12 Zeichen), ist %d", len(a)) } os.WriteFile(p, []byte("anderer inhalt"), 0o600) if c, _ := configChecksum(p); c == a { t.Error("geänderte Datei muss eine andere Prüfsumme ergeben") } } func TestNewTLSConfigRejectsMissingFiles(t *testing.T) { if _, err := newTLSConfig("/nix.crt", "/nix.key"); err == nil { t.Fatal("fehlende Zertifikatsdateien müssen abgelehnt werden") } }