Refactor handle_event SNMP test to reduce complexity

Extracted SNMP configuration extraction and connection testing
into separate helper functions, reducing cyclomatic complexity
from 11 to ~5.

- extract_snmp_config/1: Consolidates form data and params
- normalize_port/1: Handles port type conversion
- test_snmp_connection/1: Performs test and formats result

This makes the handle_event callback simpler and each concern
easier to test independently.
This commit is contained in:
Graham McIntire 2026-01-06 13:11:07 -06:00
parent b328dfb96e
commit fb4da2df6d
No known key found for this signature in database

View file

@ -107,29 +107,8 @@ defmodule ToweropsWeb.EquipmentLive.Form do
@impl true
def handle_event("test_snmp", _params, socket) do
form_data = socket.assigns.form.data
params = socket.assigns.form.params
ip_address = params["ip_address"] || form_data.ip_address
snmp_community = params["snmp_community"] || form_data.snmp_community
snmp_version = params["snmp_version"] || form_data.snmp_version
snmp_port = params["snmp_port"] || form_data.snmp_port || 161
snmp_port =
case snmp_port do
port when is_integer(port) -> port
port when is_binary(port) -> String.to_integer(port)
_ -> 161
end
result =
case Snmp.test_connection(ip_address, snmp_community, snmp_version, snmp_port) do
{:ok, message} ->
%{success: true, message: message}
{:error, reason} ->
%{success: false, message: "Connection failed: #{inspect(reason)}"}
end
snmp_config = extract_snmp_config(socket.assigns.form)
result = test_snmp_connection(snmp_config)
{:noreply, assign(socket, :snmp_test_result, result)}
end
@ -200,4 +179,35 @@ defmodule ToweropsWeb.EquipmentLive.Form do
{:noreply, assign(socket, :form, to_form(changeset))}
end
end
defp extract_snmp_config(form) do
form_data = form.data
params = form.params
%{
ip_address: params["ip_address"] || form_data.ip_address,
snmp_community: params["snmp_community"] || form_data.snmp_community,
snmp_version: params["snmp_version"] || form_data.snmp_version,
snmp_port: normalize_port(params["snmp_port"] || form_data.snmp_port || 161)
}
end
defp normalize_port(port) when is_integer(port), do: port
defp normalize_port(port) when is_binary(port), do: String.to_integer(port)
defp normalize_port(_), do: 161
defp test_snmp_connection(config) do
case Snmp.test_connection(
config.ip_address,
config.snmp_community,
config.snmp_version,
config.snmp_port
) do
{:ok, message} ->
%{success: true, message: message}
{:error, reason} ->
%{success: false, message: "Connection failed: #{inspect(reason)}"}
end
end
end