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

176 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 copy message flow
mod helpers;
use helpers::test_data::TestMessageBuilder;
/// Test: Форматирование простого сообщения для копирования
#[test]
fn test_format_plain_message() {
let msg = TestMessageBuilder::new("Hello, world!", 1)
.sender("Alice")
.outgoing()
.build();
// Простое сообщение должно содержать только текст
let formatted = format_message_for_test(&msg);
assert_eq!(formatted, "Hello, world!");
}
/// Test: Форматирование сообщения с forward контекстом
#[test]
fn test_format_message_with_forward() {
let msg = TestMessageBuilder::new("Forwarded message", 1)
.sender("Bob")
.forwarded_from("Alice")
.build();
// Сообщение с forward должно содержать контекст
let formatted = format_message_for_test(&msg);
assert!(formatted.contains("↪ Переслано от Alice"));
assert!(formatted.contains("Forwarded message"));
}
/// Test: Форматирование сообщения с reply контекстом
#[test]
fn test_format_message_with_reply() {
let reply_msg = TestMessageBuilder::new("Reply text", 2)
.sender("Bob")
.reply_to(1, "Alice", "Original message")
.build();
// Сообщение с reply должно содержать контекст оригинала
let formatted = format_message_for_test(&reply_msg);
assert!(formatted.contains("┌ Alice: Original message"));
assert!(formatted.contains("Reply text"));
}
/// Test: Форматирование сообщения с forward и reply одновременно
#[test]
fn test_format_message_with_both_contexts() {
// Создаём сообщение с reply и forward
let msg = TestMessageBuilder::new("Complex message", 2)
.sender("Bob")
.reply_to(1, "Alice", "Original")
.forwarded_from("Charlie")
.build();
let formatted = format_message_for_test(&msg);
// Должны быть оба контекста
assert!(formatted.contains("↪ Переслано от Charlie"));
assert!(formatted.contains("┌ Alice: Original"));
assert!(formatted.contains("Complex message"));
}
/// Test: Форматирование длинного сообщения
#[test]
fn test_format_long_message() {
let long_text = "This is a very long message that spans multiple lines. ".repeat(10);
let msg = TestMessageBuilder::new(&long_text, 1)
.sender("Alice")
.build();
let formatted = format_message_for_test(&msg);
assert_eq!(formatted, long_text);
}
/// Test: Форматирование сообщения с markdown entities
#[test]
fn test_format_message_with_markdown() {
// Этот тест проверяет что entities сохраняются при копировании
// В реальном коде entities конвертируются в markdown
let msg = TestMessageBuilder::new("Bold text", 1)
.sender("Alice")
.build();
let formatted = format_message_for_test(&msg);
// Для простоты проверяем что текст присутствует
// В реальности здесь должна быть конвертация entities в markdown
assert!(formatted.contains("Bold text"));
}
// Helper функция для форматирования (упрощённая версия)
// В реальном коде это делается в src/input/main_input.rs::format_message_for_clipboard
fn format_message_for_test(msg: &tele_tui::tdlib::MessageInfo) -> String {
let mut result = String::new();
// Добавляем forward контекст если есть
if let Some(forward) = &msg.forward_from {
result.push_str(&format!("↪ Переслано от {}\n", forward.sender_name));
}
// Добавляем reply контекст если есть
if let Some(reply) = &msg.reply_to {
result.push_str(&format!("{}: {}\n", reply.sender_name, reply.text));
}
// Добавляем основной текст
result.push_str(msg.text());
result
}
#[cfg(test)]
mod clipboard_tests {
use super::*;
/// Test: Проверка что clipboard функции не падают
/// Примечание: Реальное тестирование clipboard требует GUI окружения
/// и может быть ненадёжным в CI. Этот тест просто проверяет что
/// arboard::Clipboard инициализируется без ошибок.
#[test]
#[ignore] // Игнорируем в CI, так как может не быть GUI окружения
fn test_clipboard_initialization() {
use arboard::Clipboard;
// Проверяем что можем создать clipboard
let result = Clipboard::new();
// В headless окружении может вернуть ошибку - это нормально
// Главное что не паникует
match result {
Ok(_) => {
// Clipboard доступен - отлично!
}
Err(_) => {
// Clipboard недоступен - ожидаемо в headless окружении
// Тест всё равно проходит
}
}
}
/// Test: Копирование в реальный clipboard (только для локального тестирования)
#[test]
#[ignore] // Игнорируем по умолчанию, запускать вручную: cargo test --ignored
fn test_copy_to_real_clipboard() {
use arboard::Clipboard;
let test_text = "Test message for clipboard";
// Пытаемся скопировать
if let Ok(mut clipboard) = Clipboard::new() {
let copy_result = clipboard.set_text(test_text);
assert!(copy_result.is_ok(), "Failed to copy to clipboard");
// Пытаемся прочитать обратно
if let Ok(content) = clipboard.get_text() {
assert_eq!(content, test_text, "Clipboard content mismatch");
}
}
}
/// Test: Кроссплатформенность clipboard
#[test]
fn test_clipboard_availability() {
use arboard::Clipboard;
// Этот тест просто проверяет что arboard доступен на всех платформах
// arboard поддерживает: Linux (X11/Wayland), Windows, macOS
let _clipboard_available = Clipboard::new().is_ok();
// Тест всегда проходит - мы просто проверяем что код компилируется
// и не паникует на разных платформах
}
}