返回 DeepSeek-Reasonix
cli_resume_start_test.go
根目录 / internal / cli / cli_resume_start_test.go
1 package cli
2
3 import (
4 "os"
5 "path/filepath"
6 "strings"
7 "testing"
8
9 "reasonix/internal/agent"
10 )
11
12 func ambiguousResumeWorkspace(t *testing.T) (string, string) {
13 t.Helper()
14 t.Setenv("REASONIX_STATE_HOME", t.TempDir())
15 t.Chdir(t.TempDir())
16 dir := resolveCLISessionDir()
17 if err := os.MkdirAll(dir, 0o700); err != nil {
18 t.Fatal(err)
19 }
20 alpha := saveQueryTestSession(t, dir, "alpha-branch.jsonl", "demo-alpha rollout")
21 beta := saveQueryTestSession(t, dir, "beta-branch.jsonl", "demo-beta rollout")
22 return alpha, beta
23 }
24
25 func TestHeadlessResumeAmbiguousQueryListsCandidates(t *testing.T) {
26 alpha, beta := ambiguousResumeWorkspace(t)
27
28 var rc int
29 out := captureStderr(t, func() {
30 _, rc = headlessResumeTarget("demo", false, false)
31 })
32 if rc != 1 {
33 t.Fatalf("exit code = %d, want 1", rc)
34 }
35 for _, want := range []string{
36 agent.BranchID(alpha), "demo-alpha rollout",
37 agent.BranchID(beta), "demo-beta rollout",
38 } {
39 if !strings.Contains(out, want) {
40 t.Fatalf("stderr does not name candidate %q:\n%s", want, out)
41 }
42 }
43 }
44
45 func TestInteractiveResumeAmbiguousQueryOffersOnlyMatches(t *testing.T) {
46 alpha, beta := ambiguousResumeWorkspace(t)
47 _ = saveQueryTestSession(t, resolveCLISessionDir(), "gamma-branch.jsonl", "unrelated work")
48
49 var offered []string
50 choose := func(entries []resumeEntry) (cliResumeTarget, int) {
51 for _, entry := range entries {
52 offered = append(offered, entry.target.path)
53 }
54 return entries[len(entries)-1].target, 0
55 }
56 target, rc := resumeQueryTarget(resolveCLISessionDir(), "demo", os.Stderr, choose)
57 if rc != 0 {
58 t.Fatalf("exit code = %d, want the chooser's pick", rc)
59 }
60 if len(offered) != 2 || !containsPath(offered, alpha) || !containsPath(offered, beta) {
61 t.Fatalf("chooser offered %v, want exactly %s and %s", offered, alpha, beta)
62 }
63 if target.path != offered[1] {
64 t.Fatalf("target = %+v, want the chosen %s", target, offered[1])
65 }
66 }
67
68 func containsPath(paths []string, want string) bool {
69 for _, path := range paths {
70 if filepath.Clean(path) == filepath.Clean(want) {
71 return true
72 }
73 }
74 return false
75 }
76
76 lines GO