loadbugs_stale_test.go
1package main
2
3import (
4 "os/exec"
5 "testing"
6 "time"
7
8 "github.com/git-bug/git-bug/entities/bug"
9 "github.com/git-bug/git-bug/entities/identity"
10 "github.com/git-bug/git-bug/repository"
11)
12
13// TestLoadBugs_SeesRefsAddedWithoutCacheUpdate reproduces the sovrn
14// regression where `bug list` missed 34 of 55 refs because
15// cache.NewRepoCache loaded stale on-disk excerpts (.git/cache/bugs).
16// The second bug is committed directly via bug.Create+Commit, bypassing
17// excerpt updates, simulating refs added by fetch/another binary.
18func TestLoadBugs_SeesRefsAddedWithoutCacheUpdate(t *testing.T) {
19 tmpDir := t.TempDir()
20
21 initCmd := exec.Command("git", "init")
22 initCmd.Dir = tmpDir
23 if err := initCmd.Run(); err != nil {
24 t.Fatalf("failed to init git repo: %v", err)
25 }
26
27 if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
28 t.Fatalf("failed to create identity: %v", err)
29 }
30
31 // First bug via cached path (populates excerpts).
32 if err := runNew(tmpDir, "First bug", "first", ""); err != nil {
33 t.Fatalf("runNew failed: %v", err)
34 }
35
36 // Second bug directly, bypassing cache excerpt writes.
37 repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
38 if err != nil {
39 t.Fatalf("failed to open repo: %v", err)
40 }
41 author, err := identity.GetUserIdentity(repo)
42 if err != nil {
43 repo.Close()
44 t.Fatalf("failed to get user identity: %v", err)
45 }
46 b, _, err := bug.Create(author, time.Now().Unix(), "Second bug", "second", nil, nil)
47 if err != nil {
48 repo.Close()
49 t.Fatalf("bug.Create failed: %v", err)
50 }
51 if err := b.Commit(repo); err != nil {
52 repo.Close()
53 t.Fatalf("bug Commit failed: %v", err)
54 }
55 repo.Close()
56
57 issues, err := LoadBugs(tmpDir)
58 if err != nil {
59 t.Fatalf("LoadBugs failed: %v", err)
60 }
61
62 if len(issues) != 2 {
63 t.Fatalf("LoadBugs returned %d issues, want 2 (stale cache hides refs added without excerpt update)", len(issues))
64 }
65
66 found := map[string]bool{}
67 for _, iss := range issues {
68 found[iss.Title] = true
69 }
70 if !found["First bug"] || !found["Second bug"] {
71 t.Fatalf("LoadBugs missing titles, got %v", found)
72 }
73}