- Export session.Manager.SessionName for spawn.go access - Add --address alias for --identity in mail inbox/check - Send explicit work instruction to polecat after spawn - Add CapturePaneLines and WaitForClaudeReady helpers (unused for now) - Proper solution filed as gt-hb0 (needs Witness/Deacon AI monitoring) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
150 lines
3.1 KiB
Go
150 lines
3.1 KiB
Go
package session
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/steveyegge/gastown/internal/rig"
|
|
"github.com/steveyegge/gastown/internal/tmux"
|
|
)
|
|
|
|
func TestSessionName(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "gastown",
|
|
Polecats: []string{"Toast"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
name := m.SessionName("Toast")
|
|
if name != "gt-gastown-Toast" {
|
|
t.Errorf("sessionName = %q, want gt-gastown-Toast", name)
|
|
}
|
|
}
|
|
|
|
func TestPolecatDir(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "gastown",
|
|
Path: "/home/user/ai/gastown",
|
|
Polecats: []string{"Toast"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
dir := m.polecatDir("Toast")
|
|
expected := "/home/user/ai/gastown/polecats/Toast"
|
|
if dir != expected {
|
|
t.Errorf("polecatDir = %q, want %q", dir, expected)
|
|
}
|
|
}
|
|
|
|
func TestHasPolecat(t *testing.T) {
|
|
root := t.TempDir()
|
|
// hasPolecat checks filesystem, so create actual directories
|
|
for _, name := range []string{"Toast", "Cheedo"} {
|
|
if err := os.MkdirAll(filepath.Join(root, "polecats", name), 0755); err != nil {
|
|
t.Fatalf("mkdir: %v", err)
|
|
}
|
|
}
|
|
|
|
r := &rig.Rig{
|
|
Name: "gastown",
|
|
Path: root,
|
|
Polecats: []string{"Toast", "Cheedo"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
if !m.hasPolecat("Toast") {
|
|
t.Error("expected hasPolecat(Toast) = true")
|
|
}
|
|
if !m.hasPolecat("Cheedo") {
|
|
t.Error("expected hasPolecat(Cheedo) = true")
|
|
}
|
|
if m.hasPolecat("Unknown") {
|
|
t.Error("expected hasPolecat(Unknown) = false")
|
|
}
|
|
}
|
|
|
|
func TestStartPolecatNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "gastown",
|
|
Polecats: []string{"Toast"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
err := m.Start("Unknown", StartOptions{})
|
|
if err == nil {
|
|
t.Error("expected error for unknown polecat")
|
|
}
|
|
}
|
|
|
|
func TestIsRunningNoSession(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "gastown",
|
|
Polecats: []string{"Toast"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
running, err := m.IsRunning("Toast")
|
|
if err != nil {
|
|
t.Fatalf("IsRunning: %v", err)
|
|
}
|
|
if running {
|
|
t.Error("expected IsRunning = false for non-existent session")
|
|
}
|
|
}
|
|
|
|
func TestListEmpty(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig-unlikely-name",
|
|
Polecats: []string{},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
infos, err := m.List()
|
|
if err != nil {
|
|
t.Fatalf("List: %v", err)
|
|
}
|
|
if len(infos) != 0 {
|
|
t.Errorf("infos count = %d, want 0", len(infos))
|
|
}
|
|
}
|
|
|
|
func TestStopNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig",
|
|
Polecats: []string{"Toast"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
err := m.Stop("Toast", false)
|
|
if err != ErrSessionNotFound {
|
|
t.Errorf("Stop = %v, want ErrSessionNotFound", err)
|
|
}
|
|
}
|
|
|
|
func TestCaptureNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig",
|
|
Polecats: []string{"Toast"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
_, err := m.Capture("Toast", 50)
|
|
if err != ErrSessionNotFound {
|
|
t.Errorf("Capture = %v, want ErrSessionNotFound", err)
|
|
}
|
|
}
|
|
|
|
func TestInjectNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig",
|
|
Polecats: []string{"Toast"},
|
|
}
|
|
m := NewManager(tmux.NewTmux(), r)
|
|
|
|
err := m.Inject("Toast", "hello")
|
|
if err != ErrSessionNotFound {
|
|
t.Errorf("Inject = %v, want ErrSessionNotFound", err)
|
|
}
|
|
}
|