This repository has been archived on 2026-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
anvillm/internal/p9/beads_mount_test.go

163 lines
3.5 KiB
Go

package p9
import (
"context"
"encoding/json"
"os"
"path/filepath"
"testing"
bd "github.com/steveyegge/beads"
)
func TestMountUnmount(t *testing.T) {
tmpDir := t.TempDir()
os.Setenv("HOME", tmpDir)
defer os.Unsetenv("HOME")
store, err := bd.OpenFromConfig(context.Background(), filepath.Join(tmpDir, "main"))
if err != nil {
t.Fatal(err)
}
defer store.Close()
beadsFS := NewBeadsFS(store, context.Background())
projectDir := filepath.Join(tmpDir, "project1")
os.MkdirAll(projectDir, 0755)
err = beadsFS.Mount("proj1", projectDir)
if err != nil {
t.Fatalf("Mount failed: %v", err)
}
mounts := beadsFS.ListMounts()
if _, ok := mounts["proj1"]; !ok {
t.Fatal("Mount not listed")
}
err = beadsFS.Umount("proj1")
if err != nil {
t.Fatalf("Umount failed: %v", err)
}
mounts = beadsFS.ListMounts()
if _, ok := mounts["proj1"]; ok {
t.Fatal("Mount still listed after umount")
}
}
func TestMountReadWrite(t *testing.T) {
tmpDir := t.TempDir()
os.Setenv("HOME", tmpDir)
defer os.Unsetenv("HOME")
store, err := bd.OpenFromConfig(context.Background(), filepath.Join(tmpDir, "main"))
if err != nil {
t.Fatal(err)
}
defer store.Close()
beadsFS := NewBeadsFS(store, context.Background())
projectDir := filepath.Join(tmpDir, "project1")
os.MkdirAll(projectDir, 0755)
err = beadsFS.Mount("proj1", projectDir)
if err != nil {
t.Fatal(err)
}
defer beadsFS.Umount("proj1")
err = beadsFS.Write("proj1/ctl", []byte("init bd"), "test")
if err != nil {
t.Fatal(err)
}
err = beadsFS.Write("proj1/ctl", []byte("new 'Test Task' 'Description'"), "test")
if err != nil {
t.Fatal(err)
}
list, err := beadsFS.Read("proj1/list")
if err != nil {
t.Fatal(err)
}
var beads []map[string]interface{}
json.Unmarshal(list, &beads)
if len(beads) != 1 {
t.Fatalf("Expected 1 bead, got %d", len(beads))
}
beadID := beads[0]["id"].(string)
err = beadsFS.Write("proj1/ctl", []byte("label "+beadID+" claimable"), "test")
if err != nil {
t.Fatal(err)
}
ready, err := beadsFS.Read("proj1/ready")
if err != nil {
t.Fatal(err)
}
var readyBeads []map[string]interface{}
json.Unmarshal(ready, &readyBeads)
if len(readyBeads) != 1 {
t.Fatalf("Expected 1 ready bead, got %d", len(readyBeads))
}
}
func TestReadyAggregate(t *testing.T) {
tmpDir := t.TempDir()
os.Setenv("HOME", tmpDir)
defer os.Unsetenv("HOME")
store, err := bd.OpenFromConfig(context.Background(), filepath.Join(tmpDir, "main"))
if err != nil {
t.Fatal(err)
}
defer store.Close()
beadsFS := NewBeadsFS(store, context.Background())
proj1 := filepath.Join(tmpDir, "project1")
proj2 := filepath.Join(tmpDir, "project2")
os.MkdirAll(proj1, 0755)
os.MkdirAll(proj2, 0755)
beadsFS.Mount("proj1", proj1)
beadsFS.Mount("proj2", proj2)
defer beadsFS.Umount("proj1")
defer beadsFS.Umount("proj2")
beadsFS.Write("proj1/ctl", []byte("init bd"), "test")
beadsFS.Write("proj2/ctl", []byte("init bd"), "test")
beadsFS.Write("proj1/ctl", []byte("new 'Task 1' 'Desc 1'"), "test")
beadsFS.Write("proj2/ctl", []byte("new 'Task 2' 'Desc 2'"), "test")
ready, err := beadsFS.Read("ready")
if err != nil {
t.Fatal(err)
}
var tasks []map[string]interface{}
json.Unmarshal(ready, &tasks)
proj1Count := 0
proj2Count := 0
for _, task := range tasks {
mount, _ := task["mount"].(string)
if mount == "proj1" {
proj1Count++
} else if mount == "proj2" {
proj2Count++
}
}
if proj1Count != 1 || proj2Count != 1 {
t.Fatalf("Expected 1 task from each mount, got proj1=%d proj2=%d", proj1Count, proj2Count)
}
}