Files
ratatoskr-go/internal/ui/session_test.go
ki.sagidullin 9420b276e9
Some checks failed
CI / test (pull_request) Failing after 1m20s
CI / build-and-package (amd64, linux) (pull_request) Failing after 1m2s
CI / build-and-package (amd64, windows) (pull_request) Successful in 36s
feat(ui): каждая вкладка chat — независимая LLM-сессия
- 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 (фабрики/хелперы)
2026-08-21 10:33:05 +05:00

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")
}
}