towerops/test/towerops_web/live/coverage_live/index_test.exs
Graham McIntire 7adc2fb0a6 test(coverage): add tests for index/form events, raster, buildings, context
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%.
2026-05-07 09:36:16 -05:00

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