176 lines
6.9 KiB
Rust
176 lines
6.9 KiB
Rust
// 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.content);
|
||
|
||
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();
|
||
|
||
// Тест всегда проходит - мы просто проверяем что код компилируется
|
||
// и не паникует на разных платформах
|
||
}
|
||
}
|