Running pytest... ============================= test session starts ============================== platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0 -- /nix/store/fd6xbzjdbr4f26jh3yd8yssbph48f5ni-python3-3.14.7-env/bin/python cachedir: .pytest_cache rootdir: /build/src collected 61 items tests/test_format.py::TestCenterText::test_centers_single_line PASSED [ 1%] tests/test_format.py::TestCenterText::test_centers_multiple_lines PASSED [ 3%] tests/test_format.py::TestCenterText::test_handles_empty_string PASSED [ 4%] tests/test_format.py::TestCenterText::test_handles_line_wider_than_width PASSED [ 6%] tests/test_format.py::TestCenterText::test_uses_longest_line_for_padding PASSED [ 8%] tests/test_format.py::TestGetTerminalWidth::test_returns_default_on_failure PASSED [ 9%] tests/test_format.py::TestGetTerminalWidth::test_returns_actual_columns PASSED [ 11%] tests/test_hostname.py::TestGetHostname::test_returns_nixos_when_file_not_found PASSED [ 13%] tests/test_hostname.py::TestGetHostname::test_returns_nixos_on_permission_error PASSED [ 14%] tests/test_hostname.py::TestGetHostname::test_returns_nixos_when_path_is_directory PASSED [ 16%] tests/test_hostname.py::TestGetHostname::test_returns_nixos_on_binary_content PASSED [ 18%] tests/test_hostname.py::TestGetHostname::test_returns_hostname_from_file PASSED [ 19%] tests/test_hostname.py::TestGetHostname::test_strips_whitespace PASSED [ 21%] tests/test_ip_addresses.py::TestGetIpAddresses::test_filters_loopback PASSED [ 22%] tests/test_ip_addresses.py::TestGetIpAddresses::test_filters_down_interfaces PASSED [ 24%] tests/test_ip_addresses.py::TestGetIpAddresses::test_filters_link_local_ipv6 PASSED [ 26%] tests/test_ip_addresses.py::TestGetIpAddresses::test_interface_name_containing_up_substring_not_treated_as_up PASSED [ 27%] tests/test_ip_addresses.py::TestGetIpAddresses::test_handles_empty_output PASSED [ 29%] tests/test_ip_addresses.py::TestGetIpAddresses::test_handles_multiple_up_interfaces PASSED [ 31%] tests/test_ip_addresses.py::TestGetIpAddresses::test_returns_error_row_when_ip_command_missing PASSED [ 32%] tests/test_ip_addresses.py::TestGetIpAddresses::test_strips_ansi_color_codes_for_state_parsing PASSED [ 34%] tests/test_ip_addresses.py::TestGetIpAddresses::test_name_with_parent_link_suffix_is_kept PASSED [ 36%] tests/test_ip_addresses.py::TestGetIpAddresses::test_multiple_addresses_mixed_families PASSED [ 37%] tests/test_ip_addresses.py::TestGetIpAddresses::test_non_up_states_filtered PASSED [ 39%] tests/test_print_status.py::TestPrintStatus::test_output_contains_all_sections PASSED [ 40%] tests/test_print_status.py::TestPrintStatus::test_hides_vpn_section_when_empty PASSED [ 42%] tests/test_print_status.py::TestPrintStatus::test_shows_tor_without_vpn PASSED [ 44%] tests/test_print_status.py::TestPrintStatus::test_all_optional_sections_empty PASSED [ 45%] tests/test_print_status.py::TestPrintStatus::test_footer_present PASSED [ 47%] tests/test_tor.py::TestReadOnionAddress::test_reads_valid_onion_address PASSED [ 49%] tests/test_tor.py::TestReadOnionAddress::test_returns_none_for_non_onion PASSED [ 50%] tests/test_tor.py::TestReadOnionAddress::test_returns_none_for_missing_file PASSED [ 52%] tests/test_tor.py::TestReadOnionAddress::test_does_not_match_onion_substring_in_middle PASSED [ 54%] tests/test_tor.py::TestGetTorAddressesExplicit::test_reads_explicit_paths PASSED [ 55%] tests/test_tor.py::TestGetTorAddressesExplicit::test_deduplicates_addresses PASSED [ 57%] tests/test_tor.py::TestGetTorAddressesExplicit::test_explicit_paths_skip_auto_detect PASSED [ 59%] tests/test_tor.py::TestGetTorAddressesAutoDetect::test_reads_hostname_directly_in_base_dir PASSED [ 60%] tests/test_tor.py::TestGetTorAddressesAutoDetect::test_reads_hostname_from_subdirectory PASSED [ 62%] tests/test_tor.py::TestGetTorAddressesAutoDetect::test_combines_direct_and_subdirectory_hostnames PASSED [ 63%] tests/test_tor.py::TestGetTorAddressesAutoDetect::test_auto_detected_sorted PASSED [ 65%] tests/test_tor.py::TestGetTorAddressesAutoDetect::test_missing_base_dir_is_skipped PASSED [ 67%] tests/test_vpn.py::TestDetectVpnInterfaces::test_detects_wireguard_interfaces PASSED [ 68%] tests/test_vpn.py::TestDetectVpnInterfaces::test_detects_wireguard_with_carrier_suffix PASSED [ 70%] tests/test_vpn.py::TestDetectVpnInterfaces::test_detects_zerotier_interfaces PASSED [ 72%] tests/test_vpn.py::TestDetectVpnInterfaces::test_detects_yggdrasil_interfaces PASSED [ 73%] tests/test_vpn.py::TestDetectVpnInterfaces::test_detects_tailscale_interfaces PASSED [ 75%] tests/test_vpn.py::TestDetectVpnInterfaces::test_detects_mycelium_interfaces PASSED [ 77%] tests/test_vpn.py::TestDetectVpnInterfaces::test_dedup_when_wireguard_matches_name_pattern PASSED [ 78%] tests/test_vpn.py::TestDetectVpnInterfaces::test_ip_command_missing_falls_back_to_sysfs PASSED [ 80%] tests/test_vpn.py::TestDetectVpnInterfaces::test_detects_multiple_wireguard_interfaces PASSED [ 81%] tests/test_vpn.py::TestDetectVpnInterfaces::test_ignores_link_ether_continuation PASSED [ 83%] tests/test_vpn.py::TestGetVpnAddresses::test_returns_addresses_for_up_interface PASSED [ 85%] tests/test_vpn.py::TestGetVpnAddresses::test_handles_unknown_state PASSED [ 86%] tests/test_vpn.py::TestGetVpnAddresses::test_shows_offline_for_down_interface PASSED [ 88%] tests/test_vpn.py::TestGetVpnAddresses::test_shows_offline_for_empty_output PASSED [ 90%] tests/test_vpn.py::TestGetVpnAddresses::test_shows_no_addresses_when_only_link_local PASSED [ 91%] tests/test_vpn.py::TestGetVpnAddresses::test_mixed_fe80_and_routable_keeps_routable PASSED [ 93%] tests/test_vpn.py::TestGetVpnAddresses::test_multiple_interfaces_returned_in_order PASSED [ 95%] tests/test_vpn.py::TestGetVpnAddresses::test_ip_command_missing_reports_per_interface PASSED [ 96%] tests/test_vpn.py::TestGetVpnAddresses::test_name_with_none_parent_suffix_accepted PASSED [ 98%] tests/test_vpn.py::TestGetVpnAddresses::test_mixed_v4_and_v6_routable_with_link_local PASSED [100%] ============================== 61 passed in 1.00s ============================== Running mypy... Success: no issues found in 1 source file