package main import ( "testing" "time" ) func TestMaintenanceFiltersSelectedTargets(t *testing.T) { window := MaintenanceWindow{Active: true, ServiceIDs: []int64{7}, VMIDs: []int{105}} alerts := []Alert{ {ID: "service-7-local"}, {ID: "service-tls-8-public"}, {ID: "backup-old-105"}, {ID: "task-failed-x", Message: "VMID 105, status error"}, {ID: "cpu-usage"}, } active, planned := splitMaintenanceAlerts(alerts, window) if len(active) != 2 || len(planned) != 3 { t.Fatalf("неверное разделение: active=%+v planned=%+v", active, planned) } } func TestMaintenanceExpiresAutomatically(t *testing.T) { store, err := openStore(":memory:") if err != nil { t.Fatal(err) } defer store.Close() window, err := store.SaveMaintenanceWindow(MaintenanceWindow{EndsAt: time.Now().Add(time.Hour).Unix(), Reason: "Обновление", AllAlerts: true}) if err != nil || !window.Active { t.Fatalf("режим не включён: %+v %v", window, err) } if _, err = store.db.Exec(`UPDATE settings SET value=? WHERE key='maintenance_window'`, `{"enabled":true,"startedAt":1,"endsAt":2,"reason":"test","allAlerts":true}`); err != nil { t.Fatal(err) } if expired := store.MaintenanceWindow(); expired.Active || expired.Enabled { t.Fatalf("просроченный режим остался активным: %+v", expired) } } func TestPlannedAlertOnlyAppearsInHistory(t *testing.T) { store, err := openStore(":memory:") if err != nil { t.Fatal(err) } defer store.Close() alert := Alert{ID: "service-7-local", Severity: "critical", Source: "Сервисы", Title: "Недоступен"} visible, err := store.SyncAlertsWithMaintenance(nil, []Alert{alert}, "Обновление") if err != nil || len(visible) != 0 { t.Fatalf("плановый алерт стал активным: %+v %v", visible, err) } history, err := store.AlertHistory(10) if err != nil || len(history) != 1 || !history[0].Planned || history[0].MaintenanceReason != "Обновление" { t.Fatalf("плановое событие не сохранено: %+v %v", history, err) } pending, err := store.PendingEmailAlerts() if err != nil || len(pending) != 0 { t.Fatalf("плановое событие попало в почту: %+v %v", pending, err) } }