ObserveShadow computes intended outcome only and refuses FAV_DEGRADED_READ; HandleLease and Register(fav) stay fail-closed. Co-authored-by: Cursor <cursoragent@cursor.com>
69 lines
2.1 KiB
Go
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")
|
|
}
|
|
}
|