Files
telegram-tui/tests/delete_message.rs
Mikhail Kilin 43960332d9 refactor: restructure MessageInfo with logical field grouping (P2.6)
Сгруппированы 16 плоских полей MessageInfo в 4 логические структуры
для улучшения организации кода и maintainability.

Новые структуры:
- MessageMetadata: id, sender_name, date, edit_date
- MessageContent: text, entities
- MessageState: is_outgoing, is_read, can_be_edited, can_be_deleted_*
- MessageInteractions: reply_to, forward_from, reactions

Изменения:
- Добавлены 4 новые структуры в tdlib/types.rs
- Обновлена MessageInfo для использования новых структур
- Добавлен конструктор MessageInfo::new() для удобного создания
- Добавлены getter методы (id(), text(), sender_name() и др.) для удобного доступа
- Обновлены все места создания MessageInfo (convert_message)
- Обновлены все места использования (~200+ обращений):
  * ui/messages.rs: рендеринг сообщений
  * app/mod.rs: логика приложения
  * input/main_input.rs: обработка ввода и копирование
  * tdlib/client.rs: обработка updates
  * Все тестовые файлы (14 файлов)

Преимущества:
- Логическая группировка данных
- Проще понимать структуру сообщения
- Легче добавлять новые поля в будущем
- Улучшенная читаемость кода

Статус: Priority 2 теперь 80% (4/5 задач)
-  Error enum
-  Config validation
-  Newtype для ID
-  MessageInfo реструктуризация
-  MessageBuilder pattern

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-31 01:45:54 +03:00

150 lines
5.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Integration tests for delete message flow
mod helpers;
use helpers::fake_tdclient::FakeTdClient;
use helpers::test_data::TestMessageBuilder;
/// Test: Удаление сообщения убирает его из списка
#[test]
fn test_delete_message_removes_from_list() {
let mut client = FakeTdClient::new();
// Отправляем сообщение
let msg_id = client.send_message(123, "Delete me".to_string(), None);
// Проверяем что сообщение есть
assert_eq!(client.get_messages(123).len(), 1);
// Удаляем сообщение
client.delete_message(123, msg_id);
// Проверяем что удаление записалось
assert_eq!(client.deleted_messages().len(), 1);
assert_eq!(client.deleted_messages()[0], msg_id);
// Проверяем что сообщение удалено из списка
assert_eq!(client.get_messages(123).len(), 0);
}
/// Test: Удаление нескольких сообщений
#[test]
fn test_delete_multiple_messages() {
let mut client = FakeTdClient::new();
// Отправляем 3 сообщения
let msg1_id = client.send_message(123, "Message 1".to_string(), None);
let msg2_id = client.send_message(123, "Message 2".to_string(), None);
let msg3_id = client.send_message(123, "Message 3".to_string(), None);
assert_eq!(client.get_messages(123).len(), 3);
// Удаляем первое и третье
client.delete_message(123, msg1_id);
client.delete_message(123, msg3_id);
// Проверяем историю удалений
assert_eq!(client.deleted_messages().len(), 2);
assert_eq!(client.deleted_messages()[0], msg1_id);
assert_eq!(client.deleted_messages()[1], msg3_id);
// Проверяем что осталось только второе сообщение
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].id, msg2_id);
assert_eq!(messages[0].content.text(), "Message 2");
}
/// Test: Удаление только своих сообщений (проверка через can_be_deleted_for_all_users)
#[test]
fn test_can_only_delete_own_messages_for_all() {
let mut client = FakeTdClient::new();
// Наше исходящее сообщение (можно удалить для всех)
let outgoing_msg = TestMessageBuilder::new("My message", 1).outgoing().build();
client = client.with_message(123, outgoing_msg);
// Входящее сообщение от собеседника (можно удалить только для себя)
let incoming_msg = TestMessageBuilder::new("Their message", 2)
.sender("Alice")
.build();
client = client.with_message(123, incoming_msg);
// Проверяем флаги удаления
let messages = client.get_messages(123);
assert_eq!(messages[0].can_be_deleted_for_all_users, true); // Наше
assert_eq!(messages[1].can_be_deleted_for_all_users, false); // Чужое
// Оба можно удалить для себя
assert_eq!(messages[0].can_be_deleted_only_for_self, true);
assert_eq!(messages[1].can_be_deleted_only_for_self, true);
}
/// Test: Удаление несуществующего сообщения (ничего не происходит)
#[test]
fn test_delete_nonexistent_message() {
let mut client = FakeTdClient::new();
// Отправляем одно сообщение
let msg_id = client.send_message(123, "Exists".to_string(), None);
assert_eq!(client.get_messages(123).len(), 1);
// Пытаемся удалить несуществующее
client.delete_message(123, 999);
// Удаление записалось в историю
assert_eq!(client.deleted_messages().len(), 1);
assert_eq!(client.deleted_messages()[0], 999);
// Но существующее сообщение осталось
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].id, msg_id);
}
/// Test: Подтверждение удаления (симуляция модалки)
/// FakeTdClient сразу удаляет, но в реальном App должна быть модалка подтверждения
#[test]
fn test_delete_with_confirmation_flow() {
let mut client = FakeTdClient::new();
let msg_id = client.send_message(123, "To delete".to_string(), None);
// Шаг 1: Пользователь нажал 'd' -> показывается модалка (в App)
// В FakeTdClient просто проверяем что сообщение ещё есть
assert_eq!(client.get_messages(123).len(), 1);
assert_eq!(client.deleted_messages().len(), 0);
// Шаг 2: Пользователь подтвердил 'y' -> удаляем
client.delete_message(123, msg_id);
// Проверяем что удалено
assert_eq!(client.get_messages(123).len(), 0);
assert_eq!(client.deleted_messages().len(), 1);
}
/// Test: Отмена удаления (Esc) - сообщение остаётся
#[test]
fn test_cancel_delete_keeps_message() {
let mut client = FakeTdClient::new();
let msg_id = client.send_message(123, "Keep me".to_string(), None);
// Шаг 1: Пользователь нажал 'd' -> показалась модалка
assert_eq!(client.get_messages(123).len(), 1);
// Шаг 2: Пользователь нажал 'Esc' -> НЕ вызываем delete_message
// Проверяем что сообщение осталось
assert_eq!(client.get_messages(123).len(), 1);
assert_eq!(client.deleted_messages().len(), 0);
// Сообщение на месте
let messages = client.get_messages(123);
assert_eq!(messages[0].id, msg_id);
assert_eq!(messages[0].content.text(), "Keep me");
}