package main import ( "context" "testing" "time" "github.com/kami/maven/internal/ipc" "github.com/kami/maven/internal/memory" "github.com/kami/maven/internal/router" "github.com/kami/maven/internal/tool" "github.com/kami/maven/internal/voice" ) // TestApplyAction_FactCapture_QueuesEntityResolution covers the wiring from // Vikunja #279: a voice-tapped fact's key doubles as its entity-resolution // subject, so writing a fact through applyAction (not directly through the // store) must leave it in the fact-enrichment pending queue. func TestApplyAction_FactCapture_QueuesEntityResolution(t *testing.T) { ctx := context.Background() st := newTestStore(t) api := ipc.NewStoreAPI(st) now := time.Now() emb := router.NewHashEmbedder(1024) matcher := tool.NewMatcher(api) rtr := buildRouter(emb, matcher, 0.55, nil) h := &reactiveHandler{ api: api, embedder: emb, router: rtr, replier: voice.NewStubReplier(), now: func() time.Time { return now }, memStore: memory.NewInMemoryStore(), dataStore: st, } dec := router.Decision{ Intent: router.IntentFact, Slots: router.Slots{Key: "the espresso machine", HasKey: true, Value: `"needs descaling"`}, } h.applyAction(ctx, dec) pending, err := st.PendingFactResolutions(ctx, 10) if err != nil { t.Fatalf("PendingFactResolutions: %v", err) } if len(pending) != 1 { t.Fatalf("expected 1 fact queued for entity resolution, got %d: %+v", len(pending), pending) } if pending[0].Subject != "the espresso machine" { t.Fatalf("expected subject to carry the fact key, got %q", pending[0].Subject) } }