package client import ( "maps" "os" "path/filepath" "slices" "testing" "github.com/fsnotify/fsnotify" ) func TestDaemonWatchesOnlyRulePaths(t *testing.T) { m, _ := setup(t) watcher, err := fsnotify.NewWatcher() if err != nil { t.Fatal(err) } t.Cleanup(func() { watcher.Close() }) d := &daemon{client: m.client, watcher: watcher, owners: map[string]string{}, trees: map[string]tree{}} gitDir := filepath.Join(m.root, ".git") expectWatched := func(want ...string) { t.Helper() slices.Sort(want) if got := slices.Sorted(maps.Keys(d.owners)); !slices.Equal(got, want) { t.Fatalf("watching %v, want %v", got, want) } } write(t, m.root, "target/debug/deps/big.o", "build output") write(t, m.root, "docs/agents/sub/note.md", "note") d.watch(m.root) expectWatched(m.root, gitDir, filepath.Join(m.root, "docs"), filepath.Join(m.root, "docs/agents"), filepath.Join(m.root, "docs/agents/sub")) write(t, m.root, RulesFile, "shared notes/plans\n") if err := os.RemoveAll(filepath.Join(m.root, "docs/agents/sub")); err != nil { t.Fatal(err) } d.watch(m.root) expectWatched(m.root, gitDir) for name, want := range map[string]bool{ "notes": true, "notes/plans/a.md": true, RulesFile: true, ".git/HEAD": true, ".git/index": false, "notes/plans/a.lodge-tmp": false, "docs/agents/x.md": false, "target/debug/deps/big.o": false, } { if got := d.trees[m.root].relevant(m.root, filepath.Join(m.root, name)); got != want { t.Errorf("relevant(%s) = %v, want %v", name, got, want) } } } func TestDaemonForgetsVanishedWorktrees(t *testing.T) { c := &Client{DataDir: t.TempDir()} if err := writeJSONFile(c.registryPath(), []string{filepath.Join(t.TempDir(), "gone")}); err != nil { t.Fatal(err) } d := &daemon{client: c, owners: map[string]string{}, trees: map[string]tree{}} d.syncAll() if roots := c.Worktrees(); len(roots) != 0 { t.Fatalf("registry still lists %v", roots) } }