defmodule ServerWeb.OverviewLiveTest do use ServerWeb.ConnCase, async: false import Phoenix.LiveViewTest alias Server.{Hosts, Metrics} defp auth(conn), do: Plug.Test.init_test_session(conn, %{authenticated: true}) describe "mount" do test "redirects to /login when unauthenticated", %{conn: conn} do assert {:error, {:redirect, %{to: "/login"}}} = live(conn, "/") end test "renders a card for each host", %{conn: conn} do {:ok, {_h1, _}} = Hosts.create_host("pve-01") {:ok, {_h2, _}} = Hosts.create_host("pve-02") {:ok, _view, html} = live(auth(conn), "/") assert html =~ "pve-01" assert html =~ "pve-02" assert length(Floki.find(Floki.parse_document!(html), "[data-role=host-card]")) == 2 end test "reflects :critical status for a degraded pool", %{conn: conn} do {:ok, {host, _}} = Hosts.create_host("pve-01") {:ok, _} = Hosts.mark_online(host, "0.1.0") payload = %{ "zfs_pools" => %{ "pools" => [%{"name" => "rpool", "health" => "DEGRADED", "capacity_percent" => 40}] } } {:ok, _} = Metrics.record_sample(host.id, "fast", DateTime.utc_now(), payload) {:ok, _view, html} = live(auth(conn), "/") assert html =~ ~r/data-status=\"critical\"/ end end describe "pubsub" do test "updates the card when a new metric arrives", %{conn: conn} do {:ok, {host, _}} = Hosts.create_host("pve-01") {:ok, _} = Hosts.mark_online(host, "0.1.0") {:ok, view, _html} = live(auth(conn), "/") assert render(view) =~ ~r/data-status=\"ok\"/ payload = %{ "zfs_pools" => %{ "pools" => [%{"name" => "rpool", "health" => "DEGRADED", "capacity_percent" => 40}] } } {:ok, _} = Metrics.record_sample(host.id, "fast", DateTime.utc_now(), payload) Process.sleep(50) assert render(view) =~ ~r/data-status=\"critical\"/ end end end