Current section

Files

Jump to
excessibility lib live_view.ex
Raw

lib/live_view.ex

defmodule Excessibility.LiveView do
@moduledoc """
Provides functions for working with Phoenix LiveView test structures.
This module handles rendering LiveView trees and extracting proxy information
from LiveView test views and elements, enabling accurate HTML snapshotting
for accessibility testing.
"""
@behaviour Excessibility.LiveView.Behaviour
alias Phoenix.LiveViewTest.Element, as: LiveElement
alias Phoenix.LiveViewTest.View
def render_tree(%View{} = view) do
render_tree(view, {proxy_topic(view), "render", view.target})
end
def render_tree(%LiveElement{} = element) do
render_tree(element, element)
end
def render_tree(view_or_element, topic_or_element) do
call(view_or_element, {:render_element, :find_element, topic_or_element})
end
def call(view_or_element, tuple) do
GenServer.call(proxy_pid(view_or_element), tuple, 30_000)
catch
:exit, {{:shutdown, {kind, opts}}, _} when kind in [:redirect, :live_redirect] ->
{:error, {kind, opts}}
:exit, {{exception, stack}, _} ->
exit({{exception, stack}, {__MODULE__, :call, [view_or_element]}})
else
:ok -> :ok
{:ok, result} -> result
{:raise, exception} -> raise exception
end
def proxy_pid(%{proxy: {_ref, _topic, pid}}), do: pid
def proxy_topic(%{proxy: {_ref, topic, _pid}}), do: topic
end
defmodule Excessibility.LiveView.Behaviour do
@moduledoc false
@callback render_tree(any()) :: String.t()
end