velxio/backend/tests/test_wifi_status_parser.py

117 lines
4.0 KiB
Python

"""
Tests for WiFi/BLE serial output parser.
Feeds sample ESP-IDF log patterns and verifies correct status events.
"""
import unittest
from app.services.wifi_status_parser import (
parse_wifi_line,
parse_ble_line,
parse_serial_text,
)
class TestWifiLineParser(unittest.TestCase):
def test_wifi_sta_start(self):
line = 'I (432) wifi:wifi sta start'
result = parse_wifi_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'initializing')
def test_wifi_connected(self):
line = 'I (1234) wifi:connected with Velxio-GUEST, aid = 1, channel 6'
result = parse_wifi_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'connected')
self.assertEqual(result['ssid'], 'Velxio-GUEST')
def test_wifi_got_ip(self):
line = 'I (2345) esp_netif_handlers: sta ip: 192.168.4.2, mask: 255.255.255.0'
result = parse_wifi_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'got_ip')
self.assertEqual(result['ip'], '192.168.4.2')
def test_wifi_disconnect(self):
line = 'I (9999) wifi:state: run -> init (0)'
result = parse_wifi_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'disconnected')
def test_wifi_new_ssid(self):
line = 'I (500) wifi:new:Velxio-GUEST, old: , ASSOC'
result = parse_wifi_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'connected')
self.assertIn('Velxio-GUEST', result.get('ssid', ''))
def test_no_match(self):
line = 'I (100) main: Hello World!'
result = parse_wifi_line(line)
self.assertIsNone(result)
def test_empty_line(self):
result = parse_wifi_line('')
self.assertIsNone(result)
class TestBleLineParser(unittest.TestCase):
def test_ble_init(self):
line = 'I (300) BT_INIT: BT controller compile version [abcd1234]'
result = parse_ble_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'initialized')
def test_ble_advertising_gatts(self):
line = 'I (500) GATTS: advertising started'
result = parse_ble_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'advertising')
def test_ble_advertising_gap(self):
line = 'I (600) GAP_BLE: advertisement config done'
result = parse_ble_line(line)
self.assertIsNotNone(result)
self.assertEqual(result['status'], 'advertising')
def test_no_match(self):
result = parse_ble_line('I (100) main: just a message')
self.assertIsNone(result)
class TestParseSerialText(unittest.TestCase):
def test_mixed_output(self):
text = """I (432) wifi:wifi sta start
I (500) wifi:new:Velxio-GUEST, old:
I (800) wifi:connected with Velxio-GUEST, aid = 1
I (1200) esp_netif_handlers: sta ip: 192.168.4.2, mask: 255.255.255.0
I (300) BT_INIT: BT controller compile version [abc]
I (500) GATTS: advertising started
"""
wifi_events, ble_events = parse_serial_text(text)
self.assertGreaterEqual(len(wifi_events), 3)
self.assertEqual(wifi_events[0]['status'], 'initializing')
self.assertEqual(wifi_events[-1]['status'], 'got_ip')
self.assertEqual(wifi_events[-1]['ip'], '192.168.4.2')
self.assertGreaterEqual(len(ble_events), 2)
self.assertEqual(ble_events[0]['status'], 'initialized')
self.assertEqual(ble_events[1]['status'], 'advertising')
def test_empty_text(self):
wifi_events, ble_events = parse_serial_text('')
self.assertEqual(len(wifi_events), 0)
self.assertEqual(len(ble_events), 0)
def test_no_matches(self):
text = 'Hello World!\nJust some output\n'
wifi_events, ble_events = parse_serial_text(text)
self.assertEqual(len(wifi_events), 0)
self.assertEqual(len(ble_events), 0)
if __name__ == '__main__':
unittest.main()