97 lines
2.6 KiB
Go
97 lines
2.6 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/oklog/ulid/v2"
|
|
)
|
|
|
|
func TestNotificationChannelCRUD(t *testing.T) {
|
|
t.Parallel()
|
|
dir := t.TempDir()
|
|
st, err := Open(context.Background(), filepath.Join(dir, "rm.db"))
|
|
if err != nil {
|
|
t.Fatalf("open: %v", err)
|
|
}
|
|
defer st.Close()
|
|
ctx := context.Background()
|
|
|
|
ch := NotificationChannel{
|
|
ID: ulid.Make().String(), Kind: "webhook", Name: "team-slack",
|
|
Enabled: true, Config: []byte("encrypted-blob"),
|
|
CreatedAt: time.Now().UTC(), UpdatedAt: time.Now().UTC(),
|
|
}
|
|
if err := st.CreateNotificationChannel(ctx, ch); err != nil {
|
|
t.Fatalf("create: %v", err)
|
|
}
|
|
|
|
got, err := st.GetNotificationChannel(ctx, ch.ID)
|
|
if err != nil {
|
|
t.Fatalf("get: %v", err)
|
|
}
|
|
if got.Name != ch.Name || got.Kind != "webhook" || string(got.Config) != "encrypted-blob" {
|
|
t.Fatalf("got %+v", got)
|
|
}
|
|
|
|
got.Name = "team-slack-renamed"
|
|
got.Enabled = false
|
|
got.UpdatedAt = time.Now().UTC()
|
|
if err := st.UpdateNotificationChannel(ctx, *got); err != nil {
|
|
t.Fatalf("update: %v", err)
|
|
}
|
|
got2, _ := st.GetNotificationChannel(ctx, ch.ID)
|
|
if got2.Name != "team-slack-renamed" || got2.Enabled {
|
|
t.Fatalf("update not applied: %+v", got2)
|
|
}
|
|
|
|
all, _ := st.ListEnabledNotificationChannels(ctx)
|
|
if len(all) != 0 {
|
|
t.Errorf("disabled channel returned by ListEnabled: %d", len(all))
|
|
}
|
|
|
|
if err := st.DeleteNotificationChannel(ctx, ch.ID); err != nil {
|
|
t.Fatalf("delete: %v", err)
|
|
}
|
|
if _, err := st.GetNotificationChannel(ctx, ch.ID); err == nil {
|
|
t.Errorf("expected ErrNotFound after delete")
|
|
}
|
|
}
|
|
|
|
func TestAppendNotificationLog(t *testing.T) {
|
|
t.Parallel()
|
|
dir := t.TempDir()
|
|
st, _ := Open(context.Background(), filepath.Join(dir, "rm.db"))
|
|
defer st.Close()
|
|
ctx := context.Background()
|
|
|
|
chID := ulid.Make().String()
|
|
if err := st.CreateNotificationChannel(ctx, NotificationChannel{
|
|
ID: chID, Kind: "ntfy", Name: "n", Enabled: true,
|
|
Config: []byte{1, 2, 3},
|
|
CreatedAt: time.Now().UTC(), UpdatedAt: time.Now().UTC(),
|
|
}); err != nil {
|
|
t.Fatalf("create channel: %v", err)
|
|
}
|
|
|
|
code := 200
|
|
lat := 287
|
|
if err := st.AppendNotificationLog(ctx, NotificationLogEntry{
|
|
ID: ulid.Make().String(), ChannelID: chID, Event: "alert.test",
|
|
OK: true, StatusCode: &code, LatencyMS: &lat,
|
|
FiredAt: time.Now().UTC(),
|
|
}); err != nil {
|
|
t.Fatalf("append: %v", err)
|
|
}
|
|
|
|
// LastFiredAt projection: the channel's last_fired_at is updated
|
|
// either by the append helper or by the callers; if you choose the
|
|
// helper does the bump, assert it.
|
|
got, _ := st.GetNotificationChannel(ctx, chID)
|
|
if got.LastFiredAt == nil {
|
|
t.Errorf("last_fired_at should bump on AppendNotificationLog success")
|
|
}
|
|
}
|