195 lines
5.2 KiB
Elixir
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
|