fix: handle UpdateMessageSendSucceeded to prevent edit errors
Fixes "Message not found" error when editing immediately after sending. **Problem**: When sending a message, TDLib may return a temporary ID, then send UpdateMessageSendSucceeded with the real server ID. We weren't handling this update, so the cache kept the old ID while the server had a different one, causing "Message not found" errors during edits. **Solution**: 1. Added UpdateMessageSendSucceeded handler (client.rs:801-830) - Finds message with temporary ID - Replaces it with new message containing real server ID - Preserves reply_info if present 2. Added validation before editing (main_input.rs:574-589) - Checks message exists in cache - Better error messages with chat_id and message_id 3. Added positive ID check in start_editing_selected (mod.rs:240) - Blocks editing messages with temporary IDs (negative) **Test**: - Added test_edit_immediately_after_send (edit_message.rs:156-181) - Verifies editing works right after send_message - All 22 edit_message tests pass Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -150,3 +150,34 @@ async fn test_edit_history_tracking() {
|
||||
// История показывает 2 редактирования
|
||||
assert_eq!(client.get_edited_messages().len(), 2);
|
||||
}
|
||||
|
||||
/// Test: Редактирование сразу после отправки (симуляция UpdateMessageSendSucceeded)
|
||||
/// Проверяет что после send_message можно сразу edit_message с тем же ID
|
||||
#[tokio::test]
|
||||
async fn test_edit_immediately_after_send() {
|
||||
let client = FakeTdClient::new();
|
||||
|
||||
// Отправляем сообщение
|
||||
let sent_msg = client
|
||||
.send_message(ChatId::new(123), "Just sent".to_string(), None, None)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
// Сразу редактируем (не должно быть ошибки "Message not found")
|
||||
let result = client
|
||||
.edit_message(ChatId::new(123), sent_msg.id(), "Immediately edited".to_string())
|
||||
.await;
|
||||
|
||||
// Редактирование должно пройти успешно
|
||||
assert!(result.is_ok(), "Should be able to edit message immediately after sending");
|
||||
|
||||
// Проверяем что текст изменился
|
||||
let messages = client.get_messages(123);
|
||||
assert_eq!(messages.len(), 1);
|
||||
assert_eq!(messages[0].text(), "Immediately edited");
|
||||
|
||||
// История редактирований содержит это изменение
|
||||
assert_eq!(client.get_edited_messages().len(), 1);
|
||||
assert_eq!(client.get_edited_messages()[0].message_id, sent_msg.id());
|
||||
assert_eq!(client.get_edited_messages()[0].new_text, "Immediately edited");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user