X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/e0ab6220b6fd35f7e92a04e4bf149940185713ab..84fc815feb485b35eec53a8c7863c6770fc65e02:/turn_test.go diff --git a/turn_test.go b/turn_test.go index b8c92dc..0de7dd7 100644 --- a/turn_test.go +++ b/turn_test.go @@ -30,7 +30,7 @@ func TestTurnRunsToolsUntilTheFinalAnswer(t *testing.T) { } test := newTestLoop(t, server) - _, err := test.loop.Submit("Run echo hi.") + _, err := test.loop.Submit(terminalSource, "Run echo hi.") require.NoError(t, err) test.events.WaitFor(t, "idle", 1) require.Equal(t, 2, server.Calls()) @@ -59,6 +59,13 @@ func TestTurnRunsToolsUntilTheFinalAnswer(t *testing.T) { "reply: It said hi.", }, test.Log(t)) require.Equal(t, []string{"user", "busy", "tool", "echo", "reply", "idle"}, test.events.Kinds()) + + var turns []string + for _, record := range readUsage(t, test.usagePath) { + turns = append(turns, record.Turn) + } + + require.Equal(t, []string{"first", "next"}, turns) } func TestFirstRequestHoldsTheViewTheStateAndTheMessage(t *testing.T) { @@ -67,7 +74,7 @@ func TestFirstRequestHoldsTheViewTheStateAndTheMessage(t *testing.T) { _, err := test.memory.Append("user", "an earlier message") require.NoError(t, err) - _, err = test.loop.Submit("The new message.") + _, err = test.loop.Submit(terminalSource, "The new message.") require.NoError(t, err) test.events.WaitFor(t, "idle", 1) @@ -95,11 +102,11 @@ func TestMessageDuringATurnJoinsTheNextRequest(t *testing.T) { } test := newTestLoop(t, server) - _, err := test.loop.Submit("first") + _, err := test.loop.Submit(terminalSource, "first") require.NoError(t, err) <-arrived - _, err = test.loop.Submit("second, during the turn") + _, err = test.loop.Submit(terminalSource, "second, during the turn") require.NoError(t, err) close(release) @@ -129,11 +136,11 @@ func TestMessageDuringTheFinalRequestStartsANewTurn(t *testing.T) { } test := newTestLoop(t, server) - _, err := test.loop.Submit("first") + _, err := test.loop.Submit(terminalSource, "first") require.NoError(t, err) <-arrived - _, err = test.loop.Submit("second") + _, err = test.loop.Submit(terminalSource, "second") require.NoError(t, err) close(release) @@ -149,12 +156,12 @@ func TestTurnWaitsForTheSummaries(t *testing.T) { server := newFakeResponses(t) summarizer := newFakeSummarizer() summarizer.gate = make(chan struct{}) - test := newTestLoopWith(t, server, summarizer, false) + test := newTestLoopWith(t, server, summarizer) _, err := test.memory.Append("echo", strings.Repeat("long output ", 100)) require.NoError(t, err) - _, err = test.loop.Submit("go on") + _, err = test.loop.Submit(terminalSource, "go on") require.NoError(t, err) time.Sleep(50 * time.Millisecond) @@ -180,7 +187,7 @@ func TestInterruptEndsTheTurn(t *testing.T) { } test := newTestLoop(t, server) - _, err := test.loop.Submit("a long task") + _, err := test.loop.Submit(terminalSource, "a long task") require.NoError(t, err) <-arrived @@ -192,7 +199,7 @@ func TestInterruptEndsTheTurn(t *testing.T) { require.Equal(t, []string{"user: a long task"}, test.Log(t)) require.False(t, test.loop.Interrupt()) - _, err = test.loop.Submit("again") + _, err = test.loop.Submit(terminalSource, "again") require.NoError(t, err) test.events.WaitFor(t, "idle", 2) require.Equal(t, "reply: answer", test.Log(t)[2]) @@ -205,7 +212,7 @@ func TestFailedCallEndsTheTurnWithoutARetry(t *testing.T) { } test := newTestLoop(t, server) - _, err := test.loop.Submit("hello") + _, err := test.loop.Submit(terminalSource, "hello") require.NoError(t, err) test.events.WaitFor(t, "idle", 1) @@ -218,7 +225,7 @@ func TestViewMessagesOnlyGrowBetweenTurns(t *testing.T) { server := newFakeResponses(t) test := newTestLoop(t, server) for n, text := range []string{"one", "two", "three"} { - _, err := test.loop.Submit(text) + _, err := test.loop.Submit(terminalSource, text) require.NoError(t, err) test.events.WaitFor(t, "idle", n+1) } @@ -237,52 +244,6 @@ func TestViewMessagesOnlyGrowBetweenTurns(t *testing.T) { }, inputTexts(t, server.Call(2))) } -func TestWarmUpEndsWhereTheNextTurnReadsTheCache(t *testing.T) { - server := newFakeResponses(t) - server.reply = func(w http.ResponseWriter, call fakeCall) { - if call.number == 1 { - writeEvents(w, map[string]any{"type": "response.output_item.added", "item": reasoningItem("rs_1", "")}) - return - } - - writeEvents(w, completedEvent([]any{messageItem("answer")}, 100, 0, 5)) - } - - test := newTestLoopWith(t, server, newFakeSummarizer(), true) - _, err := test.loop.Submit("one") - require.NoError(t, err) - require.Eventually(t, func() bool { - return server.Calls() == 2 - }, 10*time.Second, time.Millisecond) - - _, err = test.loop.Submit("two") - require.NoError(t, err) - test.events.WaitFor(t, "idle", 2) - require.Eventually(t, func() bool { - return server.Calls() == 4 - }, 10*time.Second, time.Millisecond) - - warmUp := server.Call(1).body - require.Equal(t, server.Call(0).body["instructions"], warmUp["instructions"]) - require.Equal(t, server.Call(0).body["tools"], warmUp["tools"]) - require.Equal(t, []string{"\n", "0+1|user: one\n1+1|reply: answer\n"}, inputTexts(t, server.Call(1))) - - // The next turn begins with the whole warm-up, so its message end after - // the view is the end of the warm-up entry. - warmInput := warmUp["input"].([]any) - turnInput := server.Call(2).body["input"].([]any) - require.Equal(t, warmInput, turnInput[:len(warmInput)]) - require.Equal(t, "\n\nNow: Thursday 2026-01-01 12:00 +00:00", inputTexts(t, server.Call(2))[len(warmInput)]) - - turns := []string{} - for _, record := range readUsage(t, test.usagePath) { - turns = append(turns, record.Turn) - } - - require.Equal(t, []string{"first", "warmup", "first", "warmup"}, turns) - require.Equal(t, []string{"user: one", "reply: answer", "user: two", "reply: answer"}, test.Log(t)) -} - // testLoop is a loop that runs in the background of a test, with its parts. type testLoop struct { agent *Agent @@ -369,13 +330,12 @@ func (r *eventRecorder) WaitFor(t *testing.T, kind string, count int) { func newTestLoop(t *testing.T, server *fakeResponses) *testLoop { t.Helper() - return newTestLoopWith(t, server, newFakeSummarizer(), false) + return newTestLoopWith(t, server, newFakeSummarizer()) } // newTestLoopWith returns a running loop on a new agent whose builds use -// summarizer and whose commands run in a temporary directory. warmUp turns the -// warm-up on. -func newTestLoopWith(t *testing.T, server *fakeResponses, summarizer Summarizer, warmUp bool) *testLoop { +// summarizer and whose commands run in a temporary directory. +func newTestLoopWith(t *testing.T, server *fakeResponses, summarizer Summarizer) *testLoop { t.Helper() agent, err := openAgent(t.TempDir()) @@ -396,8 +356,6 @@ func newTestLoopWith(t *testing.T, server *fakeResponses, summarizer Summarizer, client := newClient(server.URL, apiKey(testKey), agent.CacheKey(), test.usagePath) test.loop, err = newLoop(agent, memory, client, clock.Now, test.events.Add) require.NoError(t, err) - - test.loop.warmUp = warmUp ctx, cancel := context.WithCancel(t.Context()) done := make(chan error) go func() {