internal/store/symbols_test.go

v1.43.1
gitbay/internal/store/symbols_test.go history · blame · raw

93 lines · 2680 bytes

 1package store
 2
 3import (
 4	"strings"
 5	"testing"
 6)
 7
 8func symbolFixture(t *testing.T) (*Store, int64) {
 9	t.Helper()
10	s := open(t)
11	if err := s.MigrateUp(); err != nil {
12		t.Fatal(err)
13	}
14	uid, err := s.CreateUser("alice", false)
15	if err != nil {
16		t.Fatal(err)
17	}
18	repoID, err := s.CreateRepo("user", uid, "app", "public")
19	if err != nil {
20		t.Fatal(err)
21	}
22	idx, err := s.ReplaceSymbolIndex(SymbolIndex{RepoID: repoID, Commit: "c", Tree: "t", State: "ok"}, []SymbolRow{
23		{Name: "handlers", Key: "handlers", Kind: "var", Path: "b.go", Line: 1},
24		{Name: "Server.Handle", Key: "Handle", Kind: "method", Path: "a.go", Line: 9},
25		{Name: "Handle", Key: "Handle", Kind: "function", Path: "z.go", Line: 3},
26		{Name: "handle", Key: "handle", Kind: "function", Path: "c.go", Line: 2},
27		{Name: "HandleFunc", Key: "HandleFunc", Kind: "function", Path: "a.go", Line: 20},
28		{Name: "Other", Key: "Other", Kind: "type", Path: "a.go", Line: 30},
29	})
30	if err != nil {
31		t.Fatal(err)
32	}
33	return s, idx
34}
35
36func symbolNames(rows []SymbolRow) string {
37	var out []string
38	for _, r := range rows {
39		out = append(out, r.Name)
40	}
41	return strings.Join(out, " ")
42}
43
44// Exact before prefix, case-sensitive before not, then by name; a method
45// matches on the name it is called by as well as Type.Method.
46func TestSearchSymbolsRanks(t *testing.T) {
47	s, idx := symbolFixture(t)
48	rows, err := s.SearchSymbols(idx, "Handle", "", 0, 0)
49	if err != nil {
50		t.Fatal(err)
51	}
52	if got, want := symbolNames(rows), "Handle Server.Handle HandleFunc handle handlers"; got != want {
53		t.Fatalf("got %q, want %q", got, want)
54	}
55	rows, _ = s.SearchSymbols(idx, "Handle", "method", 0, 0)
56	if got := symbolNames(rows); got != "Server.Handle" {
57		t.Fatalf("kind filter: %q", got)
58	}
59	rows, _ = s.SearchSymbols(idx, "server.", "", 0, 0)
60	if got := symbolNames(rows); got != "Server.Handle" {
61		t.Fatalf("Type. prefix: %q", got)
62	}
63
64	// Paging walks the same order without repeats.
65	var paged []SymbolRow
66	var after int64
67	for {
68		page, err := s.SearchSymbols(idx, "handle", "", 2, after)
69		if err != nil {
70			t.Fatal(err)
71		}
72		if len(page) == 0 {
73			break
74		}
75		paged = append(paged, page...)
76		after = page[len(page)-1].ID
77	}
78	all, _ := s.SearchSymbols(idx, "handle", "", 0, 0)
79	if symbolNames(paged) != symbolNames(all) || len(all) != 5 {
80		t.Fatalf("paged %q, all %q", symbolNames(paged), symbolNames(all))
81	}
82}
83
84func TestSymbolTargets(t *testing.T) {
85	s, idx := symbolFixture(t)
86	got, err := s.SymbolTargets(idx, []string{"Handle", "Other", "missing"})
87	if err != nil {
88		t.Fatal(err)
89	}
90	if len(got) != 2 || got["Handle"].Count != 2 || got["Other"] != (SymbolTarget{1, "a.go", 30}) {
91		t.Fatalf("targets = %+v", got)
92	}
93}