1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
package askcli
import (
"bytes"
"context"
"io"
"strings"
"testing"
)
func TestHandleList_Success(t *testing.T) {
jsonData := `[{"uuid":"uuid-1","description":"Task 1","status":"pending","priority":"H","tags":["cli"],"urgency":15.0,"depends":[]},{"uuid":"uuid-2","description":"Task 2","status":"completed","priority":"M","tags":["agent"],"urgency":10.0,"depends":[]}]`
d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
for _, arg := range args {
if arg == "export" {
io.WriteString(stdout, jsonData)
return 0, nil
}
}
return 0, nil
}})
var stdout, stderr bytes.Buffer
code, _ := d.Dispatch(context.Background(), []string{"list"}, nil, &stdout, &stderr)
if code != 0 {
t.Fatalf("list code = %d, want 0", code)
}
output := stdout.String()
if !strings.Contains(output, "uuid-1") || !strings.Contains(output, "uuid-2") {
t.Fatalf("output missing UUIDs: %s", output)
}
}
func TestHandleList_SortedByPriority(t *testing.T) {
jsonData := `[{"uuid":"uuid-2","description":"Task 2","status":"pending","priority":"M","tags":[],"urgency":10.0,"depends":[]},{"uuid":"uuid-1","description":"Task 1","status":"pending","priority":"H","tags":[],"urgency":5.0,"depends":[]}]`
d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
for _, arg := range args {
if arg == "export" {
io.WriteString(stdout, jsonData)
return 0, nil
}
}
return 0, nil
}})
var stdout bytes.Buffer
d.Dispatch(context.Background(), []string{"list"}, nil, &stdout, &bytes.Buffer{})
output := stdout.String()
lines := strings.Split(strings.TrimSpace(output), "\n")
taskLine1 := lines[2]
if !strings.Contains(taskLine1, "uuid-1") {
t.Fatalf("first task should be H priority (uuid-1), got: %s", taskLine1)
}
}
func TestHandleList_EmptyList(t *testing.T) {
d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
for _, arg := range args {
if arg == "export" {
io.WriteString(stdout, "[]")
return 0, nil
}
}
return 0, nil
}})
var stdout, stderr bytes.Buffer
code, _ := d.Dispatch(context.Background(), []string{"list"}, nil, &stdout, &stderr)
if code != 0 {
t.Fatalf("list code = %d, want 0 for empty list", code)
}
}
func TestHandleAll_Success(t *testing.T) {
jsonData := `[{"uuid":"uuid-1","description":"Done task","status":"completed","priority":"M","tags":[],"urgency":0.0,"depends":[]}]`
d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
for _, arg := range args {
if arg == "export" {
io.WriteString(stdout, jsonData)
return 0, nil
}
}
return 0, nil
}})
var stdout, stderr bytes.Buffer
code, _ := d.Dispatch(context.Background(), []string{"all"}, nil, &stdout, &stderr)
if code != 0 {
t.Fatalf("all code = %d, want 0", code)
}
if !strings.Contains(stdout.String(), "uuid-1") {
t.Fatalf("output missing uuid-1: %s", stdout.String())
}
}
func TestHandleReady_Success(t *testing.T) {
jsonData := `[{"uuid":"uuid-ready","description":"Ready task","status":"pending","priority":"H","tags":["READY"],"urgency":20.0,"depends":[]}]`
d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
for _, arg := range args {
if arg == "export" {
io.WriteString(stdout, jsonData)
return 0, nil
}
}
return 0, nil
}})
var stdout, stderr bytes.Buffer
code, _ := d.Dispatch(context.Background(), []string{"ready"}, nil, &stdout, &stderr)
if code != 0 {
t.Fatalf("ready code = %d, want 0", code)
}
if !strings.Contains(stdout.String(), "uuid-ready") {
t.Fatalf("output missing uuid-ready: %s", stdout.String())
}
}
func TestHandleList_PassesFilters(t *testing.T) {
var capturedArgs []string
d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
capturedArgs = args
io.WriteString(stdout, "[]")
return 0, nil
}})
var stdout, stderr bytes.Buffer
d.Dispatch(context.Background(), []string{"list", "+READY", "limit:5", "sort:priority-"}, nil, &stdout, &stderr)
if len(capturedArgs) < 2 {
t.Fatalf("expected export args, got %v", capturedArgs)
}
hasExport := false
for _, arg := range capturedArgs {
if arg == "export" {
hasExport = true
break
}
}
if !hasExport {
t.Fatalf("expected export in args, got %v", capturedArgs)
}
}
|