Files
labelmaker/test/labelmaker_web/live/home_test.exs
2025-10-13 08:24:31 -04:00

195 lines
5.2 KiB
Elixir

defmodule LabelmakerWeb.HomeTest do
use LabelmakerWeb.ConnCase, async: true
import Phoenix.LiveViewTest
describe "Home LiveView" do
test "mounts successfully and displays form", %{conn: conn} do
{:ok, view, html} = live(conn, ~p"/")
assert html =~ "Labelmaker"
assert has_element?(view, "textarea[name='label']")
end
test "displays default values on mount", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
# Check that default values are present
assert has_element?(view, "select[name='color']")
assert has_element?(view, "select[name='font']")
assert has_element?(view, "select[name='size']")
end
test "updates label text", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"label" => "Test Label"})
assert render(view) =~ "Test Label"
end
test "updates color selection", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"color" => "red"})
# The preview should update with the new color
html = render(view)
assert html =~ "red" or has_element?(view, "[data-color='red']")
end
test "updates font selection", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"font" => "Impact"})
html = render(view)
assert html =~ "Impact" or has_element?(view, "[data-font='Impact']")
end
test "updates size selection", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"size" => "96"})
html = render(view)
assert html =~ "96" or has_element?(view, "[data-size='96']")
end
test "updates outline selection", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"outline" => "blue"})
html = render(view)
assert html =~ "blue" or has_element?(view, "[data-outline='blue']")
end
test "handles preview background toggle", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
# Simulate clicking background toggle
render_click(view, "update_preview", %{"bg" => "b"})
# View should still render without error
assert render(view)
end
test "handles sizing mode toggle", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
# Switch to width x height mode
render_click(view, "update_sizing", %{"sizing" => "wxh"})
html = render(view)
# Should now show width/height inputs
assert has_element?(view, "input[name='width']") or html =~ "width"
end
test "handles alignment change", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
# Change alignment
render_click(view, "update_alignment", %{"option" => "left"})
# View should update without error
assert render(view)
end
test "converts escaped newlines in preview", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"label" => "Line1\\nLine2"})
html = render(view)
# Should show actual line break in preview (as <br />)
assert html =~ "<br" or html =~ "Line1" and html =~ "Line2"
end
test "shows warning for long labels", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
long_label = String.duplicate("a", 2000)
view
|> element("form")
|> render_change(%{"label" => long_label})
html = render(view)
# Should show some kind of warning or truncation indicator
assert html =~ "1024" or html =~ "maximum" or html =~ "too long"
end
test "generates valid preview link", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{
"label" => "TestLabel",
"color" => "red",
"size" => "96"
})
html = render(view)
# Should contain a link to the generated image
assert html =~ "/TestLabel" or html =~ "href"
end
test "handles multiple rapid updates", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
# Simulate rapid changes
view
|> element("form")
|> render_change(%{"label" => "Test1"})
view
|> element("form")
|> render_change(%{"label" => "Test2"})
view
|> element("form")
|> render_change(%{"color" => "blue"})
# Should handle all updates without crashing
assert render(view)
end
test "handles special characters in label", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"label" => "Test!@#$%^&*()"})
# Should handle special characters without crashing
assert render(view)
end
test "handles emoji in label", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/")
view
|> element("form")
|> render_change(%{"label" => "Hello 🎉 World 🚀"})
# Should handle emoji without crashing
html = render(view)
assert html =~ "Hello" or html =~ "World"
end
end
end