defmodule MicrowavepropWeb.MonitorLive.ShowTest do use MicrowavepropWeb.ConnCase, async: false import Microwaveprop.AccountsFixtures import Phoenix.LiveViewTest alias Microwaveprop.BeaconMonitors defp owner_and_monitor do owner = user_fixture() {:ok, monitor} = BeaconMonitors.create_monitor(owner, %{"name" => "Test Monitor"}) {owner, monitor} end describe "mount" do test "owner can view their own monitor", %{conn: conn} do {owner, monitor} = owner_and_monitor() conn = log_in_user(conn, owner) {:ok, _lv, html} = live(conn, ~p"/beacon-monitors/#{monitor.id}") assert html =~ monitor.name assert html =~ "Your beacon monitor" end test "non-owner is redirected to /users/settings with error flash", %{conn: conn} do {_owner, monitor} = owner_and_monitor() stranger = user_fixture() conn = log_in_user(conn, stranger) assert {:error, {:live_redirect, %{to: "/users/settings"}}} = live(conn, ~p"/beacon-monitors/#{monitor.id}") end end describe "config form" do test "successful update shows info flash", %{conn: conn} do {owner, monitor} = owner_and_monitor() conn = log_in_user(conn, owner) {:ok, lv, _html} = live(conn, ~p"/beacon-monitors/#{monitor.id}") html = lv |> form("#config-form", beacon_monitor: %{ name: "Updated Monitor", config_frequency_hz: 144_400_000, config_integration_s: 60, config_mode: "wspr" } ) |> render_submit() assert html =~ "Configuration updated." end test "invalid config re-renders form with validation error", %{conn: conn} do {owner, monitor} = owner_and_monitor() conn = log_in_user(conn, owner) {:ok, lv, _html} = live(conn, ~p"/beacon-monitors/#{monitor.id}") # config_integration_s must be >= 5; submitting 2 triggers a validation error. html = lv |> form("#config-form", beacon_monitor: %{config_integration_s: 2}) |> render_submit() refute html =~ "Configuration updated." # The form should still be visible (not a server error). assert html =~ "config-form" end end end