yak(behavior-tests-editorial-liveviews-microprints-editor-dashboard-llh3): behavior tests: editorial LiveViews (microprints, editor dashboard)

This commit is contained in:
Willem van den Ende
2026-10-28 22:27:59 +00:00
parent 44a343ae72
commit b72446b80e
5 changed files with 120 additions and 31 deletions
@@ -87,6 +87,41 @@ defmodule FirehoseWeb.EditorDashboardLiveTest do
refute html =~ "Live Post"
end
test "switching Drafts -> Scheduled -> Drafts shows the matching panel", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/editor/dashboard")
# Both panels are always in the DOM, and only the inactive one is marked
# `hidden`: the panel's own class is the only server-side signal of what
# the reader sees. The panel-scoped content assertions below keep this
# from being a class check alone.
assert has_element?(view, "#drafts-tab")
refute has_element?(view, "#drafts-tab.hidden")
assert has_element?(view, "#scheduled-tab.hidden")
drafts_html = view |> element("#drafts-tab") |> render()
assert drafts_html =~ "Draft Post"
refute drafts_html =~ "Scheduled Post"
view |> element(~s(button[phx-value-tab="scheduled"])) |> render_click()
assert has_element?(view, "#scheduled-tab")
refute has_element?(view, "#scheduled-tab.hidden")
assert has_element?(view, "#drafts-tab.hidden")
scheduled_html = view |> element("#scheduled-tab") |> render()
assert scheduled_html =~ "Scheduled Post"
refute scheduled_html =~ "Draft Post"
view |> element(~s(button[phx-value-tab="drafts"])) |> render_click()
refute has_element?(view, "#drafts-tab.hidden")
assert has_element?(view, "#scheduled-tab.hidden")
drafts_again_html = view |> element("#drafts-tab") |> render()
assert drafts_again_html =~ "Draft Post"
refute drafts_again_html =~ "Scheduled Post"
end
test "renders with app layout including menu", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/editor/dashboard")
# Verify the app layout is applied by checking for menu elements
@@ -3,6 +3,7 @@ alias FirehoseWeb.MicroprintsLive
defmodule FirehoseWeb.MicroprintsLiveTest do
use FirehoseWeb.ConnCase, async: true
import FirehoseWeb.MicroprintsCase
import Phoenix.LiveViewTest
describe "scan_source_files/0" do
@@ -81,18 +82,15 @@ defmodule FirehoseWeb.MicroprintsLiveTest do
{:ok, view, _html} = live(conn, ~p"/microprints")
# Expand file A
view
|> element("button[phx-value-path=\"#{file_a}\"]", "Expand")
|> render_click()
expand_file(view, file_a)
# Verify file A shows "Collapse" button (it's expanded)
html = render(view)
assert html =~ ~s(phx-value-path="#{file_a}")
assert html =~ "Collapse"
# Highlight a line in file B by dispatching the highlight_line event
# (microprint renders multiple rect segments per line, element() can't pick one)
render_click(view, "highlight_line", %{"line" => "1", "path" => file_b})
# Highlight a line in file B
click_microprint_rect(view, file_b, 1)
# file A should be collapsed when highlighting a different file
html = render(view)
@@ -112,9 +110,7 @@ defmodule FirehoseWeb.MicroprintsLiveTest do
{:ok, view, _html} = live(conn, ~p"/microprints")
# Expand file A
view
|> element("button[phx-value-path=\"#{file_a}\"]", "Expand")
|> render_click()
expand_file(view, file_a)
# Capture file A's source content from the rendered HTML
html_a = render(view)
@@ -123,9 +119,7 @@ defmodule FirehoseWeb.MicroprintsLiveTest do
"File A source should be visible when expanded"
# Expand file B (should auto-collapse A)
view
|> element("button[phx-value-path=\"#{file_b}\"]", "Expand")
|> render_click()
expand_file(view, file_b)
# Capture file B's source content
html_b = render(view)
@@ -144,6 +138,34 @@ defmodule FirehoseWeb.MicroprintsLiveTest do
end
end
describe "collapsing an expanded file" do
test "hides the source lines and brings the Expand control back", %{conn: conn} do
# The URL route is used rather than clicking Expand: `restore_state_from_params/2`
# validates the param against the scanned cards (Enum.find over @microprints),
# so a real scanned path is required either way - see the "unknown expanded
# path in URL is ignored" test for the other half of that contract.
path = MicroprintsLive.scan_source_files() |> List.first()
{:ok, view, _html} = live(conn, ~p"/microprints?expanded=#{path}")
assert has_element?(view, "#line-1"),
"restored expansion should render the file's source lines"
assert has_element?(view, ~s(button[phx-value-path="#{path}"]), "Collapse")
collapse_file(view, path)
refute has_element?(view, "#line-1"),
"collapsing should stop rendering the source viewer"
refute render(view) =~ "Collapse",
"no card should still be expanded once the only expanded one is collapsed"
assert has_element?(view, ~s(button[phx-value-path="#{path}"]), "Expand"),
"the card's control should be Expand again"
end
end
describe "app layout with menu" do
test "renders the microprints page", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/microprints")
@@ -190,9 +212,7 @@ defmodule FirehoseWeb.MicroprintsLiveTest do
{:ok, view, _html} = live(conn, ~p"/microprints")
view
|> element("button[phx-value-path=\"#{file_a}\"]", "Expand")
|> render_click()
expand_file(view, file_a)
# URL should contain expanded param after clicking Expand
html = render(view)
@@ -1,20 +1,11 @@
defmodule FirehoseWeb.SourceViewerTest do
use FirehoseWeb.ConnCase, async: true
import FirehoseWeb.MicroprintsCase
import Phoenix.LiveViewTest
alias FirehoseWeb.MicroprintsLive
defp expand_file(view, path) do
view
|> element("button[phx-value-path=\"#{path}\"]", "Expand")
|> render_click()
end
defp click_microprint_rect(view, path, line) do
render_click(view, "highlight_line", %{"line" => Integer.to_string(line), "path" => path})
end
describe "line elements" do
test "render with unique ids when file is expanded", %{conn: conn} do
files = MicroprintsLive.scan_source_files()
+43
View File
@@ -0,0 +1,43 @@
defmodule FirehoseWeb.MicroprintsCase do
@moduledoc """
Helpers for driving the `/microprints` LiveView.
Both `FirehoseWeb.MicroprintsLiveTest` and `FirehoseWeb.SourceViewerTest` walk
the same page through the same two controls (the per-card Expand/Collapse
button and the microprint rects), so the mechanics live here instead of being
re-implemented in each test module.
A plain module, imported by the tests, rather than a `use`-able case template:
the LiveView tests own their own setup and only share these three actions.
"""
import Phoenix.LiveViewTest
@doc """
Clicks the Expand control of the card for `path` and returns the render.
"""
def expand_file(view, path) do
view
|> element(~s(button[phx-value-path="#{path}"]), "Expand")
|> render_click()
end
@doc """
Clicks the Collapse control of the card for `path` and returns the render.
"""
def collapse_file(view, path) do
view
|> element(~s(button[phx-value-path="#{path}"]), "Collapse")
|> render_click()
end
@doc """
Clicks a single line of a microprint, highlighting it in the source viewer.
The microprint renders several rect segments per line, so `element/3` cannot
pick one; the `highlight_line` event is dispatched directly instead.
"""
def click_microprint_rect(view, path, line) do
render_click(view, "highlight_line", %{"line" => Integer.to_string(line), "path" => path})
end
end