88 lines
2.7 KiB
Python
88 lines
2.7 KiB
Python
import unittest
|
|
from dataclasses import dataclass
|
|
from typing import Self
|
|
|
|
|
|
@dataclass
|
|
class MockWifiNetwork:
|
|
bssid: str
|
|
frequency: str
|
|
signal_level: str
|
|
flags: str
|
|
ssid: str
|
|
|
|
@classmethod
|
|
def from_wpa(cls, results: str) -> list[Self]:
|
|
entries = []
|
|
|
|
for line in results.splitlines():
|
|
line = line.strip()
|
|
if not line:
|
|
continue
|
|
|
|
if '\t' in line:
|
|
parts = line.split('\t')
|
|
else:
|
|
parts = line.split(maxsplit=4)
|
|
|
|
if len(parts) < 5:
|
|
continue
|
|
|
|
wifi = cls(bssid=parts[0], frequency=parts[1], signal_level=parts[2], flags=parts[3], ssid=parts[4])
|
|
entries.append(wifi)
|
|
|
|
return entries
|
|
|
|
|
|
class TestWifiNetworkParser(unittest.TestCase):
|
|
def test_standard_tab_separated_no_spaces(self):
|
|
"""Test classic tab-separated output with an SSID containing no spaces."""
|
|
raw_data = '00:11:22:33:44:55\t2412\t-41\t[WPA2-PSK-CCMP][ESS]\tMyNetwork'
|
|
results = MockWifiNetwork.from_wpa(raw_data)
|
|
|
|
self.assertEqual(len(results), 1)
|
|
self.assertEqual(results[0].ssid, 'MyNetwork')
|
|
self.assertEqual(results[0].bssid, '00:11:22:33:44:55')
|
|
|
|
def test_tab_separated_with_spaces_in_ssid(self):
|
|
"""Test tab-separated output where the SSID contains spaces (the core bug)."""
|
|
raw_data = '00:11:22:33:44:55\t2412\t-41\t[WPA2-PSK-CCMP][ESS]\tMy Home Wi-Fi Network'
|
|
results = MockWifiNetwork.from_wpa(raw_data)
|
|
|
|
self.assertEqual(len(results), 1)
|
|
self.assertEqual(results[0].ssid, 'My Home Wi-Fi Network')
|
|
|
|
def test_fallback_space_separated_with_spaces_in_ssid(self):
|
|
"""Test space-separated fallback behavior when tabs are missing entirely."""
|
|
raw_data = '00:11:22:33:44:55 2412 -41 [WPA2-PSK-CCMP][ESS] My Home Wi-Fi Network'
|
|
results = MockWifiNetwork.from_wpa(raw_data)
|
|
|
|
self.assertEqual(len(results), 1)
|
|
self.assertEqual(results[0].ssid, 'My Home Wi-Fi Network')
|
|
|
|
def test_malformed_short_line_ignored(self):
|
|
"""Test that lines with fewer than 5 columns are skipped and do not throw IndexError."""
|
|
raw_data = '00:11:22:33:44:55\t2412\t-41'
|
|
results = MockWifiNetwork.from_wpa(raw_data)
|
|
|
|
self.assertEqual(len(results), 0)
|
|
|
|
def test_extra_columns_handled_gracefully(self):
|
|
"""Test that output with more than 5 columns (e.g. newer wpa_cli formats) doesn't crash."""
|
|
raw_data = '00:11:22:33:44:55\t2412\t-41\t[WPA2-PSK-CCMP][ESS]\tMyNetwork\textra_col_1\textra_col_2'
|
|
results = MockWifiNetwork.from_wpa(raw_data)
|
|
|
|
self.assertEqual(len(results), 1)
|
|
self.assertEqual(results[0].ssid, 'MyNetwork')
|
|
|
|
def test_empty_input_and_whitespace_lines(self):
|
|
"""Test that empty lines, headers, or purely whitespace rows are skipped cleanly."""
|
|
raw_data = '\n \n\n00:11:22:33:44:55\t2412\t-41\t[WPA2-PSK-CCMP][ESS]\tMyNetwork\n\n'
|
|
results = MockWifiNetwork.from_wpa(raw_data)
|
|
|
|
self.assertEqual(len(results), 1)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|