mirror of
https://github.com/BaaRai/ARTEX.git
synced 2026-11-13 11:40:53 +08:00
Without ARTEX_PG_DSN and without a config file, go test ./server/ failed
44 tests with "no database config found" instead of skipping them. The
tests go through NewManager and t.Fatal on its error: 35 through the
shared fixture trafficEvidenceServer (directly, or through
verificationFixture and newNotifyFixture), 2 through ingestServer, and 7
call NewManager themselves. The 7 already carry a skip on m.pg == nil,
but it sits after the t.Fatal and is never reached.
Add skipWithoutDSN, which calls db.DSN() and skips with the message the
db package and assembly_test.go already use ("no database config (%v) —
skipping"), and call it before NewManager at those 9 sites.
Nothing changes when a database is configured: db.DSN() succeeds, the
helper returns, and a NewManager error (for example an unreachable
Postgres) still fails the test.
127 lines
3.2 KiB
Go
127 lines
3.2 KiB
Go
package server
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/Autumn-27/artex/db"
|
|
)
|
|
|
|
// Planner quiet-mode (#79): an edge round is dropped only when BOTH hold — the
|
|
// open-goal fingerprint is unchanged since the last completed round AND active
|
|
// work exists (open or running intents). Every other combination plans.
|
|
func TestPlannerQuietSkipEdge(t *testing.T) {
|
|
skipWithoutDSN(t)
|
|
m, err := NewManager(t.TempDir(), "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = m.Close() })
|
|
if m.pg == nil {
|
|
t.Skip("no postgres for this run")
|
|
}
|
|
|
|
created, err := m.CreateTaskWithOptions("quiet-mode probe", "probe goal", db.TaskCreateOptions{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tt, ok := m.Task(created.ID)
|
|
if !ok {
|
|
t.Fatal("task not found after creation")
|
|
}
|
|
store := tt.Store
|
|
e := NewEngine(m)
|
|
|
|
gid, err := store.AddGoal(map[string]any{"summary": "g1"}, "seed")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
iid, err := store.AddIntent(map[string]any{"summary": "i1"}, 0, nil, "seed")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
fp, err := store.OpenGoalFingerprint()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if fp == "" {
|
|
t.Fatal("fingerprint must not be empty with an open goal")
|
|
}
|
|
e.goalFP.Store(tt.ID, fp)
|
|
if !e.quietSkipEdge(tt) {
|
|
t.Fatal("unchanged goals + active intent must skip the edge round")
|
|
}
|
|
|
|
// a goal closes -> the fingerprint changes -> plan
|
|
if err := store.SetNodeState(gid, "met"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if e.quietSkipEdge(tt) {
|
|
t.Fatal("a closed goal must allow planning")
|
|
}
|
|
|
|
// goal back open, intent drained -> no active work -> plan
|
|
if err := store.SetNodeState(gid, "open"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
fp2, err := store.OpenGoalFingerprint()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
e.goalFP.Store(tt.ID, fp2)
|
|
if err := store.SetIntentState(iid, "done"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if e.quietSkipEdge(tt) {
|
|
t.Fatal("no active intent must allow planning")
|
|
}
|
|
}
|
|
|
|
// The quiet-mode switch is editable mid-run (#86): PATCHing plan_quiet_mode
|
|
// updates both the stored row and the live Task the engine reads per round.
|
|
func TestPlannerQuietModeToggleMidRun(t *testing.T) {
|
|
skipWithoutDSN(t)
|
|
m, err := NewManager(t.TempDir(), "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = m.Close() })
|
|
if m.pg == nil {
|
|
t.Skip("no postgres for this run")
|
|
}
|
|
|
|
created, err := m.CreateTaskWithOptions("quiet-toggle probe", "goal", db.TaskCreateOptions{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tt, ok := m.Task(created.ID)
|
|
if !ok {
|
|
t.Fatal("task not found")
|
|
}
|
|
if !tt.PlanQuietMode {
|
|
t.Fatal("quiet mode must default on")
|
|
}
|
|
|
|
off := false
|
|
updated, err := m.UpdateTaskMetadata(created.ID, db.TaskPatch{PlanQuietMode: &off})
|
|
if err != nil || updated == nil {
|
|
t.Fatalf("UpdateTaskMetadata: %v %v", updated, err)
|
|
}
|
|
live, ok := m.Task(created.ID)
|
|
if !ok || live.PlanQuietMode {
|
|
t.Fatal("mid-run toggle must turn the live flag off")
|
|
}
|
|
stored, err := m.pg.GetTask(mustTaskID(t, created.ID))
|
|
if err != nil || stored == nil || stored.PlanQuietMode {
|
|
t.Fatalf("stored row must reflect the toggle: %v %v", stored, err)
|
|
}
|
|
|
|
on := true
|
|
if _, err := m.UpdateTaskMetadata(created.ID, db.TaskPatch{PlanQuietMode: &on}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
live, _ = m.Task(created.ID)
|
|
if !live.PlanQuietMode {
|
|
t.Fatal("toggle back on failed")
|
|
}
|
|
}
|