From 15fe7abdca687a563d2e2d063eef3e2334059fb8 Mon Sep 17 00:00:00 2001 From: Evan Jarrett Date: Fri, 26 Dec 2025 10:02:54 -0600 Subject: [PATCH] appview/fragments/diff, types/diff: fix anchor on deleted files for sidebar navigation Signed-off-by: Evan Jarrett --- .../pages/templates/repo/fragments/diff.html | 2 +- types/diff.go | 3 + types/diff_test.go | 112 ++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 types/diff_test.go diff --git a/appview/pages/templates/repo/fragments/diff.html b/appview/pages/templates/repo/fragments/diff.html index 1f17636a..88748532 100644 --- a/appview/pages/templates/repo/fragments/diff.html +++ b/appview/pages/templates/repo/fragments/diff.html @@ -17,7 +17,7 @@ {{ else }} {{ range $idx, $hunk := $diff }} {{ with $hunk }} -
+
diff --git a/types/diff.go b/types/diff.go index 8cdea07c..5eb0fc5f 100644 --- a/types/diff.go +++ b/types/diff.go @@ -74,6 +74,9 @@ func (d *NiceDiff) ChangedFiles() []string { // used by html elements as a unique ID for hrefs func (d *Diff) Id() string { + if d.IsDelete { + return d.Name.Old + } return d.Name.New } diff --git a/types/diff_test.go b/types/diff_test.go new file mode 100644 index 00000000..cde4ff64 --- /dev/null +++ b/types/diff_test.go @@ -0,0 +1,112 @@ +package types + +import "testing" + +func TestDiffId(t *testing.T) { + tests := []struct { + name string + diff Diff + expected string + }{ + { + name: "regular file uses new name", + diff: Diff{ + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "", New: "src/main.go"}, + }, + expected: "src/main.go", + }, + { + name: "new file uses new name", + diff: Diff{ + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "", New: "src/new.go"}, + IsNew: true, + }, + expected: "src/new.go", + }, + { + name: "deleted file uses old name", + diff: Diff{ + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "src/deleted.go", New: ""}, + IsDelete: true, + }, + expected: "src/deleted.go", + }, + { + name: "renamed file uses new name", + diff: Diff{ + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "src/old.go", New: "src/renamed.go"}, + IsRename: true, + }, + expected: "src/renamed.go", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.diff.Id(); got != tt.expected { + t.Errorf("Diff.Id() = %q, want %q", got, tt.expected) + } + }) + } +} + +func TestChangedFilesMatchesDiffId(t *testing.T) { + // ChangedFiles() must return values matching each Diff's Id() + // so that sidebar links point to the correct anchors. + // Tests existing, deleted, new, and renamed files. + nd := NiceDiff{ + Diff: []Diff{ + { + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "", New: "src/modified.go"}, + }, + { + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "src/deleted.go", New: ""}, + IsDelete: true, + }, + { + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "", New: "src/new.go"}, + IsNew: true, + }, + { + Name: struct { + Old string `json:"old"` + New string `json:"new"` + }{Old: "src/old.go", New: "src/renamed.go"}, + IsRename: true, + }, + }, + } + + changedFiles := nd.ChangedFiles() + + if len(changedFiles) != len(nd.Diff) { + t.Fatalf("ChangedFiles() returned %d items, want %d", len(changedFiles), len(nd.Diff)) + } + + for i, diff := range nd.Diff { + if changedFiles[i] != diff.Id() { + t.Errorf("ChangedFiles()[%d] = %q, but Diff.Id() = %q", i, changedFiles[i], diff.Id()) + } + } +} -- 2.43.0