Some checks failed
CI / Check (pull_request) Has been cancelled
CI / Format (pull_request) Has been cancelled
CI / Clippy (pull_request) Has been cancelled
CI / Build (macos-latest) (pull_request) Has been cancelled
CI / Build (ubuntu-latest) (pull_request) Has been cancelled
CI / Build (windows-latest) (pull_request) Has been cancelled
Comprehensive cleanup of unused methods, dead code, and compiler warnings:
## Removed Methods (15):
- Duplicate delegation methods: is_authenticated, get_typing_text, get_user_name from TdClient
- Obsolete methods: TdClient::init() (duplicated in main.rs)
- Unused getters: UserCache::{get_username, get_name, get_user_id_by_chat}
- Unused builder methods: MessageBuilder::{edited, add_reaction}
- Unused utility: ChatState::is_normal()
- Dead code: HotkeysConfig::{matches, key_matches} (kept for tests)
- Unused method: UserCache::register_private_chat()
- Getter replaced with direct field access: MessageInfo::edit_date()
## Removed Module:
- error.rs - Unused error handling module (TeletuiError, ErrorVariant, IntoTeletuiError)
## Removed Constants (8):
- EMOJI_PICKER_COLUMNS, EMOJI_PICKER_ROWS, MAX_INPUT_HEIGHT
- MIN_TERMINAL_WIDTH, MIN_TERMINAL_HEIGHT
- TDLIB_CHAT_LIMIT, MAX_USERNAME_DISPLAY_LENGTH, MESSAGE_TEXT_INDENT
## Fixed Warnings:
- Removed unused imports (8 instances)
- Fixed unreachable patterns (10 instances)
- Fixed irrefutable if let patterns (2 instances)
- Fixed unused variables (1 instance)
- Removed dead_code annotations where appropriate
## Improvements:
- Integrated Config::load_credentials() into TdClient::new() for better credential management
- Replaced edit_date() getter with direct field access (message.metadata.edit_date)
- Updated tests to use direct field access instead of removed getters
## Test Results:
All tests passing: 499 passed, 0 failed
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
184 lines
8.0 KiB
Rust
184 lines
8.0 KiB
Rust
// Integration tests for edit message flow
|
||
|
||
mod helpers;
|
||
|
||
use helpers::fake_tdclient::FakeTdClient;
|
||
use helpers::test_data::TestMessageBuilder;
|
||
use tele_tui::types::{ChatId, MessageId};
|
||
|
||
/// Test: Редактирование сообщения изменяет текст
|
||
#[tokio::test]
|
||
async fn test_edit_message_changes_text() {
|
||
let client = FakeTdClient::new();
|
||
|
||
// Отправляем сообщение
|
||
let msg = client.send_message(ChatId::new(123), "Original text".to_string(), None, None).await.unwrap();
|
||
|
||
// Редактируем сообщение
|
||
client.edit_message(ChatId::new(123), msg.id(), "Edited text".to_string()).await.unwrap();
|
||
|
||
// Проверяем что редактирование записалось
|
||
assert_eq!(client.get_edited_messages().len(), 1);
|
||
assert_eq!(client.get_edited_messages()[0].message_id, msg.id());
|
||
assert_eq!(client.get_edited_messages()[0].new_text, "Edited text");
|
||
|
||
// Проверяем что текст сообщения изменился
|
||
let messages = client.get_messages(123);
|
||
assert_eq!(messages.len(), 1);
|
||
assert_eq!(messages[0].text(), "Edited text");
|
||
}
|
||
|
||
/// Test: Редактирование устанавливает edit_date
|
||
#[tokio::test]
|
||
async fn test_edit_message_sets_edit_date() {
|
||
let client = FakeTdClient::new();
|
||
|
||
// Отправляем сообщение
|
||
let msg = client.send_message(ChatId::new(123), "Original".to_string(), None, None).await.unwrap();
|
||
|
||
// Получаем дату до редактирования
|
||
let messages_before = client.get_messages(123);
|
||
let date_before = messages_before[0].date();
|
||
assert_eq!(messages_before[0].metadata.edit_date, 0); // Не редактировалось
|
||
|
||
// Редактируем сообщение
|
||
client.edit_message(ChatId::new(123), msg.id(), "Edited".to_string()).await.unwrap();
|
||
|
||
// Проверяем что edit_date установлена
|
||
let messages_after = client.get_messages(123);
|
||
assert!(messages_after[0].metadata.edit_date > 0);
|
||
assert!(messages_after[0].metadata.edit_date > date_before); // edit_date после date
|
||
}
|
||
|
||
/// Test: Редактирование только своих сообщений (проверка через can_be_edited)
|
||
#[tokio::test]
|
||
async fn test_can_only_edit_own_messages() {
|
||
let client = FakeTdClient::new();
|
||
|
||
// Наше исходящее сообщение (можно редактировать)
|
||
let outgoing_msg = TestMessageBuilder::new("My message", 1).outgoing().build();
|
||
|
||
let client = client.with_message(123, outgoing_msg);
|
||
|
||
// Входящее сообщение от собеседника (нельзя редактировать)
|
||
let incoming_msg = TestMessageBuilder::new("Their message", 2)
|
||
.sender("Alice")
|
||
.build();
|
||
|
||
let client = client.with_message(123, incoming_msg);
|
||
|
||
// Проверяем флаги
|
||
let messages = client.get_messages(123);
|
||
assert_eq!(messages[0].can_be_edited(), true); // Наше сообщение
|
||
assert_eq!(messages[1].can_be_edited(), false); // Чужое сообщение
|
||
}
|
||
|
||
/// Test: Множественные редактирования одного сообщения
|
||
#[tokio::test]
|
||
async fn test_multiple_edits_of_same_message() {
|
||
let client = FakeTdClient::new();
|
||
|
||
let msg = client.send_message(ChatId::new(123), "Version 1".to_string(), None, None).await.unwrap();
|
||
|
||
// Первое редактирование
|
||
client.edit_message(ChatId::new(123), msg.id(), "Version 2".to_string()).await.unwrap();
|
||
|
||
// Второе редактирование
|
||
client.edit_message(ChatId::new(123), msg.id(), "Version 3".to_string()).await.unwrap();
|
||
|
||
// Третье редактирование
|
||
client.edit_message(ChatId::new(123), msg.id(), "Final version".to_string()).await.unwrap();
|
||
|
||
// Проверяем что все 3 редактирования записаны
|
||
assert_eq!(client.get_edited_messages().len(), 3);
|
||
assert_eq!(client.get_edited_messages()[0].new_text, "Version 2");
|
||
assert_eq!(client.get_edited_messages()[1].new_text, "Version 3");
|
||
assert_eq!(client.get_edited_messages()[2].new_text, "Final version");
|
||
|
||
// Проверяем что сообщение содержит последнюю версию
|
||
let messages = client.get_messages(123);
|
||
assert_eq!(messages.len(), 1);
|
||
assert_eq!(messages[0].text(), "Final version");
|
||
}
|
||
|
||
/// Test: Редактирование несуществующего сообщения (возвращает ошибку)
|
||
#[tokio::test]
|
||
async fn test_edit_nonexistent_message() {
|
||
let client = FakeTdClient::new();
|
||
|
||
// Пытаемся отредактировать несуществующее сообщение
|
||
let result = client.edit_message(ChatId::new(123), MessageId::new(999), "New text".to_string()).await;
|
||
|
||
// Должна вернуться ошибка
|
||
assert!(result.is_err());
|
||
assert_eq!(result.unwrap_err(), "Message not found");
|
||
|
||
// В списке сообщений ничего нет
|
||
let messages = client.get_messages(123);
|
||
assert_eq!(messages.len(), 0);
|
||
}
|
||
|
||
/// Test: Отмена редактирования (Esc) - тестируем что можно восстановить original
|
||
/// В данном случае проверяем что FakeTdClient сохраняет историю edits
|
||
#[tokio::test]
|
||
async fn test_edit_history_tracking() {
|
||
let client = FakeTdClient::new();
|
||
|
||
let msg = client.send_message(ChatId::new(123), "Original".to_string(), None, None).await.unwrap();
|
||
|
||
// Симулируем начало редактирования -> изменение -> отмена
|
||
// Отменять на уровне FakeTdClient нельзя, но можно проверить что original сохранён
|
||
|
||
// Сохраняем original
|
||
let messages_before = client.get_messages(123);
|
||
let original = messages_before[0].text().to_string();
|
||
|
||
// Редактируем
|
||
client.edit_message(ChatId::new(123), msg.id(), "Edited".to_string()).await.unwrap();
|
||
|
||
// Проверяем что изменилось
|
||
let messages_edited = client.get_messages(123);
|
||
assert_eq!(messages_edited[0].text(), "Edited");
|
||
|
||
// Можем "отменить" редактирование вернув original
|
||
client.edit_message(ChatId::new(123), msg.id(), original).await.unwrap();
|
||
|
||
// Проверяем что вернулось
|
||
let messages_restored = client.get_messages(123);
|
||
assert_eq!(messages_restored[0].text(), "Original");
|
||
|
||
// История показывает 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");
|
||
}
|