90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
|
|
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")
|
||
|
|
}
|
||
|
|
}
|