]> git.giacomolli.uk - onechat/blobdiff - image_show_test.go
Check the width of comment lines
[onechat] / image_show_test.go
index ed475fe33eba7f9ed027dcc8008e007a879d73a2..8df642af4111008b4b9d7cb2032e6af44c20ff75 100644 (file)
@@ -1,6 +1,7 @@
 package main
 
 import (
 package main
 
 import (
+       "encoding/base64"
        "encoding/json"
        "net/http"
        "path/filepath"
        "encoding/json"
        "net/http"
        "path/filepath"
@@ -37,7 +38,7 @@ func TestImageShowUsesStoredImageForTelegramAndTerminal(t *testing.T) {
        require.Equal(t, "A red point.", calls[0].params["caption"])
        require.Equal(t, name, calls[0].params["photo_name"])
        require.Equal(t, picture, calls[0].params["photo"])
        require.Equal(t, "A red point.", calls[0].params["caption"])
        require.Equal(t, name, calls[0].params["photo_name"])
        require.Equal(t, picture, calls[0].params["photo"])
-       require.Empty(t, logs.String())
+       require.Equal(t, "<6>image sent\n", logs.String())
 }
 
 func TestImageShowRefusesUnknownNamesBeforeSending(t *testing.T) {
 }
 
 func TestImageShowRefusesUnknownNamesBeforeSending(t *testing.T) {
@@ -134,3 +135,97 @@ func TestAgentShowsImageInTerminalWithoutTelegram(t *testing.T) {
                Text: output,
        }), filepath.Join(test.agent.Images().dir, name))
 }
                Text: output,
        }), filepath.Join(test.agent.Images().dir, name))
 }
+
+func TestTellImageMarkerGivesTheChildPixels(t *testing.T) {
+       server := newModelFake(t)
+       test := newDaemonMessageTest(t, t.TempDir(), server)
+       picture := imageTestPNG(t, 4, 2)
+       name, err := test.agents[0].agent.Images().Save(picture)
+       require.NoError(t, err)
+       test.Start(t, 0, 1)
+
+       arguments, err := json.Marshal(ToolTellArguments{
+               Name:    "Garden",
+               Message: imageText([]string{name}, "Review this plan."),
+       })
+       require.NoError(t, err)
+       require.Contains(t, test.loops[0].tools.run(t.Context(), "tell", string(arguments)), "Sent.")
+       test.events[1].WaitFor(t, "idle", 1)
+
+       var childCall *ModelFakeCall
+
+       for i := range server.Calls() {
+               call := server.Call(i)
+               if call.body["model"] == "gpt-test-garden" {
+                       childCall = &call
+                       break
+               }
+       }
+
+       require.NotNil(t, childCall)
+       require.Contains(t, string(childCall.raw), "input_image")
+       require.Contains(t, string(childCall.raw), base64.StdEncoding.EncodeToString(picture))
+       require.Contains(t, test.events[1].Last("user"), "[image "+name+"]")
+       require.NotContains(t, promptToolNames(test.agents[1].agent.Tools()), "image_show")
+}
+
+func TestAgentShowsTelegramReceivedImageToItsOwner(t *testing.T) {
+       picture := imageTestPNG(t, 6, 4)
+       store := &ImageStore{dir: t.TempDir()}
+       name, err := store.Save(picture)
+       require.NoError(t, err)
+
+       telegram := newTelegramFake(t)
+       telegram.Image("owner-photo", picture)
+
+       bot, logs := telegramStartTestBot(t, telegram)
+       server := newModelFake(t)
+       server.reply = func(w http.ResponseWriter, call ModelFakeCall) {
+               if call.number == 0 {
+                       arguments, err := json.Marshal(ToolImageShowArguments{
+                               Image:   name,
+                               Caption: "Here is your photo.",
+                       })
+                       require.NoError(t, err)
+                       modelWriteEvents(w, modelCompletedEvent([]any{modelFunctionCallItem("fc_1", "call_1", "image_show", string(arguments))}, 100, 0, 5))
+
+                       return
+               }
+
+               modelWriteEvents(w, modelCompletedEvent([]any{modelMessageItem("Shown.")}, 100, 0, 5))
+       }
+       socket := daemonStartTestWithBot(t, server, bot)
+       terminal := terminalStartTestClient(t, socket)
+       terminal.WaitFor(t, "[connected to OneChat]")
+
+       message := telegramOwnerMessage("")
+       message.Caption = "Show this photo."
+       message.Photo = []TelegramPhoto{{
+               FileID: "owner-photo",
+               Width:  6,
+               Height: 4,
+       }}
+       telegram.Add(TelegramUpdate{
+               UpdateID: 1,
+               Message:  message,
+       })
+       terminal.WaitFor(t, "Shown.\n[done]")
+       require.Contains(t, terminal.Output(), "[result] [image "+name+"]")
+       require.Contains(t, terminal.Output(), filepath.Join(imageDirName, name))
+
+       var photos []TelegramFakeCall
+
+       for _, call := range telegram.Calls() {
+               if call.method == "sendPhoto" {
+                       photos = append(photos, call)
+               }
+       }
+
+       require.Len(t, photos, 1)
+       require.Equal(t, picture, photos[0].params["photo"])
+       require.Equal(t, "4242", photos[0].params["chat_id"])
+       require.Equal(t, "Here is your photo.", photos[0].params["caption"])
+       require.NotContains(t, logs.String(), "Here is your photo.")
+       require.NotContains(t, logs.String(), "Show this photo.")
+       require.NotContains(t, logs.String(), telegramTestToken)
+}