Push the Coverages namespace coverage up further: * CoverageLive.Index — delete and recompute event handlers, the in-progress flash branch, status_badge_class fallback. 35% → 87%. * CoverageLive.Form — invalid-save round-trip, location_picked and use_site_location event handlers. 61% → 77%. * Coverages.Raster — query_rssi guard branches (not_ready, outside_bbox, raster_missing, missing-bbox), cleanup no-op, and Lidar.Reader parse_aaigrid header parsing. 63% → 75%. * Coverages.Buildings — to_clutter height fallback, polygon coord extraction, for_bbox PostGIS intersect against real DB rows. 43% → ~95%. * Coverages context — topic helpers, subscribe + broadcast, list_ready_for_organization, change_coverage, query_point happy and empty paths, queue_compute idempotency. 65% → 93%. Total project coverage 74.05% → 74.25%.
76 lines
2.7 KiB
Elixir
76 lines
2.7 KiB
Elixir
defmodule ToweropsWeb.CoverageLive.IndexTest 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
|
|
|
|
test "renders empty state when org has no coverages", %{conn: conn} do
|
|
{:ok, _view, html} = live(conn, ~p"/coverage/list")
|
|
assert html =~ "Coverage"
|
|
end
|
|
|
|
test "lists coverages for the org", %{conn: conn, org: org, site: site} do
|
|
cov = coverage_fixture(org.id, site.id, %{name: "Sector North"})
|
|
|
|
{:ok, _view, html} = live(conn, ~p"/coverage/list")
|
|
assert html =~ cov.name
|
|
end
|
|
|
|
test "requires authentication" do
|
|
conn = build_conn()
|
|
assert {:error, {:redirect, %{to: path}}} = live(conn, ~p"/coverage/list")
|
|
assert path =~ "/users/log-in"
|
|
end
|
|
|
|
describe "events" do
|
|
test "delete removes the coverage and refreshes the list", %{conn: conn, org: org, site: site} do
|
|
cov = coverage_fixture(org.id, site.id, %{name: "Doomed"})
|
|
{:ok, view, html} = live(conn, ~p"/coverage/list")
|
|
assert html =~ "Doomed"
|
|
|
|
html = render_click(view, "delete", %{"id" => cov.id})
|
|
refute html =~ "Doomed"
|
|
end
|
|
|
|
test "recompute flips a draft coverage to queued and reloads", %{conn: conn, org: org, site: site} do
|
|
cov = coverage_fixture(org.id, site.id, %{name: "Recomp"})
|
|
{:ok, view, _html} = live(conn, ~p"/coverage/list")
|
|
|
|
html = render_click(view, "recompute", %{"id" => cov.id})
|
|
assert html =~ "queued"
|
|
end
|
|
|
|
test "recompute returns the in-progress flash if already computing", %{conn: conn, org: org, site: site} do
|
|
cov = coverage_fixture(org.id, site.id)
|
|
{:ok, _} = Towerops.Coverages.mark_status(cov, "computing", %{})
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/coverage/list")
|
|
html = render_click(view, "recompute", %{"id" => cov.id})
|
|
assert html =~ "already being computed"
|
|
end
|
|
end
|
|
|
|
describe "status_badge_class/1" do
|
|
alias ToweropsWeb.CoverageLive.Index, as: Idx
|
|
|
|
test "maps known statuses to themed classes" do
|
|
assert Idx.status_badge_class("ready") =~ "bg-green"
|
|
assert Idx.status_badge_class("failed") =~ "bg-red"
|
|
assert Idx.status_badge_class("computing") =~ "bg-yellow"
|
|
assert Idx.status_badge_class("queued") =~ "bg-blue"
|
|
assert Idx.status_badge_class("draft") =~ "bg-gray"
|
|
assert Idx.status_badge_class("anything-else") =~ "bg-gray"
|
|
end
|
|
end
|
|
end
|