]> git.giacomolli.uk - onechat/blob - subagent_test.go
Give the root agent the schedule tools
[onechat] / subagent_test.go
1 package main
2
3 import (
4         "path/filepath"
5         "testing"
6
7         "github.com/stretchr/testify/require"
8 )
9
10 func TestSubagentNamesAreAnAdjectiveAndANoun(t *testing.T) {
11         for range 100 {
12                 require.True(t, subagentNameValid(subagentNameRandom()))
13         }
14
15         require.True(t, subagentNameValid("GreenOtter"))
16         for _, name := range []string{"", "Green", "Greenotter", "greenOtter", "Green-Otter", "GreenOtterX", "OtterGreen", "../GreenOtter"} {
17                 require.False(t, subagentNameValid(name), name)
18         }
19 }
20
21 func TestSubagentCreateDrawsATakenNameAgain(t *testing.T) {
22         names := []string{"GreenOtter", "GreenOtter", "BlueFox"}
23         subagents := newSubagents(filepath.Join(t.TempDir(), subagentDirName), newTestClock().Now, func() string {
24                 name := names[0]
25                 names = names[1:]
26
27                 return name
28         })
29
30         defer func() {
31                 require.NoError(t, subagents.Close())
32         }()
33
34         first, err := subagents.Create(t.Context())
35         require.NoError(t, err)
36         require.Equal(t, "GreenOtter", first.name)
37
38         second, err := subagents.Create(t.Context())
39         require.NoError(t, err)
40         require.Equal(t, "BlueFox", second.name)
41         require.DirExists(t, filepath.Join(subagents.dir, "BlueFox"))
42 }
43
44 func TestSubagentLogLastsAfterAClose(t *testing.T) {
45         dir := filepath.Join(t.TempDir(), subagentDirName)
46         subagents := newSubagents(dir, newTestClock().Now, func() string {
47                 return "GreenOtter"
48         })
49
50         subagent, err := subagents.Create(t.Context())
51         require.NoError(t, err)
52
53         for _, message := range [][2]string{{"note", "subagent"}, {"user", "Count the files."}, {"reply", "There are 3."}} {
54                 _, err = subagent.Append(message[0], message[1])
55                 require.NoError(t, err)
56         }
57
58         require.NoError(t, subagent.Flush(t.Context()))
59         require.NoError(t, subagents.Close())
60
61         subagents = newSubagents(dir, newTestClock().Now, subagentNameRandom)
62         defer func() {
63                 require.NoError(t, subagents.Close())
64         }()
65
66         subagent, err = subagents.Get(t.Context(), "GreenOtter")
67         require.NoError(t, err)
68
69         again, err := subagents.Get(t.Context(), "GreenOtter")
70         require.NoError(t, err)
71         require.Same(t, subagent, again)
72
73         text, err := subagent.Show()
74         require.NoError(t, err)
75         require.Equal(t, "0|note: subagent\n\n1|user: Count the files.\n\n2|reply: There are 3.", text)
76 }
77
78 func TestSubagentGetRefusesAnUnknownName(t *testing.T) {
79         subagents := newTestSubagents(t)
80         for _, name := range []string{"BlueFox", "../agent", "Blue"} {
81                 _, err := subagents.Get(t.Context(), name)
82                 require.EqualError(t, err, "no agent "+name)
83         }
84 }