Files
telegram-tui/tests/reply_forward.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

203 lines
6.9 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 reply and forward flow
mod helpers;
use helpers::fake_tdclient::FakeTdClient;
use helpers::test_data::TestMessageBuilder;
use tele_tui::tdlib::{ForwardInfo, ReplyInfo};
/// Test: Reply создаёт сообщение с reply_to
#[test]
fn test_reply_creates_message_with_reply_to() {
let mut client = FakeTdClient::new();
// Входящее сообщение от собеседника
let original_msg = TestMessageBuilder::new("Question?", 100)
.sender("Alice")
.build();
client = client.with_message(123, original_msg);
// Отвечаем на него
let reply_id = client.send_message(123, "Answer!".to_string(), Some(100));
// Проверяем что ответ отправлен с reply_to
assert_eq!(client.sent_messages().len(), 1);
assert_eq!(client.sent_messages()[0].reply_to, Some(100));
// Проверяем что в списке 2 сообщения
let messages = client.get_messages(123);
assert_eq!(messages.len(), 2);
assert_eq!(messages[1].id, reply_id);
assert_eq!(messages[1].content.text(), "Answer!");
}
/// Test: Reply отображает превью оригинального сообщения
#[test]
fn test_reply_shows_original_preview() {
let mut client = FakeTdClient::new();
// Создаём сообщение с reply info
let reply_msg = TestMessageBuilder::new("Reply text", 101)
.outgoing()
.reply_to(100, "Alice", "Original")
.build();
client = client.with_message(123, reply_msg);
// Проверяем что reply_to сохранено
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert!(messages[0].reply_to.is_some());
let reply = messages[0].reply_to.as_ref().unwrap();
assert_eq!(reply.message_id, 100);
assert_eq!(reply.sender_name, "Alice");
assert_eq!(reply.text, "Original");
}
/// Test: Отмена reply mode (Esc) - сообщение отправляется без reply_to
#[test]
fn test_cancel_reply_sends_without_reply_to() {
let mut client = FakeTdClient::new();
// Входящее сообщение
let original = TestMessageBuilder::new("Question?", 100)
.sender("Alice")
.build();
client = client.with_message(123, original);
// Пользователь начал reply (r), потом отменил (Esc), затем отправил
// Это эмулируется отправкой без reply_to
client.send_message(123, "Regular message".to_string(), None);
// Проверяем что отправилось без reply_to
assert_eq!(client.sent_messages()[0].reply_to, None);
let messages = client.get_messages(123);
assert_eq!(messages[1].content.text(), "Regular message");
}
/// Test: Forward создаёт сообщение с forward_from
#[test]
fn test_forward_creates_message_with_forward_from() {
let mut client = FakeTdClient::new();
// Создаём пересланное сообщение
let forwarded_msg = TestMessageBuilder::new("Forwarded text", 200)
.forwarded_from("Bob")
.build();
client = client.with_message(456, forwarded_msg);
// Проверяем что forward_from сохранено
let messages = client.get_messages(456);
assert_eq!(messages.len(), 1);
assert!(messages[0].forward_from.is_some());
let forward = messages[0].forward_from.as_ref().unwrap();
assert_eq!(forward.sender_name, "Bob");
assert!(forward.date > 0); // Дата установлена
}
/// Test: Forward показывает "↪ Переслано от ..."
/// Проверяем что у пересланного сообщения есть forward_from
#[test]
fn test_forward_displays_sender_name() {
let mut client = FakeTdClient::new();
let msg = TestMessageBuilder::new("Important info", 300)
.forwarded_from("Charlie")
.build();
client = client.with_message(789, msg);
let messages = client.get_messages(789);
let forward = messages[0].forward_from.as_ref().unwrap();
// В UI это будет отображаться как "↪ Переслано от Charlie"
assert_eq!(forward.sender_name, "Charlie");
}
/// Test: Forward в другой чат
#[test]
fn test_forward_to_different_chat() {
let mut client = FakeTdClient::new();
// Исходное сообщение в чате 123
let original = TestMessageBuilder::new("Share this", 100)
.sender("Alice")
.build();
client = client.with_message(123, original);
// Пересылаем в чат 456
let forwarded = TestMessageBuilder::new("Share this", 101)
.forwarded_from("Alice")
.build();
client = client.with_message(456, forwarded);
// Проверяем что в первом чате 1 сообщение
assert_eq!(client.get_messages(123).len(), 1);
// Проверяем что во втором чате тоже 1 сообщение (пересланное)
assert_eq!(client.get_messages(456).len(), 1);
assert!(client.get_messages(456)[0].forward_from.is_some());
}
/// Test: Reply + Forward комбинация (ответ на пересланное сообщение)
#[test]
fn test_reply_to_forwarded_message() {
let mut client = FakeTdClient::new();
// Пересланное сообщение
let forwarded = TestMessageBuilder::new("Forwarded", 100)
.forwarded_from("Bob")
.build();
client = client.with_message(123, forwarded);
// Отвечаем на пересланное сообщение
let reply_id = client.send_message(123, "Thanks for sharing!".to_string(), Some(100));
// Проверяем что reply содержит reply_to
assert_eq!(client.sent_messages()[0].reply_to, Some(100));
let messages = client.get_messages(123);
assert_eq!(messages.len(), 2);
assert_eq!(messages[1].id, reply_id);
}
/// Test: Forward множества сообщений (batch forward)
#[test]
fn test_forward_multiple_messages() {
let mut client = FakeTdClient::new();
// Создаём 3 пересланных сообщения
let msg1 = TestMessageBuilder::new("Message 1", 100)
.forwarded_from("Alice")
.build();
let msg2 = TestMessageBuilder::new("Message 2", 101)
.forwarded_from("Alice")
.build();
let msg3 = TestMessageBuilder::new("Message 3", 102)
.forwarded_from("Alice")
.build();
client = client
.with_message(456, msg1)
.with_message(456, msg2)
.with_message(456, msg3);
// Проверяем что все 3 сообщения пересланы
let messages = client.get_messages(456);
assert_eq!(messages.len(), 3);
assert!(messages[0].forward_from.is_some());
assert!(messages[1].forward_from.is_some());
assert!(messages[2].forward_from.is_some());
}