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
) assert html =~ " 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