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:
Mikhail Kilin
2026-02-01 01:47:12 +03:00
parent c5078a54f4
commit 9df8138a46
4 changed files with 86 additions and 2 deletions

View File

@@ -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");
}