Remove state files from witness and refinery managers, following the "Discover, Don't Track" principle. Tmux session existence is now the source of truth for running state (like deacon). Changes: - Add IsRunning() that checks tmux HasSession - Change Status() to return *tmux.SessionInfo - Remove loadState/saveState/stateManager - Simplify Start()/Stop() to not use state files - Update CLI commands (witness/refinery/rig) for new API - Update tests to be ZFC-compliant This fixes state file divergence issues where witness/refinery could show "running" when the actual tmux session was dead. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
122 lines
3.0 KiB
Go
122 lines
3.0 KiB
Go
package refinery
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/steveyegge/gastown/internal/rig"
|
|
)
|
|
|
|
func setupTestManager(t *testing.T) (*Manager, string) {
|
|
t.Helper()
|
|
|
|
// Create temp directory structure
|
|
tmpDir := t.TempDir()
|
|
rigPath := filepath.Join(tmpDir, "testrig")
|
|
if err := os.MkdirAll(filepath.Join(rigPath, ".runtime"), 0755); err != nil {
|
|
t.Fatalf("mkdir .runtime: %v", err)
|
|
}
|
|
|
|
r := &rig.Rig{
|
|
Name: "testrig",
|
|
Path: rigPath,
|
|
}
|
|
|
|
return NewManager(r), rigPath
|
|
}
|
|
|
|
func TestManager_SessionName(t *testing.T) {
|
|
mgr, _ := setupTestManager(t)
|
|
|
|
want := "gt-testrig-refinery"
|
|
got := mgr.SessionName()
|
|
if got != want {
|
|
t.Errorf("SessionName() = %s, want %s", got, want)
|
|
}
|
|
}
|
|
|
|
func TestManager_IsRunning_NoSession(t *testing.T) {
|
|
mgr, _ := setupTestManager(t)
|
|
|
|
// Without a tmux session, IsRunning should return false
|
|
// Note: this test doesn't create a tmux session, so it tests the "not running" case
|
|
running, err := mgr.IsRunning()
|
|
if err != nil {
|
|
// If tmux server isn't running, HasSession returns an error
|
|
// This is expected in test environments without tmux
|
|
t.Logf("IsRunning returned error (expected without tmux): %v", err)
|
|
return
|
|
}
|
|
|
|
if running {
|
|
t.Error("IsRunning() = true, want false (no session created)")
|
|
}
|
|
}
|
|
|
|
func TestManager_Status_NotRunning(t *testing.T) {
|
|
mgr, _ := setupTestManager(t)
|
|
|
|
// Without a tmux session, Status should return ErrNotRunning
|
|
_, err := mgr.Status()
|
|
if err == nil {
|
|
t.Error("Status() expected error when not running")
|
|
}
|
|
// May return ErrNotRunning or a tmux server error
|
|
t.Logf("Status returned error (expected): %v", err)
|
|
}
|
|
|
|
func TestManager_Queue_NoBeads(t *testing.T) {
|
|
mgr, _ := setupTestManager(t)
|
|
|
|
// Queue returns error when no beads database exists
|
|
// This is expected - beads requires initialization
|
|
_, err := mgr.Queue()
|
|
if err == nil {
|
|
// If beads is somehow available, queue should be empty
|
|
t.Log("Queue() succeeded unexpectedly (beads may be available)")
|
|
return
|
|
}
|
|
// Error is expected when beads isn't initialized
|
|
t.Logf("Queue() returned error (expected without beads): %v", err)
|
|
}
|
|
|
|
func TestManager_FindMR_NoBeads(t *testing.T) {
|
|
mgr, _ := setupTestManager(t)
|
|
|
|
// FindMR returns error when no beads database exists
|
|
_, err := mgr.FindMR("nonexistent-mr")
|
|
if err == nil {
|
|
t.Error("FindMR() expected error")
|
|
}
|
|
// Any error is acceptable when beads isn't initialized
|
|
t.Logf("FindMR() returned error (expected): %v", err)
|
|
}
|
|
|
|
func TestManager_RegisterMR_Deprecated(t *testing.T) {
|
|
mgr, _ := setupTestManager(t)
|
|
|
|
mr := &MergeRequest{
|
|
ID: "gt-mr-test",
|
|
Branch: "polecat/Test/gt-123",
|
|
Worker: "Test",
|
|
Status: MROpen,
|
|
}
|
|
|
|
// RegisterMR should return an error indicating deprecation
|
|
err := mgr.RegisterMR(mr)
|
|
if err == nil {
|
|
t.Error("RegisterMR() expected error (deprecated)")
|
|
}
|
|
}
|
|
|
|
func TestManager_Retry_Deprecated(t *testing.T) {
|
|
mgr, _ := setupTestManager(t)
|
|
|
|
// Retry is deprecated and should not error, just print a message
|
|
err := mgr.Retry("any-id", false)
|
|
if err != nil {
|
|
t.Errorf("Retry() unexpected error: %v", err)
|
|
}
|
|
}
|