- TestRequestMarshal, TestResponseWithSessions - TestRegistryUpdate, TestRegistryWaitingSince, TestRegistryRemoveStale - TestLabelStoreSetGet, TestLabelStorePersistence, TestLabelStoreLoadMissing
180 lines
3.7 KiB
Go
180 lines
3.7 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestRegistryUpdate(t *testing.T) {
|
|
reg := NewRegistry()
|
|
|
|
info := SessionInfo{
|
|
PID: 1234,
|
|
SessionID: "sess-1",
|
|
Cwd: "/home/user/project",
|
|
State: "Working",
|
|
}
|
|
|
|
reg.Update(info)
|
|
|
|
list := reg.List()
|
|
if len(list) != 1 {
|
|
t.Fatalf("list len = %d, want 1", len(list))
|
|
}
|
|
if list[0].SessionID != "sess-1" {
|
|
t.Errorf("session_id = %q, want %q", list[0].SessionID, "sess-1")
|
|
}
|
|
}
|
|
|
|
func TestRegistryWaitingSince(t *testing.T) {
|
|
reg := NewRegistry()
|
|
|
|
// Session starts Working
|
|
reg.Update(SessionInfo{
|
|
PID: 1234,
|
|
SessionID: "sess-1",
|
|
State: "Working",
|
|
})
|
|
|
|
list := reg.List()
|
|
if list[0].WaitingSince != nil {
|
|
t.Error("WaitingSince should be nil when Working")
|
|
}
|
|
|
|
// Session transitions to NeedsInput
|
|
reg.Update(SessionInfo{
|
|
PID: 1234,
|
|
SessionID: "sess-1",
|
|
State: "Needs Input",
|
|
})
|
|
|
|
list = reg.List()
|
|
if list[0].WaitingSince == nil {
|
|
t.Fatal("WaitingSince should be set when NeedsInput")
|
|
}
|
|
|
|
waitStart := *list[0].WaitingSince
|
|
|
|
// Session goes back to Working -> WaitingSince reset
|
|
reg.Update(SessionInfo{
|
|
PID: 1234,
|
|
SessionID: "sess-1",
|
|
State: "Working",
|
|
})
|
|
|
|
list = reg.List()
|
|
if list[0].WaitingSince != nil {
|
|
t.Errorf("WaitingSince should be nil after returning to Working, got %v", list[0].WaitingSince)
|
|
}
|
|
|
|
_ = waitStart
|
|
}
|
|
|
|
func TestRegistryRemoveStale(t *testing.T) {
|
|
reg := NewRegistry()
|
|
|
|
reg.Update(SessionInfo{SessionID: "sess-1", State: "Working"})
|
|
reg.Update(SessionInfo{SessionID: "sess-2", State: "Working"})
|
|
|
|
// Only sess-1 is still active
|
|
active := map[string]bool{"sess-1": true}
|
|
reg.RemoveStale(active)
|
|
|
|
list := reg.List()
|
|
if len(list) != 1 {
|
|
t.Fatalf("list len = %d, want 1", len(list))
|
|
}
|
|
if list[0].SessionID != "sess-1" {
|
|
t.Errorf("session_id = %q, want %q", list[0].SessionID, "sess-1")
|
|
}
|
|
}
|
|
|
|
func TestLabelStoreSetGet(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "labels.json")
|
|
|
|
ls, err := NewLabelStore(path)
|
|
if err != nil {
|
|
t.Fatalf("new: %v", err)
|
|
}
|
|
|
|
if err := ls.Set("sess-1", "review MR"); err != nil {
|
|
t.Fatalf("set: %v", err)
|
|
}
|
|
|
|
got := ls.Get("sess-1")
|
|
if got != "review MR" {
|
|
t.Errorf("get = %q, want %q", got, "review MR")
|
|
}
|
|
|
|
// Non-existent key returns empty
|
|
if got := ls.Get("unknown"); got != "" {
|
|
t.Errorf("get unknown = %q, want empty", got)
|
|
}
|
|
}
|
|
|
|
func TestLabelStorePersistence(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "labels.json")
|
|
|
|
ls, err := NewLabelStore(path)
|
|
if err != nil {
|
|
t.Fatalf("new: %v", err)
|
|
}
|
|
if err := ls.Set("sess-1", "review MR"); err != nil {
|
|
t.Fatalf("set: %v", err)
|
|
}
|
|
|
|
// Create a new LabelStore from the same file
|
|
ls2, err := NewLabelStore(path)
|
|
if err != nil {
|
|
t.Fatalf("new2: %v", err)
|
|
}
|
|
|
|
got := ls2.Get("sess-1")
|
|
if got != "review MR" {
|
|
t.Errorf("persisted get = %q, want %q", got, "review MR")
|
|
}
|
|
}
|
|
|
|
func TestLabelStoreLoadMissing(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "nonexistent", "labels.json")
|
|
|
|
ls, err := NewLabelStore(path)
|
|
if err != nil {
|
|
t.Fatalf("should not error on missing file: %v", err)
|
|
}
|
|
|
|
if got := ls.Get("anything"); got != "" {
|
|
t.Errorf("get = %q, want empty", got)
|
|
}
|
|
}
|
|
|
|
func TestRegistryUpdateTimestamp(t *testing.T) {
|
|
reg := NewRegistry()
|
|
|
|
before := time.Now()
|
|
reg.Update(SessionInfo{
|
|
SessionID: "sess-1",
|
|
State: "Needs Input",
|
|
})
|
|
after := time.Now()
|
|
|
|
list := reg.List()
|
|
if list[0].WaitingSince == nil {
|
|
t.Fatal("WaitingSince should be set")
|
|
}
|
|
ws := *list[0].WaitingSince
|
|
if ws.Before(before) || ws.After(after) {
|
|
t.Errorf("WaitingSince %v not between %v and %v", ws, before, after)
|
|
}
|
|
}
|
|
|
|
// Placeholder to verify file exists
|
|
func init() {
|
|
_ = os.TempDir()
|
|
}
|