Analysis found these commands are dead code: - gt never calls `bd pin` - uses `bd update --status=pinned` instead - Beads.Pin() wrapper exists but is never called - bd hook functionality duplicated by gt mol status - Code comment says "pinned field is cosmetic for bd hook visibility" Removed: - cmd/bd/pin.go - cmd/bd/unpin.go - cmd/bd/hook.go 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
108 lines
2.7 KiB
Go
108 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/steveyegge/beads/internal/types"
|
|
)
|
|
|
|
func TestTouchDatabaseFile_UsesJSONLMtime(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
dbPath := filepath.Join(tmp, "beads.db")
|
|
jsonlPath := filepath.Join(tmp, "issues.jsonl")
|
|
|
|
if err := os.WriteFile(dbPath, []byte(""), 0o600); err != nil {
|
|
t.Fatalf("WriteFile db: %v", err)
|
|
}
|
|
if err := os.WriteFile(jsonlPath, []byte("{}\n"), 0o600); err != nil {
|
|
t.Fatalf("WriteFile jsonl: %v", err)
|
|
}
|
|
|
|
jsonlTime := time.Now().Add(2 * time.Second)
|
|
if err := os.Chtimes(jsonlPath, jsonlTime, jsonlTime); err != nil {
|
|
t.Fatalf("Chtimes jsonl: %v", err)
|
|
}
|
|
|
|
if err := TouchDatabaseFile(dbPath, jsonlPath); err != nil {
|
|
t.Fatalf("TouchDatabaseFile: %v", err)
|
|
}
|
|
|
|
info, err := os.Stat(dbPath)
|
|
if err != nil {
|
|
t.Fatalf("Stat db: %v", err)
|
|
}
|
|
if info.ModTime().Before(jsonlTime) {
|
|
t.Fatalf("db mtime %v should be >= jsonl mtime %v", info.ModTime(), jsonlTime)
|
|
}
|
|
}
|
|
|
|
func TestImportDetectPrefixFromIssues(t *testing.T) {
|
|
if detectPrefixFromIssues(nil) != "" {
|
|
t.Fatalf("expected empty")
|
|
}
|
|
|
|
issues := []*types.Issue{
|
|
{ID: "test-1"},
|
|
{ID: "test-2"},
|
|
{ID: "other-1"},
|
|
}
|
|
if got := detectPrefixFromIssues(issues); got != "test" {
|
|
t.Fatalf("got %q, want %q", got, "test")
|
|
}
|
|
}
|
|
|
|
func TestCountLines(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
p := filepath.Join(tmp, "f.txt")
|
|
if err := os.WriteFile(p, []byte("a\n\nb\n"), 0o600); err != nil {
|
|
t.Fatalf("WriteFile: %v", err)
|
|
}
|
|
if got := countLines(p); got != 3 {
|
|
t.Fatalf("countLines=%d, want 3", got)
|
|
}
|
|
}
|
|
|
|
func TestCheckUncommittedChanges_Warns(t *testing.T) {
|
|
_, cleanup := setupGitRepo(t)
|
|
defer cleanup()
|
|
|
|
if err := os.WriteFile("issues.jsonl", []byte("{\"id\":\"test-1\"}\n"), 0o600); err != nil {
|
|
t.Fatalf("WriteFile: %v", err)
|
|
}
|
|
_ = execCmd(t, "git", "add", "issues.jsonl")
|
|
_ = execCmd(t, "git", "commit", "-m", "add issues")
|
|
|
|
// Modify without committing.
|
|
if err := os.WriteFile("issues.jsonl", []byte("{\"id\":\"test-1\"}\n{\"id\":\"test-2\"}\n"), 0o600); err != nil {
|
|
t.Fatalf("WriteFile: %v", err)
|
|
}
|
|
|
|
warn := captureStderr(t, func() {
|
|
checkUncommittedChanges("issues.jsonl", &ImportResult{})
|
|
})
|
|
if !strings.Contains(warn, "uncommitted changes") {
|
|
t.Fatalf("expected warning, got: %q", warn)
|
|
}
|
|
|
|
noWarn := captureStderr(t, func() {
|
|
checkUncommittedChanges("issues.jsonl", &ImportResult{Created: 1})
|
|
})
|
|
if noWarn != "" {
|
|
t.Fatalf("expected no warning, got: %q", noWarn)
|
|
}
|
|
}
|
|
|
|
func execCmd(t *testing.T, name string, args ...string) string {
|
|
t.Helper()
|
|
out, err := exec.Command(name, args...).CombinedOutput()
|
|
if err != nil {
|
|
t.Fatalf("%s %v failed: %v\n%s", name, args, err, out)
|
|
}
|
|
return string(out)
|
|
}
|