From 7418816c6d429d148313ed7a23731cfd4697deb4 Mon Sep 17 00:00:00 2001 From: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:37:03 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20Add=20tests=20for=20'primary=5Fi?= =?UTF-8?q?nterface=5Fip'=20in=20netinfo.py=20(#14)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🧪 Add tests for primary_interface_ip Added unit tests to fully cover `primary_interface_ip` in `netinfo.py`, handling IPv4, IPv6 and error conditions using mock sockets. Coverage for `primary_interface_ip` is now 100%. Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> * drop redundant pytest-cov dep addition --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- tests/test_netinfo.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/test_netinfo.py b/tests/test_netinfo.py index 53f0edd..7134cd9 100644 --- a/tests/test_netinfo.py +++ b/tests/test_netinfo.py @@ -111,7 +111,9 @@ def test_degradation_note_on_windows_mentions_the_api_rather_than_sysctl(): import pytest -from netsleuth.netinfo import iface_for_ip, is_tunnel_iface, mtu_anomaly +from unittest.mock import patch + +from netsleuth.netinfo import iface_for_ip, is_tunnel_iface, mtu_anomaly, primary_interface_ip def test_iface_for_ip_matches_the_owning_adapter(): @@ -155,6 +157,35 @@ def test_mtu_anomaly_flags_unusually_small_links_generically(): assert mtu_anomaly(1200) == "small" +@patch("socket.socket") +def test_primary_interface_ip_ipv4_success(mock_socket): + mock_sock_instance = mock_socket.return_value + mock_sock_instance.getsockname.return_value = ("192.168.1.100", 12345) + + assert primary_interface_ip(target="8.8.8.8", family=socket.AF_INET) == "192.168.1.100" + mock_socket.assert_called_once_with(socket.AF_INET, socket.SOCK_DGRAM) + mock_sock_instance.connect.assert_called_once_with(("8.8.8.8", 53)) + + +@patch("socket.socket") +def test_primary_interface_ip_ipv6_success(mock_socket): + mock_sock_instance = mock_socket.return_value + mock_sock_instance.getsockname.return_value = ("2001:db8::1", 12345, 0, 0) + + assert primary_interface_ip(family=socket.AF_INET6) == "2001:db8::1" + mock_socket.assert_called_once_with(socket.AF_INET6, socket.SOCK_DGRAM) + # The default probe target for IPv6 is "2606:4700:4700::1111" + mock_sock_instance.connect.assert_called_once_with(("2606:4700:4700::1111", 53)) + + +@patch("socket.socket") +def test_primary_interface_ip_oserror(mock_socket): + mock_sock_instance = mock_socket.return_value + mock_sock_instance.connect.side_effect = OSError("Network is unreachable") + + assert primary_interface_ip() is None + + import socket from netsleuth.netinfo import _parse_windows_default_gateway