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