From 4f44265f1d88b7773df027aba15f0a4a4a3bb754 Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Sat, 13 Dec 2025 08:42:02 +1100 Subject: [PATCH] fix: make hook tests worktree-aware by using getGitDir() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tests were hardcoding '.git' paths directly, which fails in git worktrees where .git is a file (not a directory) containing a pointer to the actual git directory. Changes: - Replace hardcoded '.git' paths with getGitDir() calls in all hook tests - Add os.MkdirAll() calls to ensure hooks directory exists before writing Fixes test failures in: - TestInstallHooks, TestInstallHooksBackup, TestInstallHooksForce, TestUninstallHooks, TestInstallHooksShared (hooks_test.go) - TestDetectExistingHooks, TestInstallGitHooks_NoExistingHooks, TestInstallGitHooks_ExistingHookBackup (init_hooks_test.go) Cherry-picked from PR #472 Co-Authored-By: matt wilkie 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- cmd/bd/hooks_test.go | 40 ++++++++++++++++++++++++++++++++++----- cmd/bd/init_hooks_test.go | 26 +++++++++++++++++++------ 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/cmd/bd/hooks_test.go b/cmd/bd/hooks_test.go index 67fd0a87..e3f30ee8 100644 --- a/cmd/bd/hooks_test.go +++ b/cmd/bd/hooks_test.go @@ -43,7 +43,11 @@ func TestInstallHooks(t *testing.T) { t.Skipf("Skipping test: git init failed: %v", err) } - gitDir := filepath.Join(tmpDir, ".git", "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + gitDir := filepath.Join(gitDirPath, "hooks") // Get embedded hooks hooks, err := getEmbeddedHooks() @@ -90,7 +94,16 @@ func TestInstallHooksBackup(t *testing.T) { t.Skipf("Skipping test: git init failed: %v", err) } - gitDir := filepath.Join(tmpDir, ".git", "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + gitDir := filepath.Join(gitDirPath, "hooks") + + // Ensure hooks directory exists + if err := os.MkdirAll(gitDir, 0750); err != nil { + t.Fatalf("Failed to create hooks directory: %v", err) + } // Create an existing hook existingHook := filepath.Join(gitDir, "pre-commit") @@ -138,7 +151,16 @@ func TestInstallHooksForce(t *testing.T) { t.Skipf("Skipping test: git init failed: %v", err) } - gitDir := filepath.Join(tmpDir, ".git", "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + gitDir := filepath.Join(gitDirPath, "hooks") + + // Ensure hooks directory exists + if err := os.MkdirAll(gitDir, 0750); err != nil { + t.Fatalf("Failed to create hooks directory: %v", err) + } // Create an existing hook existingHook := filepath.Join(gitDir, "pre-commit") @@ -176,7 +198,11 @@ func TestUninstallHooks(t *testing.T) { t.Skipf("Skipping test: git init failed: %v", err) } - gitDir := filepath.Join(tmpDir, ".git", "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + gitDir := filepath.Join(gitDirPath, "hooks") // Get embedded hooks and install them hooks, err := getEmbeddedHooks() @@ -294,7 +320,11 @@ func TestInstallHooksShared(t *testing.T) { } // Verify hooks were NOT installed to .git/hooks/ - standardHooksDir := filepath.Join(".git", "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + standardHooksDir := filepath.Join(gitDirPath, "hooks") for hookName := range hooks { hookPath := filepath.Join(standardHooksDir, hookName) if _, err := os.Stat(hookPath); !os.IsNotExist(err) { diff --git a/cmd/bd/init_hooks_test.go b/cmd/bd/init_hooks_test.go index d150496e..96dcf378 100644 --- a/cmd/bd/init_hooks_test.go +++ b/cmd/bd/init_hooks_test.go @@ -18,8 +18,11 @@ func TestDetectExistingHooks(t *testing.T) { t.Skipf("Skipping test: git init failed: %v", err) } - gitDir := filepath.Join(tmpDir, ".git") - hooksDir := filepath.Join(gitDir, "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + hooksDir := filepath.Join(gitDirPath, "hooks") tests := []struct { name string @@ -109,8 +112,11 @@ func TestInstallGitHooks_NoExistingHooks(t *testing.T) { t.Skipf("Skipping test: git init failed: %v", err) } - gitDir := filepath.Join(tmpDir, ".git") - hooksDir := filepath.Join(gitDir, "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + hooksDir := filepath.Join(gitDirPath, "hooks") // Note: Can't fully test interactive prompt in automated tests // This test verifies the logic works when no existing hooks present @@ -148,8 +154,16 @@ func TestInstallGitHooks_ExistingHookBackup(t *testing.T) { t.Skipf("Skipping test: git init failed: %v", err) } - gitDir := filepath.Join(tmpDir, ".git") - hooksDir := filepath.Join(gitDir, "hooks") + gitDirPath, err := getGitDir() + if err != nil { + t.Fatalf("getGitDir() failed: %v", err) + } + hooksDir := filepath.Join(gitDirPath, "hooks") + + // Ensure hooks directory exists + if err := os.MkdirAll(hooksDir, 0750); err != nil { + t.Fatalf("Failed to create hooks directory: %v", err) + } // Create an existing pre-commit hook preCommitPath := filepath.Join(hooksDir, "pre-commit")