| 1 | package main |
| 2 | |
| 3 | import "testing" |
| 4 | |
| 5 | func TestManualSessionComposerGuidanceReceiptRecovery(t *testing.T) { |
| 6 | a := newManualSessionTestApp(t) |
| 7 | created, err := a.BeginManualSessionCreation(ManualSessionCreationRequest{OperationID: "canonical-guidance", Scope: "global"}) |
| 8 | if err != nil { |
| 9 | t.Fatal(err) |
| 10 | } |
| 11 | a.manualCreationTasks.Wait() |
| 12 | if copies, err := a.ListSessionComposerConflicts(created.Ref); err != nil || copies == nil || len(copies) != 0 { |
| 13 | t.Fatalf("retired input copies must remain an empty compatibility response: %v %v", copies, err) |
| 14 | } |
| 15 | meta := a.metaForDraftSession(created.Ref.SessionID) |
| 16 | if meta == nil || meta.Session == nil || meta.SessionPath != "" { |
| 17 | t.Fatalf("formal session must not need a fabricated legacy path: %+v", meta) |
| 18 | } |
| 19 | _, ctrl := a.tabAndCtrlByID(meta.ID) |
| 20 | if err := ctrl.SetInboxPaused(true); err != nil { |
| 21 | t.Fatal(err) |
| 22 | } |
| 23 | saved, err := a.SaveSessionComposerState(SessionComposerSaveRequest{Ref: created.Ref, ExpectedRevision: "0", ContentVersion: 1, ContentJSON: `{"text":"queued guidance"}`}) |
| 24 | if err != nil { |
| 25 | t.Fatal(err) |
| 26 | } |
| 27 | if _, err := a.BeginSessionComposerSubmission(created.Ref, saved.Revision, "guidance-receipt", `{"kind":"guidance","display":"queued guidance","submit":"queued guidance"}`); err != nil { |
| 28 | t.Fatal(err) |
| 29 | } |
| 30 | target, err := a.CaptureInboxTarget(meta.ID, sessionRoute(created.Ref.SessionID)) |
| 31 | if err != nil { |
| 32 | t.Fatal(err) |
| 33 | } |
| 34 | receipt, err := a.EnqueueInboxFollowupForTarget(target, "queued guidance", "queued guidance", nil, "guidance-receipt") |
| 35 | if err != nil || receipt.ItemID == "" { |
| 36 | t.Fatalf("guidance enqueue: %+v %v", receipt, err) |
| 37 | } |
| 38 | // Simulate a lost enqueue response. The read-only recovery must find the |
| 39 | // canonical inbox receipt before there is any user row for this instruction. |
| 40 | recovered, err := a.GetSessionComposerState(created.Ref) |
| 41 | if err != nil || recovered.SubmissionID != "" || recovered.ContentJSON != "{}" { |
| 42 | t.Fatalf("canonical guidance recovery: %+v %v", recovered, err) |
| 43 | } |
| 44 | if got := len(ctrl.InboxSnapshot().Items); got != 1 { |
| 45 | t.Fatalf("recovery replayed guidance: %d items", got) |
| 46 | } |
| 47 | } |
| 48 |