- Remove Mox.set_mox_global() in DPW extra test; rely on $callers
instead so concurrent vendor SNMP tests stop intermittently failing
with VerificationError.
- Make ToweropsWeb.Plugs.GraphQLIntrospectionTest async: false. It
mutates Application.put_env(:towerops, :env, :prod), which polluted
every async vendor test that reads :env via
Towerops.Snmp.Client.phoenix_snmp_disabled/0.
- Bump test pool queue_target/queue_interval. AgentChannelTest spawns
many `:proc_lib` channel processes that hold sandbox connections;
the default 50ms queue caused intermittent
'could not checkout the connection' errors.
- Tag real-System.cmd("ping") tests as :network so they're excluded
by default. Saves ~20s on every full run.
- Make JobCleanupTask's internal 1s settle sleep configurable via
:job_cleanup_settle_ms; the test overrides it to 0.
Plus the pending CoverageLive.Form edit-save / EIRP recompute and
TraceLive deep-link tests from before the compact.
152 lines
4.4 KiB
Elixir
152 lines
4.4 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 =~ "New Coverage" or html =~ "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 =~ "Coverage" or html =~ "blank" or html =~ "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()
|
|
|
|
assert is_binary(result) or match?({:error, {:redirect, _}}, result) or
|
|
match?({:error, {:live_redirect, _}}, result)
|
|
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)
|
|
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)
|
|
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)
|
|
end
|
|
end
|
|
end
|