Сгруппированы 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>
150 lines
5.8 KiB
Rust
150 lines
5.8 KiB
Rust
// 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");
|
||
}
|