- Add LoadSwarm method for loading swarms from beads - Rewrite tests to use LoadSwarm, GetSwarm, GetReadyTasks, IsComplete - Remove tests for deprecated Create, Start, UpdateState methods - Keep E2E lifecycle documentation test 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
153 lines
4.3 KiB
Go
153 lines
4.3 KiB
Go
package swarm
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/steveyegge/gastown/internal/rig"
|
|
)
|
|
|
|
// TestLoadSwarmNotFound tests that LoadSwarm returns error for missing epic.
|
|
func TestLoadSwarmNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig",
|
|
Path: "/tmp/test-rig",
|
|
}
|
|
m := NewManager(r)
|
|
|
|
// LoadSwarm for non-existent epic should fail (no beads available)
|
|
_, err := m.LoadSwarm("nonexistent-epic")
|
|
if err == nil {
|
|
t.Error("LoadSwarm should fail for non-existent epic")
|
|
}
|
|
}
|
|
|
|
// TestGetSwarmNotFound tests that GetSwarm returns error for missing swarm.
|
|
func TestGetSwarmNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig",
|
|
Path: "/tmp/test-rig",
|
|
}
|
|
m := NewManager(r)
|
|
|
|
_, err := m.GetSwarm("nonexistent")
|
|
if err == nil {
|
|
t.Error("GetSwarm for nonexistent should return error")
|
|
}
|
|
}
|
|
|
|
// TestGetReadyTasksNotFound tests that GetReadyTasks returns error for missing swarm.
|
|
func TestGetReadyTasksNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig",
|
|
Path: "/tmp/test-rig",
|
|
}
|
|
m := NewManager(r)
|
|
|
|
_, err := m.GetReadyTasks("nonexistent")
|
|
if err != ErrSwarmNotFound {
|
|
t.Errorf("GetReadyTasks = %v, want ErrSwarmNotFound", err)
|
|
}
|
|
}
|
|
|
|
// TestIsCompleteNotFound tests that IsComplete returns error for missing swarm.
|
|
func TestIsCompleteNotFound(t *testing.T) {
|
|
r := &rig.Rig{
|
|
Name: "test-rig",
|
|
Path: "/tmp/test-rig",
|
|
}
|
|
m := NewManager(r)
|
|
|
|
_, err := m.IsComplete("nonexistent")
|
|
if err != ErrSwarmNotFound {
|
|
t.Errorf("IsComplete = %v, want ErrSwarmNotFound", err)
|
|
}
|
|
}
|
|
|
|
// TestSwarmE2ELifecycle documents the end-to-end swarm integration test protocol.
|
|
// This test documents the manual testing steps that were validated for gt-kc7yj.4.
|
|
//
|
|
// The test scenario creates a DAG of work:
|
|
//
|
|
// A
|
|
// / \
|
|
// B C
|
|
// \ /
|
|
// D
|
|
//
|
|
// Test Results (verified 2025-12-29):
|
|
//
|
|
// 1. CREATE EPIC WITH DEPENDENCIES
|
|
//
|
|
// bd create --type=epic --title="Test Epic" → gt-xxxxx
|
|
// bd create --type=task --title="Task A" --parent=gt-xxxxx → gt-xxxxx.1
|
|
// bd create --type=task --title="Task B" --parent=gt-xxxxx → gt-xxxxx.2
|
|
// bd create --type=task --title="Task C" --parent=gt-xxxxx → gt-xxxxx.3
|
|
// bd create --type=task --title="Task D" --parent=gt-xxxxx → gt-xxxxx.4
|
|
// bd dep add gt-xxxxx.2 gt-xxxxx.1 # B depends on A
|
|
// bd dep add gt-xxxxx.3 gt-xxxxx.1 # C depends on A
|
|
// bd dep add gt-xxxxx.4 gt-xxxxx.2 # D depends on B
|
|
// bd dep add gt-xxxxx.4 gt-xxxxx.3 # D depends on C
|
|
//
|
|
// 2. VALIDATE SWARM STRUCTURE ✅
|
|
//
|
|
// bd swarm validate gt-xxxxx
|
|
// Expected output:
|
|
// Wave 1: 1 issue (Task A)
|
|
// Wave 2: 2 issues (Tasks B, C - parallel)
|
|
// Wave 3: 1 issue (Task D)
|
|
// Max parallelism: 2
|
|
// Swarmable: YES
|
|
//
|
|
// 3. CREATE SWARM MOLECULE ✅
|
|
//
|
|
// bd swarm create gt-xxxxx
|
|
// Expected: Creates molecule with mol_type=swarm linked to epic
|
|
//
|
|
// 4. VERIFY READY FRONT ✅
|
|
//
|
|
// bd swarm status gt-xxxxx
|
|
// Expected:
|
|
// Ready: Task A
|
|
// Blocked: Tasks B, C, D (with dependency info)
|
|
//
|
|
// 5. ISSUE COMPLETION ADVANCES FRONT ✅
|
|
//
|
|
// bd close gt-xxxxx.1 --reason "Complete"
|
|
// bd swarm status gt-xxxxx
|
|
// Expected:
|
|
// Completed: Task A
|
|
// Ready: Tasks B, C (now unblocked)
|
|
// Blocked: Task D
|
|
//
|
|
// 6. PARALLEL WORK ✅
|
|
//
|
|
// bd close gt-xxxxx.2 gt-xxxxx.3 --reason "Complete"
|
|
// bd swarm status gt-xxxxx
|
|
// Expected:
|
|
// Completed: Tasks A, B, C
|
|
// Ready: Task D (now unblocked)
|
|
//
|
|
// 7. FINAL COMPLETION ✅
|
|
//
|
|
// bd close gt-xxxxx.4 --reason "Complete"
|
|
// bd swarm status gt-xxxxx
|
|
// Expected: Progress 4/4 complete (100%)
|
|
//
|
|
// 8. SWARM AUTO-CLOSE ⚠️
|
|
//
|
|
// The swarm and epic remain open after all tasks complete.
|
|
// This is by design - the Witness coordinator is responsible for
|
|
// detecting completion and closing the swarm molecule.
|
|
// Manual close: bd close gt-xxxxx gt-yyyyy --reason "Swarm complete"
|
|
//
|
|
// KNOWN ISSUES:
|
|
// - gt swarm status/land fail to find issues (filed as gt-594a4)
|
|
// - bd swarm commands work correctly as the underlying implementation
|
|
// - Auto-close requires Witness patrol (not automatic in beads)
|
|
func TestSwarmE2ELifecycle(t *testing.T) {
|
|
// This test documents the manual E2E testing protocol.
|
|
// The actual test requires beads infrastructure and is run manually.
|
|
// See the docstring above for the complete test procedure.
|
|
t.Skip("E2E test requires beads infrastructure - see docstring for manual test protocol")
|
|
}
|