defmodule AprsmeWeb.WeatherLive.CallsignViewTest do use AprsmeWeb.ConnCase import Phoenix.LiveViewTest alias AprsmeWeb.WeatherLive.CallsignView describe "mount via HTTP" do test "renders the weather view for a callsign", %{conn: conn} do {:ok, _lv, html} = live(conn, ~p"/weather/N0CALL", on_error: :warn) assert html =~ "N0CALL" end test "normalizes lowercase callsign to uppercase", %{conn: conn} do {:ok, _lv, html} = live(conn, ~p"/weather/k1abc", on_error: :warn) assert html =~ "K1ABC" end end describe "has_weather_field?/2" do test "returns false for missing fields" do refute CallsignView.has_weather_field?(%{}, :temperature) end test "returns false for nil values" do refute CallsignView.has_weather_field?(%{temperature: nil}, :temperature) end test "returns true for numeric values" do assert CallsignView.has_weather_field?(%{temperature: 72.5}, :temperature) end test "returns true for non-empty string values" do assert CallsignView.has_weather_field?(%{temperature: "72.5"}, :temperature) end test "returns false for empty string" do refute CallsignView.has_weather_field?(%{temperature: ""}, :temperature) end end describe "get_weather_field_zero/2" do test "replaces N/A with 0" do assert CallsignView.get_weather_field_zero(%{}, :temperature) == "0" end test "passes numeric values through" do assert CallsignView.get_weather_field_zero(%{temperature: 72.5}, :temperature) == 72.5 end end describe "format_weather_value/3" do test "returns nil for missing values" do assert CallsignView.format_weather_value(%{}, :temperature, "en") == nil end test "formats numeric temperature with units" do result = CallsignView.format_weather_value(%{temperature: 72.5}, :temperature, "en") assert is_binary(result) assert result =~ "72" end test "formats numeric wind_speed with a space separator" do result = CallsignView.format_weather_value(%{wind_speed: 10.0}, :wind_speed, "en") assert is_binary(result) # Unit appears after the numeric value with a separator. assert String.contains?(result, " ") end test "handles string numeric values" do result = CallsignView.format_weather_value(%{temperature: "72.5"}, :temperature, "en") assert is_binary(result) end test "handles string non-numeric values for untracked keys" do # humidity has no entry in @weather_formatters, so binary values are # returned as-is. assert CallsignView.format_weather_value(%{humidity: "65"}, :humidity, "en") == "65" end end end