import os import sys import unittest sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'payload', 'user', 'remote_access', 'pager-webui')) import server def setUpModule(): __import__('importlib').reload(server) _orig_hak5 = server.hak5 _orig_assoc_clients = server.assoc_clients class NormalizeTest(unittest.TestCase): def test_normalize(self): self.assertEqual(server.normalize_mac(' 00:11:22:33:44:55 '), '00:11:22:33:44:55') self.assertEqual(server.normalize_mac('aa:bb:cc:dd:ee:ff'), 'AA:BB:CC:DD:EE:FF') def test_invalid_returns_none(self): self.assertIsNone(server.normalize_mac('nope')) class ClientsTest(unittest.TestCase): def tearDown(self): server.hak5 = _orig_hak5 server.assoc_clients = _orig_assoc_clients def test_clients_handler(self): server.assoc_clients = lambda: [{'mac': 'AA:BB:CC:DD:EE:FF', 'iface': 'wlan0open', 'rssi': -55}] class Ctx: args = () status, payload = server.h_clients(Ctx()) self.assertEqual(status, 200) self.assertEqual(payload['count'], 1) def test_kick_validates_and_deny_adds(self): calls = [] def fake(*args): calls.append(args) return 'ok' server.hak5 = fake server.h_client_kick(type('C', (), {'args': (), 'body': {'mac': '00:11:22:33:44:55'}})()) self.assertIn(('PINEAPPLE_DEVICE_FILTER_ADD', 'deny', '00:11:22:33:44:55'), calls) self.assertTrue(any(c[0] == 'PINEAPPLE_DEAUTH_CLIENT' for c in calls)) def test_kick_bad_mac_400(self): status, payload = server.h_client_kick(type('C', (), {'args': (), 'body': {'mac': 'x'}})()) self.assertEqual(status, 400) def test_deauth_client(self): calls = [] def fake(*args): calls.append(args) return 'ok' server.hak5 = fake server.h_deauth_client(type('C', (), {'args': (), 'body': {'mac': '00:11:22:33:44:55'}})()) self.assertEqual(calls[0][0], 'PINEAPPLE_DEAUTH_CLIENT') if __name__ == '__main__': unittest.main()