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}