]> git.giacomolli.uk - onechat/blobdiff - turn_test.go
Check operation context on returned errors
[onechat] / turn_test.go
index b89a0ec8727e6cc238dc747d61c955adfbb10eaa..5d93e08709f4432ff982f55908b1cb19d388a34b 100644 (file)
@@ -3,7 +3,7 @@ package main
 import (
        "context"
        "encoding/json"
-       "errors"
+       "log"
        "net/http"
        "path/filepath"
        "strings"
@@ -203,11 +203,12 @@ func TestInterruptEndsTheTurn(t *testing.T) {
        require.NoError(t, err)
        test.events.WaitFor(t, "idle", 2)
        require.Equal(t, "reply: answer", test.Log(t)[2])
+       require.Empty(t, test.logs.String())
 }
 
 func TestFailedCallEndsTheTurnWithoutARetry(t *testing.T) {
        server := newModelFake(t)
-       server.reply = func(w http.ResponseWriter, call ModelFakeCall) {
+       server.reply = func(w http.ResponseWriter, _ ModelFakeCall) {
                http.Error(w, "busy", http.StatusServiceUnavailable)
        }
 
@@ -219,6 +220,10 @@ func TestFailedCallEndsTheTurnWithoutARetry(t *testing.T) {
        time.Sleep(50 * time.Millisecond)
        require.Equal(t, 1, server.Calls())
        require.Contains(t, test.events.Last("error"), "HTTP 503")
+       require.Equal(t, 1, strings.Count(test.logs.String(), "\n"))
+       require.Contains(t, test.logs.String(), "turn failed: ")
+       require.Contains(t, test.logs.String(), "HTTP 503")
+       require.NotContains(t, test.logs.String(), "hello")
 }
 
 func TestViewMessagesOnlyGrowBetweenTurns(t *testing.T) {
@@ -250,6 +255,7 @@ type TurnTestLoop struct {
        memory    *Memory
        loop      *TurnLoop
        events    *TurnEventRecorder
+       logs      *SyncBuffer
        usagePath string
 }
 
@@ -308,16 +314,21 @@ func (r *TurnEventRecorder) Count(kind string) int {
 
 // Last returns the text of the last event of kind.
 func (r *TurnEventRecorder) Last(kind string) string {
+       return r.LastEvent(kind).Text
+}
+
+// LastEvent returns the last event of kind.
+func (r *TurnEventRecorder) LastEvent(kind string) Event {
        r.mutex.Lock()
        defer r.mutex.Unlock()
 
        for n := len(r.events) - 1; n >= 0; n-- {
                if r.events[n].Kind == kind {
-                       return r.events[n].Text
+                       return r.events[n]
                }
        }
 
-       return ""
+       return Event{}
 }
 
 func (r *TurnEventRecorder) Add(event Event) {
@@ -375,18 +386,20 @@ func newTestTurnLoopWith(t *testing.T, server *ModelFake, summarizer Summarizer)
 
        agent.config.Workdir = t.TempDir()
        clock := newTestClock()
-       memory, err := openMemory(t.Context(), t.TempDir(), clock.Now, summarizer)
+       memory, err := openMemory(t.Context(), t.TempDir(), clock.Now, summarizer, discardLog())
        require.NoError(t, err)
 
        test := &TurnTestLoop{
                agent:     agent,
                memory:    memory,
                events:    &TurnEventRecorder{},
+               logs:      &SyncBuffer{},
                usagePath: filepath.Join(t.TempDir(), "usage.jsonl"),
        }
 
        client := newModelClient(server.URL, ModelAPIKey(modelTestKey), agent.CacheKey(), test.usagePath)
-       test.loop, err = newTurnLoop(agent, memory, client, clock.Now, test.events.Add)
+       whatsapp, _, _ := whatsappStartTest(t, t.TempDir(), clock)
+       test.loop, err = newTurnLoop(agent, memory, newTestSubagents(t), whatsapp, newTestSchedules(t, clock.Now), client, clock.Now, log.New(test.logs, "", 0), test.events.Add)
        require.NoError(t, err)
        ctx, cancel := context.WithCancel(t.Context())
        done := make(chan error)
@@ -396,7 +409,7 @@ func newTestTurnLoopWith(t *testing.T, server *ModelFake, summarizer Summarizer)
 
        t.Cleanup(func() {
                cancel()
-               require.True(t, errors.Is(<-done, context.Canceled))
+               require.ErrorIs(t, <-done, context.Canceled)
                require.NoError(t, memory.Close())
        })