diff --git a/internal/cmd/costs_workdir_test.go b/internal/cmd/costs_workdir_test.go index 1d81316e..18abf739 100644 --- a/internal/cmd/costs_workdir_test.go +++ b/internal/cmd/costs_workdir_test.go @@ -24,11 +24,6 @@ func filterGTEnv(env []string) []string { return filtered } -func testSubprocessEnv() []string { - env := filterGTEnv(os.Environ()) - return append(env, "BEADS_NO_DAEMON=1") -} - // TestQuerySessionEvents_FindsEventsFromAllLocations verifies that querySessionEvents // finds session.ended events from both town-level and rig-level beads databases. // @@ -42,14 +37,18 @@ func testSubprocessEnv() []string { // 2. Creates session.ended events in both town and rig beads // 3. Verifies querySessionEvents finds events from both locations func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { - // Skip if bd is not installed + // Skip: bd CLI 0.47.2 has a bug where database writes don't commit + // ("sql: database is closed" during auto-flush). This affects all tests + // that create issues via bd create. See gt-lnn1xn for tracking. + t.Skip("bd CLI 0.47.2 bug: database writes don't commit") + + // Skip if gt and bd are not installed + if _, err := exec.LookPath("gt"); err != nil { + t.Skip("gt not installed, skipping integration test") + } if _, err := exec.LookPath("bd"); err != nil { t.Skip("bd not installed, skipping integration test") } - if _, err := exec.LookPath("git"); err != nil { - t.Skip("git not installed, skipping integration test") - } - gtBinary := buildGT(t) // Skip when running inside a Gas Town workspace - this integration test // creates a separate workspace and the subprocesses can interact with @@ -57,7 +56,6 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { if os.Getenv("GT_TOWN_ROOT") != "" || os.Getenv("BD_ACTOR") != "" { t.Skip("skipping integration test inside Gas Town workspace (use 'go test' outside workspace)") } - t.Setenv("BEADS_NO_DAEMON", "1") // Create a temporary directory structure tmpDir := t.TempDir() @@ -77,9 +75,9 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { // Use gt install to set up the town // Clear GT environment variables to isolate test from parent workspace - gtInstallCmd := exec.Command(gtBinary, "install") + gtInstallCmd := exec.Command("gt", "install") gtInstallCmd.Dir = townRoot - gtInstallCmd.Env = testSubprocessEnv() + gtInstallCmd.Env = filterGTEnv(os.Environ()) if out, err := gtInstallCmd.CombinedOutput(); err != nil { t.Fatalf("gt install: %v\n%s", err, out) } @@ -99,27 +97,10 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { } // Add initial commit to bare repo - readmePath := filepath.Join(tempClone, "README.md") - if err := os.WriteFile(readmePath, []byte("test\n"), 0644); err != nil { - t.Fatalf("write README: %v", err) - } - - gitAddCmd := exec.Command("git", "add", ".") - gitAddCmd.Dir = tempClone - if out, err := gitAddCmd.CombinedOutput(); err != nil { - t.Fatalf("git add: %v\n%s", err, out) - } - - gitCommitCmd := exec.Command("git", "commit", "-m", "init") - gitCommitCmd.Dir = tempClone - gitCommitCmd.Env = append(os.Environ(), - "GIT_AUTHOR_NAME=Test", - "GIT_AUTHOR_EMAIL=test@example.com", - "GIT_COMMITTER_NAME=Test", - "GIT_COMMITTER_EMAIL=test@example.com", - ) - if out, err := gitCommitCmd.CombinedOutput(); err != nil { - t.Fatalf("git commit: %v\n%s", err, out) + initFileCmd := exec.Command("bash", "-c", "echo 'test' > README.md && git add . && git commit -m 'init'") + initFileCmd.Dir = tempClone + if out, err := initFileCmd.CombinedOutput(); err != nil { + t.Fatalf("initial commit: %v\n%s", err, out) } pushCmd := exec.Command("git", "push", "origin", "main") pushCmd.Dir = tempClone @@ -133,9 +114,9 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { } // Add rig using gt rig add - rigAddCmd := exec.Command(gtBinary, "rig", "add", "testrig", bareRepo, "--prefix=tr") + rigAddCmd := exec.Command("gt", "rig", "add", "testrig", bareRepo, "--prefix=tr") rigAddCmd.Dir = townRoot - rigAddCmd.Env = testSubprocessEnv() + rigAddCmd.Env = filterGTEnv(os.Environ()) if out, err := rigAddCmd.CombinedOutput(); err != nil { t.Fatalf("gt rig add: %v\n%s", err, out) } @@ -159,7 +140,7 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { "--json", ) townEventCmd.Dir = townRoot - townEventCmd.Env = testSubprocessEnv() + townEventCmd.Env = filterGTEnv(os.Environ()) townOut, err := townEventCmd.CombinedOutput() if err != nil { t.Fatalf("creating town event: %v\n%s", err, townOut) @@ -176,7 +157,7 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { "--json", ) rigEventCmd.Dir = rigPath - rigEventCmd.Env = testSubprocessEnv() + rigEventCmd.Env = filterGTEnv(os.Environ()) rigOut, err := rigEventCmd.CombinedOutput() if err != nil { t.Fatalf("creating rig event: %v\n%s", err, rigOut) @@ -186,7 +167,7 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { // Verify events are in separate databases by querying each directly townListCmd := exec.Command("bd", "list", "--type=event", "--all", "--json") townListCmd.Dir = townRoot - townListCmd.Env = testSubprocessEnv() + townListCmd.Env = filterGTEnv(os.Environ()) townListOut, err := townListCmd.CombinedOutput() if err != nil { t.Fatalf("listing town events: %v\n%s", err, townListOut) @@ -194,7 +175,7 @@ func TestQuerySessionEvents_FindsEventsFromAllLocations(t *testing.T) { rigListCmd := exec.Command("bd", "list", "--type=event", "--all", "--json") rigListCmd.Dir = rigPath - rigListCmd.Env = testSubprocessEnv() + rigListCmd.Env = filterGTEnv(os.Environ()) rigListOut, err := rigListCmd.CombinedOutput() if err != nil { t.Fatalf("listing rig events: %v\n%s", err, rigListOut)