import json import tempfile import unittest from pathlib import Path from unittest.mock import patch from librenet_scanner.online_vendor import ( PROVIDER_MACLOOKUP, PROVIDER_MACVENDORS, is_locally_administered, lookup_online_vendor, normalize_mac, ) from librenet_scanner.storage import HistoryStore from librenet_scanner.parsers import parse_arp_scan ROOT = Path(__file__).resolve().parents[1] class OnlineVendor047Tests(unittest.TestCase): def test_arp_scan_locally_administered_is_not_mistaken_for_vendor(self): hosts = parse_arp_scan("192.168.10.250\ta6:2b:b0:a5:49:a7\t(Unknown: locally administered) (DUP: 2)") self.assertEqual(len(hosts), 1) self.assertEqual(hosts[0].vendor, "") def test_mac_normalization_and_laa_detection(self): self.assertEqual(normalize_mac("a6:2b:b0:a5:49:a7"), "A6:2B:B0:A5:49:A7") self.assertTrue(is_locally_administered("a6:2b:b0:a5:49:a7")) self.assertFalse(is_locally_administered("00:11:22:33:44:55")) def test_maclookup_response_supports_modern_assignment_metadata(self): payload = { "success": True, "found": True, "company": "TP-Link Corporation Limited", "blockType": "MA-M", "isRand": False, "isPrivate": False, } with patch("librenet_scanner.online_vendor._request", return_value=json.dumps(payload).encode()): result = lookup_online_vendor("00:11:22:33:44:55", PROVIDER_MACLOOKUP) self.assertTrue(result.found) self.assertEqual(result.vendor, "TP-Link Corporation Limited") self.assertEqual(result.block_type, "MA-M") def test_macvendors_plain_text_response(self): with patch("librenet_scanner.online_vendor._request", return_value=b"TP-Link Technologies Co., Ltd.\n"): result = lookup_online_vendor("00:11:22:33:44:55", PROVIDER_MACVENDORS) self.assertEqual(result.vendor, "TP-Link Technologies Co., Ltd.") self.assertTrue(result.found) def test_online_cache_roundtrip(self): with tempfile.TemporaryDirectory() as tmp: store = HistoryStore(Path(tmp) / "history.sqlite3") store.save_online_vendor_cache( "00:11:22:33:44:55", PROVIDER_MACLOOKUP, vendor="Example Vendor", found=True, block_type="MA-L", ) cached = store.online_vendor_cache("00-11-22-33-44-55", PROVIDER_MACLOOKUP) self.assertIsNotNone(cached) self.assertEqual(cached["vendor"], "Example Vendor") self.assertTrue(cached["from_cache"]) def test_ui_exposes_opt_in_privacy_setting_and_manual_lookup(self): ui = (ROOT / "src/librenet_scanner/ui.py").read_text() self.assertIn('privacy/onlineMacLookupEnabled', ui) self.assertIn('Interroger automatiquement une base en ligne', ui) self.assertIn('L\'option est désactivée par défaut', ui) self.assertIn('Rechercher en ligne', ui) self.assertIn('_start_automatic_online_vendor_lookup()', ui) if __name__ == "__main__": unittest.main()