Files
telegram-tui/tests/reply_forward.rs
Mikhail Kilin 264f183510
Some checks failed
ci/woodpecker/pr/check Pipeline failed
CI / Check (pull_request) Has been cancelled
CI / Format (pull_request) Has been cancelled
CI / Clippy (pull_request) Has been cancelled
CI / Build (macos-latest) (pull_request) Has been cancelled
CI / Build (ubuntu-latest) (pull_request) Has been cancelled
CI / Build (windows-latest) (pull_request) Has been cancelled
style: auto-format entire codebase with cargo fmt (stable rustfmt.toml)
2026-02-22 17:09:51 +03:00

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