···74747575// used by html elements as a unique ID for hrefs
7676func (d *Diff) Id() string {
7777+ if d.IsDelete {
7878+ return d.Name.Old
7979+ }
7780 return d.Name.New
7881}
7982
+112
types/diff_test.go
···11+package types
22+33+import "testing"
44+55+func TestDiffId(t *testing.T) {
66+ tests := []struct {
77+ name string
88+ diff Diff
99+ expected string
1010+ }{
1111+ {
1212+ name: "regular file uses new name",
1313+ diff: Diff{
1414+ Name: struct {
1515+ Old string `json:"old"`
1616+ New string `json:"new"`
1717+ }{Old: "", New: "src/main.go"},
1818+ },
1919+ expected: "src/main.go",
2020+ },
2121+ {
2222+ name: "new file uses new name",
2323+ diff: Diff{
2424+ Name: struct {
2525+ Old string `json:"old"`
2626+ New string `json:"new"`
2727+ }{Old: "", New: "src/new.go"},
2828+ IsNew: true,
2929+ },
3030+ expected: "src/new.go",
3131+ },
3232+ {
3333+ name: "deleted file uses old name",
3434+ diff: Diff{
3535+ Name: struct {
3636+ Old string `json:"old"`
3737+ New string `json:"new"`
3838+ }{Old: "src/deleted.go", New: ""},
3939+ IsDelete: true,
4040+ },
4141+ expected: "src/deleted.go",
4242+ },
4343+ {
4444+ name: "renamed file uses new name",
4545+ diff: Diff{
4646+ Name: struct {
4747+ Old string `json:"old"`
4848+ New string `json:"new"`
4949+ }{Old: "src/old.go", New: "src/renamed.go"},
5050+ IsRename: true,
5151+ },
5252+ expected: "src/renamed.go",
5353+ },
5454+ }
5555+5656+ for _, tt := range tests {
5757+ t.Run(tt.name, func(t *testing.T) {
5858+ if got := tt.diff.Id(); got != tt.expected {
5959+ t.Errorf("Diff.Id() = %q, want %q", got, tt.expected)
6060+ }
6161+ })
6262+ }
6363+}
6464+6565+func TestChangedFilesMatchesDiffId(t *testing.T) {
6666+ // ChangedFiles() must return values matching each Diff's Id()
6767+ // so that sidebar links point to the correct anchors.
6868+ // Tests existing, deleted, new, and renamed files.
6969+ nd := NiceDiff{
7070+ Diff: []Diff{
7171+ {
7272+ Name: struct {
7373+ Old string `json:"old"`
7474+ New string `json:"new"`
7575+ }{Old: "", New: "src/modified.go"},
7676+ },
7777+ {
7878+ Name: struct {
7979+ Old string `json:"old"`
8080+ New string `json:"new"`
8181+ }{Old: "src/deleted.go", New: ""},
8282+ IsDelete: true,
8383+ },
8484+ {
8585+ Name: struct {
8686+ Old string `json:"old"`
8787+ New string `json:"new"`
8888+ }{Old: "", New: "src/new.go"},
8989+ IsNew: true,
9090+ },
9191+ {
9292+ Name: struct {
9393+ Old string `json:"old"`
9494+ New string `json:"new"`
9595+ }{Old: "src/old.go", New: "src/renamed.go"},
9696+ IsRename: true,
9797+ },
9898+ },
9999+ }
100100+101101+ changedFiles := nd.ChangedFiles()
102102+103103+ if len(changedFiles) != len(nd.Diff) {
104104+ t.Fatalf("ChangedFiles() returned %d items, want %d", len(changedFiles), len(nd.Diff))
105105+ }
106106+107107+ for i, diff := range nd.Diff {
108108+ if changedFiles[i] != diff.Id() {
109109+ t.Errorf("ChangedFiles()[%d] = %q, but Diff.Id() = %q", i, changedFiles[i], diff.Id())
110110+ }
111111+ }
112112+}