Files
gastown/internal/crew/manager_test.go
Steve Yegge 78db2c768f Fix crew test expecting CLAUDE.md to be created
The test expected CLAUDE.md to be created by Add(), but the code
intentionally skips this (CLAUDE.md is injected via SessionStart
hook to avoid leaking Gas Town context into project repos).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:59:00 -08:00

289 lines
7.0 KiB
Go

package crew
import (
"os"
"os/exec"
"path/filepath"
"testing"
"github.com/steveyegge/gastown/internal/git"
"github.com/steveyegge/gastown/internal/rig"
)
func TestManagerAddAndGet(t *testing.T) {
// Create temp directory for test
tmpDir, err := os.MkdirTemp("", "crew-test-*")
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
defer func() { _ = os.RemoveAll(tmpDir) }()
// Create a mock rig
rigPath := filepath.Join(tmpDir, "test-rig")
if err := os.MkdirAll(rigPath, 0755); err != nil {
t.Fatalf("failed to create rig dir: %v", err)
}
// Initialize git repo for the rig
g := git.NewGit(rigPath)
// For testing, we need a git URL - use a local bare repo
bareRepoPath := filepath.Join(tmpDir, "bare-repo.git")
cmd := []string{"git", "init", "--bare", bareRepoPath}
if err := runCmd(cmd[0], cmd[1:]...); err != nil {
t.Fatalf("failed to create bare repo: %v", err)
}
r := &rig.Rig{
Name: "test-rig",
Path: rigPath,
GitURL: bareRepoPath,
}
mgr := NewManager(r, g)
// Test Add
worker, err := mgr.Add("dave", false)
if err != nil {
t.Fatalf("Add failed: %v", err)
}
if worker.Name != "dave" {
t.Errorf("expected name 'dave', got '%s'", worker.Name)
}
if worker.Rig != "test-rig" {
t.Errorf("expected rig 'test-rig', got '%s'", worker.Rig)
}
if worker.Branch != "main" {
t.Errorf("expected branch 'main', got '%s'", worker.Branch)
}
// Verify directory structure
crewDir := filepath.Join(rigPath, "crew", "dave")
if _, err := os.Stat(crewDir); os.IsNotExist(err) {
t.Error("crew directory was not created")
}
mailDir := filepath.Join(crewDir, "mail")
if _, err := os.Stat(mailDir); os.IsNotExist(err) {
t.Error("mail directory was not created")
}
// NOTE: CLAUDE.md is NOT created by Add() - it's injected via SessionStart hook
// See manager.go line 107-110 for why we skip CLAUDE.md creation
stateFile := filepath.Join(crewDir, "state.json")
if _, err := os.Stat(stateFile); os.IsNotExist(err) {
t.Error("state.json was not created")
}
// Test Get
retrieved, err := mgr.Get("dave")
if err != nil {
t.Fatalf("Get failed: %v", err)
}
if retrieved.Name != "dave" {
t.Errorf("expected name 'dave', got '%s'", retrieved.Name)
}
// Test duplicate Add
_, err = mgr.Add("dave", false)
if err != ErrCrewExists {
t.Errorf("expected ErrCrewExists, got %v", err)
}
// Test Get non-existent
_, err = mgr.Get("nonexistent")
if err != ErrCrewNotFound {
t.Errorf("expected ErrCrewNotFound, got %v", err)
}
}
func TestManagerAddWithBranch(t *testing.T) {
// Create temp directory for test
tmpDir, err := os.MkdirTemp("", "crew-test-branch-*")
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
defer func() { _ = os.RemoveAll(tmpDir) }()
// Create a mock rig
rigPath := filepath.Join(tmpDir, "test-rig")
if err := os.MkdirAll(rigPath, 0755); err != nil {
t.Fatalf("failed to create rig dir: %v", err)
}
g := git.NewGit(rigPath)
// Create a local repo with initial commit for branch testing
sourceRepoPath := filepath.Join(tmpDir, "source-repo")
if err := os.MkdirAll(sourceRepoPath, 0755); err != nil {
t.Fatalf("failed to create source repo dir: %v", err)
}
// Initialize source repo with a commit
cmds := [][]string{
{"git", "-C", sourceRepoPath, "init"},
{"git", "-C", sourceRepoPath, "config", "user.email", "test@test.com"},
{"git", "-C", sourceRepoPath, "config", "user.name", "Test"},
}
for _, cmd := range cmds {
if err := runCmd(cmd[0], cmd[1:]...); err != nil {
t.Fatalf("failed to run %v: %v", cmd, err)
}
}
// Create initial file and commit
testFile := filepath.Join(sourceRepoPath, "README.md")
if err := os.WriteFile(testFile, []byte("# Test"), 0644); err != nil {
t.Fatalf("failed to write test file: %v", err)
}
cmds = [][]string{
{"git", "-C", sourceRepoPath, "add", "."},
{"git", "-C", sourceRepoPath, "commit", "-m", "Initial commit"},
}
for _, cmd := range cmds {
if err := runCmd(cmd[0], cmd[1:]...); err != nil {
t.Fatalf("failed to run %v: %v", cmd, err)
}
}
r := &rig.Rig{
Name: "test-rig",
Path: rigPath,
GitURL: sourceRepoPath,
}
mgr := NewManager(r, g)
// Test Add with branch
worker, err := mgr.Add("emma", true)
if err != nil {
t.Fatalf("Add with branch failed: %v", err)
}
if worker.Branch != "crew/emma" {
t.Errorf("expected branch 'crew/emma', got '%s'", worker.Branch)
}
}
func TestManagerList(t *testing.T) {
// Create temp directory for test
tmpDir, err := os.MkdirTemp("", "crew-test-list-*")
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
defer func() { _ = os.RemoveAll(tmpDir) }()
// Create a mock rig
rigPath := filepath.Join(tmpDir, "test-rig")
if err := os.MkdirAll(rigPath, 0755); err != nil {
t.Fatalf("failed to create rig dir: %v", err)
}
g := git.NewGit(rigPath)
// Create a bare repo for cloning
bareRepoPath := filepath.Join(tmpDir, "bare-repo.git")
if err := runCmd("git", "init", "--bare", bareRepoPath); err != nil {
t.Fatalf("failed to create bare repo: %v", err)
}
r := &rig.Rig{
Name: "test-rig",
Path: rigPath,
GitURL: bareRepoPath,
}
mgr := NewManager(r, g)
// Initially empty
workers, err := mgr.List()
if err != nil {
t.Fatalf("List failed: %v", err)
}
if len(workers) != 0 {
t.Errorf("expected 0 workers, got %d", len(workers))
}
// Add some workers
_, err = mgr.Add("alice", false)
if err != nil {
t.Fatalf("Add alice failed: %v", err)
}
_, err = mgr.Add("bob", false)
if err != nil {
t.Fatalf("Add bob failed: %v", err)
}
workers, err = mgr.List()
if err != nil {
t.Fatalf("List failed: %v", err)
}
if len(workers) != 2 {
t.Errorf("expected 2 workers, got %d", len(workers))
}
}
func TestManagerRemove(t *testing.T) {
// Create temp directory for test
tmpDir, err := os.MkdirTemp("", "crew-test-remove-*")
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
defer func() { _ = os.RemoveAll(tmpDir) }()
// Create a mock rig
rigPath := filepath.Join(tmpDir, "test-rig")
if err := os.MkdirAll(rigPath, 0755); err != nil {
t.Fatalf("failed to create rig dir: %v", err)
}
g := git.NewGit(rigPath)
// Create a bare repo for cloning
bareRepoPath := filepath.Join(tmpDir, "bare-repo.git")
if err := runCmd("git", "init", "--bare", bareRepoPath); err != nil {
t.Fatalf("failed to create bare repo: %v", err)
}
r := &rig.Rig{
Name: "test-rig",
Path: rigPath,
GitURL: bareRepoPath,
}
mgr := NewManager(r, g)
// Add a worker
_, err = mgr.Add("charlie", false)
if err != nil {
t.Fatalf("Add failed: %v", err)
}
// Remove it (with force since CLAUDE.md is uncommitted)
err = mgr.Remove("charlie", true)
if err != nil {
t.Fatalf("Remove failed: %v", err)
}
// Verify it's gone
_, err = mgr.Get("charlie")
if err != ErrCrewNotFound {
t.Errorf("expected ErrCrewNotFound, got %v", err)
}
// Remove non-existent
err = mgr.Remove("nonexistent", false)
if err != ErrCrewNotFound {
t.Errorf("expected ErrCrewNotFound, got %v", err)
}
}
// Helper to run commands
func runCmd(name string, args ...string) error {
cmd := exec.Command(name, args...)
return cmd.Run()
}