package main import ( "path/filepath" "testing" "github.com/stretchr/testify/require" ) func TestSubagentNamesAreAnAdjectiveAndANoun(t *testing.T) { for range 100 { require.True(t, subagentNameValid(subagentNameRandom())) } require.True(t, subagentNameValid("GreenOtter")) for _, name := range []string{"", "Green", "Greenotter", "greenOtter", "Green-Otter", "GreenOtterX", "OtterGreen", "../GreenOtter"} { require.False(t, subagentNameValid(name), name) } } func TestSubagentCreateDrawsATakenNameAgain(t *testing.T) { names := []string{"GreenOtter", "GreenOtter", "BlueFox"} subagents := newSubagents(filepath.Join(t.TempDir(), subagentDirName), newTestClock().Now, func() string { name := names[0] names = names[1:] return name }) defer func() { require.NoError(t, subagents.Close()) }() first, err := subagents.Create(t.Context()) require.NoError(t, err) require.Equal(t, "GreenOtter", first.name) second, err := subagents.Create(t.Context()) require.NoError(t, err) require.Equal(t, "BlueFox", second.name) require.DirExists(t, filepath.Join(subagents.dir, "BlueFox")) } func TestSubagentLogLastsAfterAClose(t *testing.T) { dir := filepath.Join(t.TempDir(), subagentDirName) subagents := newSubagents(dir, newTestClock().Now, func() string { return "GreenOtter" }) subagent, err := subagents.Create(t.Context()) require.NoError(t, err) for _, message := range [][2]string{{"note", "subagent"}, {"user", "Count the files."}, {"reply", "There are 3."}} { _, err = subagent.Append(message[0], message[1]) require.NoError(t, err) } require.NoError(t, subagent.Flush(t.Context())) require.NoError(t, subagents.Close()) subagents = newSubagents(dir, newTestClock().Now, subagentNameRandom) defer func() { require.NoError(t, subagents.Close()) }() subagent, err = subagents.Get(t.Context(), "GreenOtter") require.NoError(t, err) again, err := subagents.Get(t.Context(), "GreenOtter") require.NoError(t, err) require.Same(t, subagent, again) text, err := subagent.Show() require.NoError(t, err) require.Equal(t, "0|note: subagent\n\n1|user: Count the files.\n\n2|reply: There are 3.", text) } func TestSubagentGetRefusesAnUnknownName(t *testing.T) { subagents := newTestSubagents(t) for _, name := range []string{"BlueFox", "../agent", "Blue"} { _, err := subagents.Get(t.Context(), name) require.EqualError(t, err, "no agent "+name) } }