from datetime import datetime from router_status import parse_timestamp, parse_events, build_status class TestParseTimestamp: def test_iso_format(self): result = parse_timestamp("2024-01-15T10:30:00") assert result == datetime(2024, 1, 15, 10, 30, 0) def test_strptime_format(self): result = parse_timestamp("2024-01-15 10:30:00") assert result == datetime(2024, 1, 15, 10, 30, 0) def test_invalid_returns_none(self): assert parse_timestamp("not a date") is None assert parse_timestamp("") is None assert parse_timestamp(None) is None class TestParseEvents: def test_extracts_connected_device(self): rows = [ { "log_timestamp": "2024-01-15T10:30:00", "message": " has successfully connected to WiFi", } ] events = list(parse_events(rows)) assert len(events) == 1 assert events[0]["name"] == "MyPhone" assert events[0]["mac"] == "AA:BB:CC:DD:EE:FF" assert events[0]["event"] == "connected" def test_extracts_disconnected_device(self): rows = [ { "log_timestamp": "2024-01-15T10:30:00", "message": " was disconnected from WiFi", } ] events = list(parse_events(rows)) assert len(events) == 1 assert events[0]["event"] == "disconnected" def test_skips_missing_timestamp(self): rows = [{"message": " has successfully connected"}] events = list(parse_events(rows)) assert len(events) == 0 def test_allows_missing_timestamp_when_flagged(self): rows = [{"message": " has successfully connected"}] events = list(parse_events(rows, allow_missing_timestamp=True)) assert len(events) == 1 class TestBuildStatus: def test_tracks_connection(self): events = [ {"name": "Phone", "mac": "AA:BB:CC:DD:EE:FF", "event": "connected", "time": datetime(2024, 1, 15, 10, 0)}, ] status = build_status(events) assert "AA:BB:CC:DD:EE:FF" in status assert status["AA:BB:CC:DD:EE:FF"].is_connected is True def test_tracks_disconnection(self): events = [ {"name": "Phone", "mac": "AA:BB:CC:DD:EE:FF", "event": "connected", "time": datetime(2024, 1, 15, 10, 0)}, {"name": "Phone", "mac": "AA:BB:CC:DD:EE:FF", "event": "disconnected", "time": datetime(2024, 1, 15, 11, 0)}, ] status = build_status(events) assert status["AA:BB:CC:DD:EE:FF"].is_connected is False assert status["AA:BB:CC:DD:EE:FF"].last_connected_time == datetime(2024, 1, 15, 10, 0)