v0.15.0 6b178f8

stream_test.go RawHistoryFolder

1package modes
2
3import (
4	"bytes"
5	"context"
6	"testing"
7
8	"github.com/bnema/zut/packages/core"
9	"github.com/bnema/zut/packages/provider"
10)
11
12type streamTestClient struct {
13	events []provider.Event
14	err    error
15}
16
17func (c *streamTestClient) Name() string { return "stream-test" }
18
19func (c *streamTestClient) Stream(ctx context.Context, req provider.Request) (<-chan provider.Event, error) {
20	if c.err != nil {
21		return nil, c.err
22	}
23	out := make(chan provider.Event, len(c.events))
24	go func() {
25		defer close(out)
26		for _, ev := range c.events {
27			select {
28			case <-ctx.Done():
29				return
30			case out <- ev:
31			}
32		}
33	}()
34	return out, nil
35}
36
37func TestRunStreamWritesDeltasLive(t *testing.T) {
38	client := &streamTestClient{events: []provider.Event{
39		provider.EventTextDelta{Delta: "Hel"},
40		provider.EventTextDelta{Delta: "lo"},
41		provider.EventDone{
42			Stop: provider.StopEnd,
43			Message: provider.Message{
44				Role:    provider.RoleAssistant,
45				Content: []provider.Content{provider.TextBlock{Text: "Hello"}},
46			},
47		},
48	}}
49	ag := core.NewAgent(client, "test-model", "", nil)
50	var out, diag bytes.Buffer
51	if err := RunStreamWithDiag(context.Background(), ag, "hi", nil, &out, &diag); err != nil {
52		t.Fatal(err)
53	}
54	if got := out.String(); got != "Hello\n" {
55		t.Fatalf("stdout = %q, want Hello\\n", got)
56	}
57}
58
59func TestRunStreamFallbackWithoutDeltas(t *testing.T) {
60	client := &streamTestClient{events: []provider.Event{
61		provider.EventDone{
62			Stop: provider.StopEnd,
63			Message: provider.Message{
64				Role:    provider.RoleAssistant,
65				Content: []provider.Content{provider.TextBlock{Text: "done"}},
66			},
67		},
68	}}
69	ag := core.NewAgent(client, "test-model", "", nil)
70	var out bytes.Buffer
71	if err := RunStreamWithDiag(context.Background(), ag, "hi", nil, &out, ioDiscard{}); err != nil {
72		t.Fatal(err)
73	}
74	if got := out.String(); got != "done\n" {
75		t.Fatalf("stdout = %q, want done\\n", got)
76	}
77}
78
79type ioDiscard struct{}
80
81func (ioDiscard) Write(p []byte) (int, error) { return len(p), nil }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 476

↑↓ moveenter openesc close