75 lines
2.3 KiB
Go
75 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestReadTelegramConfig(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "telegram-config")
|
|
if err := os.WriteFile(path, []byte("bot_token=123:abc\nrelay_key=relay-secret\n"), 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
config, err := readTelegramConfig(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if config.BotToken != "123:abc" || config.RelayKey != "relay-secret" {
|
|
t.Fatalf("unexpected config: %#v", config)
|
|
}
|
|
}
|
|
|
|
func TestAskTenantUsesAuthenticatedNamedConversation(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
|
|
if request.URL.Path != "/v1/responses" {
|
|
t.Fatalf("unexpected path %s", request.URL.Path)
|
|
}
|
|
if request.Header.Get("Authorization") != "Bearer relay-secret" {
|
|
t.Fatal("relay authentication was not set")
|
|
}
|
|
if request.Header.Get("X-Hermes-Session-Key") != "telegram" {
|
|
t.Fatal("Telegram session scope was not set")
|
|
}
|
|
var payload map[string]any
|
|
if err := json.NewDecoder(request.Body).Decode(&payload); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if payload["conversation"] != "telegram" || payload["input"] != "hello" {
|
|
t.Fatalf("unexpected payload: %#v", payload)
|
|
}
|
|
writer.Header().Set("Content-Type", "application/json")
|
|
_, _ = writer.Write([]byte(`{"output":[{"type":"message","role":"assistant","content":[{"type":"output_text","text":"Hello from Hermes"}]}]}`))
|
|
}))
|
|
defer server.Close()
|
|
router, err := newTenantRouter(filepath.Join(t.TempDir(), "state.json"), 1, func(slot int) string { return "" })
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
router.backendAPIURL = func(slot int) string { return server.URL }
|
|
bot := newTelegramBot(telegramConfig{RelayKey: "relay-secret"}, router)
|
|
answer, err := bot.askTenant(0, "hello", 42)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if answer != "Hello from Hermes" {
|
|
t.Fatalf("unexpected answer %q", answer)
|
|
}
|
|
}
|
|
|
|
func TestSplitTelegramTextStaysUnderTelegramLimit(t *testing.T) {
|
|
chunks := splitTelegramText(strings.Repeat("word ", 2000))
|
|
if len(chunks) < 2 {
|
|
t.Fatal("expected a long response to be split")
|
|
}
|
|
for _, chunk := range chunks {
|
|
if len([]rune(chunk)) > 3900 {
|
|
t.Fatalf("chunk exceeds limit: %d", len([]rune(chunk)))
|
|
}
|
|
}
|
|
}
|