from nexus.evennia_ws_bridge import clean_lines, normalize_event, parse_room_output, strip_ansi def test_strip_ansi_removes_escape_codes(): assert strip_ansi('\x1b[1mGate\x1b[0m') == 'Gate' def test_parse_room_output_extracts_room_exits_and_objects(): parsed = parse_room_output('\x1b[1mChapel\x1b[0m\nQuiet room.\nExits: courtyard\nYou see: a Book of the Soul and a Prayer Wall') assert parsed['title'] == 'Chapel' assert parsed['exits'][0]['key'] == 'courtyard' keys = [obj['key'] for obj in parsed['objects']] assert 'Book of the Soul' in keys assert 'Prayer Wall' in keys def test_normalize_connect_emits_session_and_room_events(): events = normalize_event({'event': 'connect', 'actor': 'Timmy', 'output': 'Gate\nA threshold.\nExits: enter'}, 'sess1') types = [event['type'] for event in events] assert 'evennia.session_bound' in types assert 'evennia.actor_located' in types assert 'evennia.room_snapshot' in types def test_normalize_command_emits_command_and_snapshot(): events = normalize_event({'event': 'command', 'actor': 'timmy', 'command': 'courtyard', 'output': 'Courtyard\nOpen court.\nExits: gate, workshop\nYou see: a Map Table'}, 'sess2') types = [event['type'] for event in events] assert types[0] == 'evennia.command_issued' assert 'evennia.command_result' in types assert 'evennia.room_snapshot' in types def test_normalize_failed_command_marks_failure(): events = normalize_event({'event': 'command', 'actor': 'timmy', 'command': 'workshop', 'output': "Command 'workshop' is not available."}, 'sess3') result = [event for event in events if event['type'] == 'evennia.command_result'][0] assert result['success'] is False