package store import ( "errors" "testing" "time" core "agent-system-core" ) func TestAccountCheckedFinalSettlementCannotWriteAfterDisable(t *testing.T) { st := openTestStore(t) t.Logf("account final settlement dialect=%s", st.Dialect()) if err := st.CreateAccount("admin", "", "hash", true); err != nil { t.Fatal(err) } if err := st.EnsureUser(OwnerDefault, ""); err != nil { t.Fatal(err) } conv := seedConversation(t, st) run := seedRun(t, st, conv, core.RunRunning) local, err := st.GetAccountByOwner(OwnerDefault) if err != nil { t.Fatal(err) } if _, err := st.SetAccountEnabled("admin", local.ID, local.StateVersion, false); err != nil { t.Fatal(err) } now := time.Now().UTC() run.Status, run.Phase, run.EndedAt = core.RunCompleted, core.PhaseDone, &now message := core.Message{ConversationID: conv.ID, RunID: run.ID, Role: core.RoleAssistant, Parts: []core.Part{{Type: core.PartText, Text: "must not persist after disable"}}} settle := func() error { if st.Dialect() == "postgres" { _, _, err := st.SettleRunFencedAccountChecked(&run, &message, "test-instance", 0, true) return err } _, err := st.SettleRunAccountChecked(&run, &message, true) return err } if err := settle(); !errors.Is(err, ErrAccountForbidden) { t.Fatalf("disabled account completed business output: %v", err) } got, err := st.GetRunByID(run.ID) if err != nil || got.Status != core.RunRunning { t.Fatalf("failed transaction changed run state: %+v %v", got, err) } messages, err := st.ListMessages(conv.ID) if err != nil || len(messages) != 0 { t.Fatalf("failed transaction wrote assistant message: %+v %v", messages, err) } run.Status = core.RunFailed run.Error = &core.ErrorPart{Code: "run.account_inactive", Message: "account disabled"} message.Parts = []core.Part{{Type: core.PartError, Err: run.Error}} if err := settle(); err != nil { t.Fatalf("minimal account-denial failure could not settle: %v", err) } got, err = st.GetRunByID(run.ID) if err != nil || got.Status != core.RunFailed { t.Fatalf("denial state not persisted: %+v %v", got, err) } }