2.8 KiB · text 5af55d9
defmodule GitGudWeb.DiffComponentsTest do
use ExUnit.Case, async: true
import Phoenix.LiveViewTest
alias GitGudWeb.DiffComponents
defp file(idx) do
%{
path: "f#{idx}.ex",
old_path: nil,
status: :modified,
binary?: false,
insertions: 1,
deletions: 0,
hunks: [
%{
header: "@@ -1 +1 @@",
lines: [%{type: :add, old_line: nil, new_line: 1, text: "hello"}]
}
]
}
end
describe "default_loaded/1" do
test "small diff preloads everything" do
assert MapSet.equal?(DiffComponents.default_loaded([file(0), file(1)]), MapSet.new([0, 1]))
end
test "medium diff caps at 5" do
files = for i <- 0..29, do: file(i)
assert DiffComponents.default_loaded(files) == MapSet.new(0..4//1)
end
test "huge diff caps at 2" do
files = for i <- 0..99, do: file(i)
assert DiffComponents.default_loaded(files) == MapSet.new(0..1//1)
end
test "empty list yields empty set" do
assert MapSet.size(DiffComponents.default_loaded([])) == 0
end
end
describe "expand/2" do
test "adds the clicked index" do
socket = %Phoenix.LiveView.Socket{assigns: %{loaded_diff_idx: MapSet.new([0]), __changed__: %{}}}
socket = DiffComponents.expand(socket, %{"idx" => "3"})
assert MapSet.member?(socket.assigns.loaded_diff_idx, 3)
end
test "garbage idx is a no-op" do
socket = %Phoenix.LiveView.Socket{assigns: %{loaded_diff_idx: MapSet.new([0]), __changed__: %{}}}
socket2 = DiffComponents.expand(socket, %{"idx" => "not-a-number"})
assert socket2.assigns.loaded_diff_idx == MapSet.new([0])
end
end
describe "diff/1 rendering" do
test "only loaded indices have hunks in the DOM" do
files = for i <- 0..2, do: file(i)
html =
render_component(&DiffComponents.diff/1,
files: files,
theme: "onedark",
loaded_idx: MapSet.new([0])
)
# File 0 is loaded: hunk table is present
assert html =~ "@@ -1 +1 @@"
# Unloaded files render the placeholder
assert html =~ "Click to load diff"
# phx-click wired
assert html =~ ~s|phx-click="expand_diff_file"|
assert html =~ ~s|phx-value-idx="1"|
assert html =~ ~s|phx-value-idx="2"|
end
test "no loaded_idx attr falls back to default_loaded" do
files = for i <- 0..1, do: file(i)
html = render_component(&DiffComponents.diff/1, files: files, theme: "onedark")
# 2-file diff preloads everything → both hunks rendered, no placeholder
refute html =~ "Click to load diff"
end
test "empty file list shows 'No changes'" do
html =
render_component(&DiffComponents.diff/1,
files: [],
theme: "onedark",
loaded_idx: MapSet.new()
)
assert html =~ "No changes"
end
end
end