fix(telegram): add message splitting, timeout, and validation fixes (#246)
High-priority fixes: - Message length validation and splitting (4096 char limit) - Empty chat_id validation to prevent silent failures - Health check timeout (5s) to prevent service hangs Testing infrastructure: - Comprehensive test suite (20+ automated tests) - Quick smoke test script - Test message generator - Complete testing documentation All changes are backward compatible. Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
50f508766f
commit
4fd1408034
6 changed files with 1325 additions and 48 deletions
99
test_helpers/generate_test_messages.py
Executable file
99
test_helpers/generate_test_messages.py
Executable file
|
|
@ -0,0 +1,99 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test message generator for Telegram integration testing.
|
||||
Generates messages of various lengths for testing message splitting.
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
||||
def generate_short_message():
|
||||
"""Generate a short message (< 100 chars)"""
|
||||
return "Hello! This is a short test message."
|
||||
|
||||
def generate_medium_message():
|
||||
"""Generate a medium message (~ 1000 chars)"""
|
||||
return "This is a medium-length test message. " * 25
|
||||
|
||||
def generate_long_message():
|
||||
"""Generate a long message (~ 5000 chars, > 4096 limit)"""
|
||||
return "This is a very long test message that will be split into multiple chunks. " * 70
|
||||
|
||||
def generate_exact_limit_message():
|
||||
"""Generate a message exactly at 4096 char limit"""
|
||||
base = "x" * 4096
|
||||
return base
|
||||
|
||||
def generate_over_limit_message():
|
||||
"""Generate a message just over the 4096 char limit"""
|
||||
return "x" * 4200
|
||||
|
||||
def generate_multi_chunk_message():
|
||||
"""Generate a message that requires 3+ chunks"""
|
||||
return "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " * 250
|
||||
|
||||
def generate_newline_message():
|
||||
"""Generate a message with many newlines (tests newline splitting)"""
|
||||
return "Line of text\n" * 400
|
||||
|
||||
def generate_word_boundary_message():
|
||||
"""Generate a message with clear word boundaries"""
|
||||
return "word " * 1000
|
||||
|
||||
def print_message_info(message, name):
|
||||
"""Print information about a message"""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"{name}")
|
||||
print(f"{'='*60}")
|
||||
print(f"Length: {len(message)} characters")
|
||||
print(f"Will split: {'Yes' if len(message) > 4096 else 'No'}")
|
||||
if len(message) > 4096:
|
||||
chunks = (len(message) + 4095) // 4096
|
||||
print(f"Estimated chunks: {chunks}")
|
||||
print(f"{'='*60}")
|
||||
print(message[:200] + "..." if len(message) > 200 else message)
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
def main():
|
||||
if len(sys.argv) > 1:
|
||||
test_type = sys.argv[1].lower()
|
||||
else:
|
||||
print("Usage: python3 generate_test_messages.py [type]")
|
||||
print("\nAvailable types:")
|
||||
print(" short - Short message (< 100 chars)")
|
||||
print(" medium - Medium message (~1000 chars)")
|
||||
print(" long - Long message (~5000 chars, requires splitting)")
|
||||
print(" exact - Exactly 4096 chars")
|
||||
print(" over - Just over 4096 chars")
|
||||
print(" multi - Very long (3+ chunks)")
|
||||
print(" newline - Many newlines (tests line splitting)")
|
||||
print(" word - Clear word boundaries")
|
||||
print(" all - Show info for all types")
|
||||
print("\nExample:")
|
||||
print(" python3 generate_test_messages.py long")
|
||||
sys.exit(1)
|
||||
|
||||
messages = {
|
||||
'short': ('Short Message', generate_short_message()),
|
||||
'medium': ('Medium Message', generate_medium_message()),
|
||||
'long': ('Long Message', generate_long_message()),
|
||||
'exact': ('Exact Limit (4096)', generate_exact_limit_message()),
|
||||
'over': ('Just Over Limit', generate_over_limit_message()),
|
||||
'multi': ('Multi-Chunk Message', generate_multi_chunk_message()),
|
||||
'newline': ('Newline Test', generate_newline_message()),
|
||||
'word': ('Word Boundary Test', generate_word_boundary_message()),
|
||||
}
|
||||
|
||||
if test_type == 'all':
|
||||
for name, msg in messages.values():
|
||||
print_message_info(msg, name)
|
||||
elif test_type in messages:
|
||||
name, msg = messages[test_type]
|
||||
# Just print the message for piping to Telegram
|
||||
print(msg)
|
||||
else:
|
||||
print(f"Error: Unknown type '{test_type}'")
|
||||
print("Run without arguments to see available types.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Loading…
Add table
Add a link
Reference in a new issue