- ui.Session (UserID/Address/Title/BoundTask) + фабрики NewFreeSession/NewTaskSession и префикс ui://sess-* - свободная вкладка без задачи: свой UserID, диалог с LLM в памяти (agent=chat, resume по sessionID) - /start в свободной вкладке создаёт задачу с ChatID == UserID вкладки -> вкладка становится task-сессией - desktop окно: container.AppTabs с вкладками, кнопка «Новый чат», маршрутизация Send/Ask/истории по Address вкладки - app.FreeChat: in-memory связка uid -> opencode sessionID; роутинг свободного чата в handleIncoming - агент chat.md + регистрация 'chat' в agents.Names - тесты: session_test.go (фабрики/хелперы)
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
package ui
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/kamelion/ratatoskr-go/internal/chat"
|
|
"github.com/kamelion/ratatoskr-go/internal/storage"
|
|
)
|
|
|
|
func TestNewFreeSession(t *testing.T) {
|
|
s := NewFreeSession(chat.UserID("ui://sess-1"), chat.Address("ui://sess-1"))
|
|
if s.UserID != chat.UserID("ui://sess-1") {
|
|
t.Errorf("UserID = %q, want ui://sess-1", s.UserID)
|
|
}
|
|
if s.Address != chat.Address("ui://sess-1") {
|
|
t.Errorf("Address = %q, want ui://sess-1", s.Address)
|
|
}
|
|
if s.BoundTask != 0 {
|
|
t.Errorf("BoundTask = %d, want 0", s.BoundTask)
|
|
}
|
|
if !IsFreeSession(s) {
|
|
t.Error("free session must be free")
|
|
}
|
|
}
|
|
|
|
func TestNewTaskSessionUsesTaskChatID(t *testing.T) {
|
|
task := &storage.Task{ID: 7, ChatID: "ui://sess-3", Title: "Фича"}
|
|
s := NewTaskSession(chat.Address("ui://sess-3"), *task)
|
|
if s.UserID != chat.UserID("ui://sess-3") {
|
|
t.Errorf("UserID = %q, want task.ChatID", s.UserID)
|
|
}
|
|
if s.BoundTask != 7 {
|
|
t.Errorf("BoundTask = %d, want 7", s.BoundTask)
|
|
}
|
|
if s.Title != "Фича" {
|
|
t.Errorf("Title = %q, want Фича", s.Title)
|
|
}
|
|
if IsFreeSession(s) {
|
|
t.Error("task session must not be free")
|
|
}
|
|
}
|
|
|
|
func TestNewTaskSessionTitleFallback(t *testing.T) {
|
|
task := &storage.Task{ID: 3, ChatID: "ui://sess-3"}
|
|
s := NewTaskSession(chat.Address("ui://sess-3"), *task)
|
|
if s.Title != "Задача #3" {
|
|
t.Errorf("Title = %q, want Задача #3", s.Title)
|
|
}
|
|
}
|
|
|
|
func TestIsFreeSessionNil(t *testing.T) {
|
|
if IsFreeSession(nil) {
|
|
t.Error("nil is not free")
|
|
}
|
|
}
|