9 "github.com/stretchr/testify/require"
12 func TestNewAgentKeepsItsIDAcrossOpens(t *testing.T) {
13 dir := filepath.Join(t.TempDir(), "agent")
14 agent, err := openAgent(dir)
15 require.NoError(t, err)
16 require.Len(t, agent.config.ID, 2*agentIDBytes)
17 require.Equal(t, "gpt-6.1-sol", agent.config.Model)
18 require.True(t, filepath.IsAbs(agent.config.Workdir))
20 again, err := openAgent(dir)
21 require.NoError(t, err)
22 require.Equal(t, agent.config, again.config)
24 info, err := os.Stat(dir)
25 require.NoError(t, err)
26 require.Equal(t, os.FileMode(0o700), info.Mode().Perm())
29 func TestNewAgentsGetDifferentIDs(t *testing.T) {
30 first, err := openAgent(t.TempDir())
31 require.NoError(t, err)
33 second, err := openAgent(t.TempDir())
34 require.NoError(t, err)
35 require.Equal(t, first.config.Name, second.config.Name)
36 require.NotEqual(t, first.CacheKey(), second.CacheKey())
39 func TestRenamedAgentKeepsItsCacheKey(t *testing.T) {
41 agent, err := openAgent(dir)
42 require.NoError(t, err)
44 key := agent.CacheKey()
45 require.Equal(t, "onechat-"+agent.config.ID, key)
47 config := agent.config
49 agentWriteTestConfig(t, dir, config)
51 renamed, err := openAgent(dir)
52 require.NoError(t, err)
53 require.Equal(t, "Lena", renamed.config.Name)
54 require.Equal(t, key, renamed.CacheKey())
57 func TestAgentConfigErrors(t *testing.T) {
58 testCases := []struct {
64 name: "unknown field",
65 config: `{"id": "00112233445566778899aabbccddeeff", "nmae": "Lena"}`,
66 err: `unknown field "nmae"`,
70 config: `{"name": "Lena"}`,
71 err: "id must be 32 hexadecimal digits",
74 name: "relative workdir",
75 config: `{"id": "00112233445566778899aabbccddeeff", "workdir": "src"}`,
76 err: `workdir "src" is not an absolute path`,
79 name: "name of two lines",
80 config: `{"id": "00112233445566778899aabbccddeeff", "name": "Le\nna"}`,
81 err: "name must be one line of text",
85 for _, tc := range testCases {
86 t.Run(tc.name, func(t *testing.T) {
88 require.NoError(t, os.WriteFile(filepath.Join(dir, "config.json"), []byte(tc.config), 0o600))
90 _, err := openAgent(dir)
91 require.ErrorContains(t, err, tc.err)
96 func TestAgentPromptReadsTheInstructionsEachTime(t *testing.T) {
98 agent, err := openAgent(dir)
99 require.NoError(t, err)
101 text, err := agent.Prompt()
102 require.NoError(t, err)
103 require.Equal(t, prompt(agent.config.Name, ""), text)
105 require.NoError(t, os.WriteFile(filepath.Join(dir, agentInstructionsFileName), []byte("I am Lena.\n"), 0o600))
106 text, err = agent.Prompt()
107 require.NoError(t, err)
108 require.Equal(t, prompt(agent.config.Name, "I am Lena."), text)
111 // agentWriteTestConfig writes config as the config.json of the agent in dir.
112 func agentWriteTestConfig(t *testing.T, dir string, config AgentConfig) {
115 data, err := json.Marshal(config)
116 require.NoError(t, err)
117 require.NoError(t, os.WriteFile(filepath.Join(dir, "config.json"), data, 0o600))