#!/usr/bin/env python3 """Test the error handler to ensure it correctly detects error messages.""" import sys import os import re # Add the bot directory to the path so we can import modules sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # Directly implement the error detection function to avoid module dependencies def is_error_response(response_text: str) -> bool: """ Detect if a response text is an error message. Args: response_text: The response text to check Returns: bool: True if the response appears to be an error message """ if not response_text or not isinstance(response_text, str): return False response_lower = response_text.lower().strip() # Common error patterns error_patterns = [ r'^error:?\s*\d{3}', # "Error: 502" or "Error 502" r'^error:?\s+', # "Error: " or "Error " r'^\d{3}\s+error', # "502 Error" r'^sorry,?\s+(there\s+was\s+)?an?\s+error', # "Sorry, an error" or "Sorry, there was an error" r'^sorry,?\s+the\s+response\s+took\s+too\s+long', # Timeout error r'connection\s+(refused|failed|error|timeout)', r'timed?\s*out', r'failed\s+to\s+(connect|respond|process)', r'service\s+unavailable', r'internal\s+server\s+error', r'bad\s+gateway', r'gateway\s+timeout', ] # Check if response matches any error pattern for pattern in error_patterns: if re.search(pattern, response_lower): return True # Check for HTTP status codes indicating errors if re.match(r'^\d{3}$', response_text.strip()): status_code = int(response_text.strip()) if status_code >= 400: # HTTP error codes return True return False # Test cases test_cases = [ # Error responses (should return True) ("Error 502", True), ("Error: 502", True), ("Error: Bad Gateway", True), ("502 Error", True), ("Sorry, there was an error", True), ("Sorry, an error occurred", True), ("Sorry, the response took too long. Please try again.", True), ("Connection refused", True), ("Connection timeout", True), ("Timed out", True), ("Failed to connect", True), ("Service unavailable", True), ("Internal server error", True), ("Bad gateway", True), ("Gateway timeout", True), ("500", True), ("502", True), ("503", True), # Normal responses (should return False) ("Hi! How are you doing today?", False), ("I'm Hatsune Miku! *waves*", False), ("That's so cool! Tell me more!", False), ("Sorry to hear that!", False), ("I'm sorry, but I can't help with that.", False), ("200", False), ("304", False), ("The error in your code is...", False), ] def run_tests(): print("Testing error detection...") print("=" * 60) passed = 0 failed = 0 for text, expected in test_cases: result = is_error_response(text) status = "āœ“" if result == expected else "āœ—" if result == expected: passed += 1 else: failed += 1 print(f"{status} FAILED: '{text}' -> {result} (expected {expected})") print("=" * 60) print(f"Tests passed: {passed}/{len(test_cases)}") print(f"Tests failed: {failed}/{len(test_cases)}") if failed == 0: print("\nāœ“ All tests passed!") else: print(f"\nāœ— {failed} test(s) failed") return failed == 0 if __name__ == "__main__": success = run_tests() exit(0 if success else 1)