towerops/test/towerops_web/live/coverage_live/form_test.exs
2026-06-15 11:15:46 -05:00

155 lines
4.5 KiB
Elixir

defmodule ToweropsWeb.CoverageLive.FormTest do
use ToweropsWeb.ConnCase
import Phoenix.LiveViewTest
import Towerops.CoveragesFixtures
import Towerops.OrganizationsFixtures
setup :register_and_log_in_user
setup %{conn: conn, user: user} do
org = organization_fixture(user.id)
site = site_fixture(org.id, %{latitude: 30.27, longitude: -97.74})
conn = Plug.Conn.put_session(conn, :current_organization_id, org.id)
%{conn: conn, org: org, site: site}
end
describe "new" do
test "renders the new-coverage form", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/coverage/new")
assert html =~ ~r/New Coverage|Coverage/
end
test "validate event re-renders with errors for blank name", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/coverage/new")
html =
view
|> form("form", coverage: %{"name" => ""})
|> render_change()
assert html =~ "Coverage"
end
test "requires authentication" do
conn = build_conn()
assert {:error, {:redirect, %{to: path}}} = live(conn, ~p"/coverage/new")
assert path =~ "/users/log-in"
end
end
describe "edit" do
test "renders the edit form populated with the existing coverage", %{conn: conn, org: org, site: site} do
cov = coverage_fixture(org.id, site.id, %{name: "EditMe"})
{:ok, _view, html} = live(conn, ~p"/coverage/#{cov.id}/edit")
assert html =~ "EditMe"
end
test "404 for unknown coverage", %{conn: conn} do
assert_raise Ecto.NoResultsError, fn ->
live(conn, ~p"/coverage/#{Ecto.UUID.generate()}/edit")
end
end
end
describe "save" do
test "saving with invalid attrs re-renders the form with errors", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/coverage/new")
html =
view
|> form("form", coverage: %{"name" => "", "antenna_slug" => "simulate-isotropic-omni-0"})
|> render_submit()
# Either an inline error or the form re-rendered (no redirect).
assert html =~ ~r/Coverage|blank|required/
end
end
describe "location_picked / use_site_location events" do
test "location_picked stages the lat/lon override on the changeset", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/coverage/new")
assert render_hook(view, "location_picked", %{"lat" => 30.27, "lon" => -97.74})
end
test "use_site_location clears the lat/lon override", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/coverage/new")
assert render_click(view, "use_site_location", %{})
end
end
describe "edit save" do
test "edit save with valid attrs redirects to show", %{conn: conn, org: org, site: site} do
cov = Towerops.CoveragesFixtures.coverage_fixture(org.id, site.id)
{:ok, view, _html} = live(conn, ~p"/coverage/#{cov.id}/edit")
result =
view
|> form("form", coverage: %{"name" => "Renamed Coverage"})
|> render_submit()
valid? =
is_binary(result) or match?({:error, {:redirect, _}}, result) or
match?({:error, {:live_redirect, _}}, result)
assert valid?
end
test "edit save with invalid name re-renders the form", %{
conn: conn,
org: org,
site: site
} do
cov = Towerops.CoveragesFixtures.coverage_fixture(org.id, site.id)
{:ok, view, _html} = live(conn, ~p"/coverage/#{cov.id}/edit")
html =
view
|> form("form", coverage: %{"name" => ""})
|> render_submit()
assert is_binary(html) and byte_size(html) > 0
end
end
describe "validate event triggers EIRP recompute" do
test "validate event with antenna_slug computes a non-zero EIRP", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/coverage/new")
html =
view
|> form("form",
coverage: %{
"name" => "Test",
"antenna_slug" => "simulate-isotropic-omni-0",
"tx_power_dbm" => "20.0"
}
)
|> render_change()
assert is_binary(html) and byte_size(html) > 0
end
test "validate event with bogus number string falls back gracefully", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/coverage/new")
html =
view
|> form("form",
coverage: %{
"name" => "Test",
"antenna_slug" => "simulate-isotropic-omni-0",
"tx_power_dbm" => "not-a-number"
}
)
|> render_change()
assert is_binary(html) and byte_size(html) > 0
end
end
end