package metastore import ( "encoding/json" "testing" ) func TestAlertCreateListFilterLifecycle(t *testing.T) { store, err := Open(t.TempDir()) if err != nil { t.Fatalf("Open returned error: %v", err) } defer store.Close() alert, err := store.CreateAlert(AlertInput{ Title: "Thumbnail failed", Description: "Could not generate preview.", Severity: AlertSeverityMedium, Code: "601", Trace: "thumbnail.generate.failed", Metadata: json.RawMessage(`{"box":"box-1","file":"photo.jpg"}`), CreatedBy: "system", }) if err != nil { t.Fatalf("CreateAlert returned error: %v", err) } if alert.ID == "" || alert.Status != AlertStatusOpen { t.Fatalf("unexpected alert: %#v", alert) } alerts, err := store.ListAlerts(AlertFilters{Severity: AlertSeverityMedium, Status: AlertStatusOpen}) if err != nil { t.Fatalf("ListAlerts returned error: %v", err) } if len(alerts) != 1 || alerts[0].Trace != "thumbnail.generate.failed" { t.Fatalf("unexpected filtered alerts: %#v", alerts) } if !json.Valid(alerts[0].Metadata) { t.Fatalf("expected valid metadata JSON: %s", string(alerts[0].Metadata)) } var metadata map[string]string if err := json.Unmarshal(alerts[0].Metadata, &metadata); err != nil { t.Fatalf("Unmarshal metadata returned error: %v", err) } if metadata["file"] != "photo.jpg" { t.Fatalf("metadata did not survive round trip: %#v", metadata) } if err := store.AcknowledgeAlert(alert.ID); err != nil { t.Fatalf("AcknowledgeAlert returned error: %v", err) } acknowledged, ok, err := store.GetAlert(alert.ID) if err != nil || !ok { t.Fatalf("GetAlert returned ok=%v err=%v", ok, err) } if acknowledged.Status != AlertStatusAcknowledged || acknowledged.AcknowledgedAt == nil { t.Fatalf("expected acknowledged alert, got %#v", acknowledged) } if err := store.CloseAlert(alert.ID); err != nil { t.Fatalf("CloseAlert returned error: %v", err) } closed, ok, err := store.GetAlert(alert.ID) if err != nil || !ok { t.Fatalf("GetAlert returned ok=%v err=%v", ok, err) } if closed.Status != AlertStatusClosed || closed.ClosedAt == nil { t.Fatalf("expected closed alert, got %#v", closed) } } func TestAlertRejectsInvalidMetadata(t *testing.T) { store, err := Open(t.TempDir()) if err != nil { t.Fatalf("Open returned error: %v", err) } defer store.Close() if _, err := store.CreateAlert(AlertInput{ Title: "Bad alert", Severity: AlertSeverityLow, Code: "999", Trace: "test.bad", Metadata: json.RawMessage(`[]`), }); err == nil { t.Fatal("expected non-object metadata to be rejected") } }