Files
weichenandCursor 2c1d040ccf feat(events): add FAV subscriber shadow without live writes
ObserveShadow computes intended outcome only and refuses FAV_DEGRADED_READ; HandleLease and Register(fav) stay fail-closed.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 04:25:17 +00:00

69 lines
2.1 KiB
Go

package fav_test
import (
"context"
"errors"
"testing"
"chat-agent-system/internal/app/fav"
"chat-agent-system/internal/events"
)
func TestFavSubscriberDefaultsDisabled(t *testing.T) {
if fav.DefaultEnabled() {
t.Fatal("fav subscriber DefaultEnabled must be false")
}
c := &fav.EventConsumer{}
if c.Enabled {
t.Fatal("zero-value EventConsumer.Enabled must be false")
}
err := c.HandleLease(context.Background(), events.Lease{}, nil)
if !errors.Is(err, events.ErrDisabledConsumer) {
t.Fatalf("disabled HandleLease: %v", err)
}
}
func TestFavSubscriberStillDisabledWhenFlagOnWithoutRegistryApproval(t *testing.T) {
c := &fav.EventConsumer{Enabled: true, Env: "dev"}
err := c.HandleLease(context.Background(), events.Lease{Environment: "dev"}, nil)
if !errors.Is(err, events.ErrDisabledConsumer) {
t.Fatalf("enabled stub must still refuse until cutover approved: %v", err)
}
if err := events.NewRegistry().Register(events.ConsumerFAV); err == nil {
t.Fatal("Registry.Register(fav) must remain fail-closed")
}
}
func TestFavSubscriberShadowComputesIntendedOutcomeWithoutWrites(t *testing.T) {
t.Setenv("FAV_DEGRADED_READ", "false")
t.Setenv("FAV_PUBLISHER_ENABLED", "false")
c := &fav.EventConsumer{Enabled: false, Env: "dev"}
out, err := c.ObserveShadow(events.Lease{
EventName: "document.finalized", AggregateType: "document", AggregateID: "doc_1",
})
if err != nil {
t.Fatal(err)
}
if out.WouldStage || out.WouldPublish || out.DegradedReadUsed {
t.Fatalf("shadow must not claim writes: %+v", out)
}
if out.LogicalResource != "document:doc_1" {
t.Fatalf("logical=%s", out.LogicalResource)
}
err = c.HandleLease(context.Background(), events.Lease{}, nil)
if !errors.Is(err, events.ErrDisabledConsumer) {
t.Fatalf("HandleLease still disabled: %v", err)
}
c.AllowDegradedRead = true
if _, err := c.ObserveShadow(events.Lease{}); err == nil {
t.Fatal("shadow must refuse degraded read")
}
c.AllowDegradedRead = false
t.Setenv("FAV_DEGRADED_READ", "true")
if _, err := c.ObserveShadow(events.Lease{AggregateType: "document", AggregateID: "doc_2"}); err == nil {
t.Fatal("shadow must refuse process env FAV_DEGRADED_READ")
}
}