Files
gastown/internal/refinery/manager_test.go
gastown/crew/mel 5218102f49 refactor(witness,refinery): ZFC-compliant state management
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>
2026-01-20 20:00:56 -08:00

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