Split core and TUI crates

This commit is contained in:
Mikhail Kilin
2026-05-20 00:31:18 +03:00
parent 91a8700b8e
commit eefac431e5
238 changed files with 624 additions and 191 deletions

View File

@@ -0,0 +1,177 @@
// Integration tests for send message flow
mod helpers;
use helpers::fake_tdclient::FakeTdClient;
use helpers::test_data::{create_test_chat, TestMessageBuilder};
use tele_tui::types::ChatId;
/// Test: Отправка текстового сообщения
#[tokio::test]
async fn test_send_text_message() {
let client = FakeTdClient::new();
let chat = create_test_chat("Mom", 123);
let client = client.with_chat(chat);
// Отправляем сообщение
let msg = client
.send_message(ChatId::new(123), "Hello, Mom!".to_string(), None, None)
.await
.unwrap();
// Проверяем что сообщение было отправлено
assert_eq!(client.get_sent_messages().len(), 1);
assert_eq!(client.get_sent_messages()[0].chat_id, 123);
assert_eq!(client.get_sent_messages()[0].text, "Hello, Mom!");
assert_eq!(client.get_sent_messages()[0].reply_to, None);
// Проверяем что сообщение добавилось в список
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].id(), msg.id());
assert_eq!(messages[0].text(), "Hello, Mom!");
assert!(messages[0].is_outgoing());
}
/// Test: Отправка нескольких сообщений обновляет список
#[tokio::test]
async fn test_send_multiple_messages_updates_list() {
let client = FakeTdClient::new();
// Отправляем первое сообщение
let msg1 = client
.send_message(ChatId::new(123), "Message 1".to_string(), None, None)
.await
.unwrap();
// Отправляем второе сообщение
let msg2 = client
.send_message(ChatId::new(123), "Message 2".to_string(), None, None)
.await
.unwrap();
// Отправляем третье сообщение
let msg3 = client
.send_message(ChatId::new(123), "Message 3".to_string(), None, None)
.await
.unwrap();
// Проверяем что все 3 сообщения отслеживаются
assert_eq!(client.get_sent_messages().len(), 3);
// Проверяем что все сообщения в списке
let messages = client.get_messages(123);
assert_eq!(messages.len(), 3);
assert_eq!(messages[0].id(), msg1.id());
assert_eq!(messages[1].id(), msg2.id());
assert_eq!(messages[2].id(), msg3.id());
assert_eq!(messages[0].text(), "Message 1");
assert_eq!(messages[1].text(), "Message 2");
assert_eq!(messages[2].text(), "Message 3");
}
/// Test: Отправка пустого сообщения (должно быть игнорировано на уровне App)
/// Здесь мы тестируем что FakeTdClient технически может отправить пустое сообщение,
/// но в реальном App это должно фильтроваться
#[tokio::test]
async fn test_send_empty_message_technical() {
let client = FakeTdClient::new();
// FakeTdClient технически может отправить пустое сообщение
let msg = client
.send_message(ChatId::new(123), "".to_string(), None, None)
.await
.unwrap();
// Проверяем что оно отправилось (в реальном App это должно фильтроваться)
assert_eq!(client.get_sent_messages().len(), 1);
assert_eq!(client.get_sent_messages()[0].text, "");
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].id(), msg.id());
assert_eq!(messages[0].text(), "");
}
/// Test: Отправка сообщения с форматированием (markdown сущности)
/// В данном случае мы не проверяем парсинг markdown, только что текст сохраняется
#[tokio::test]
async fn test_send_message_with_markdown() {
let client = FakeTdClient::new();
let text = "**Bold** *italic* `code`";
client
.send_message(ChatId::new(123), text.to_string(), None, None)
.await
.unwrap();
// Проверяем что текст сохранился как есть (парсинг markdown - отдельная логика)
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].text(), text);
}
/// Test: Отправка сообщения в разные чаты
#[tokio::test]
async fn test_send_messages_to_different_chats() {
let client = FakeTdClient::new();
// Отправляем в чат 123
client
.send_message(ChatId::new(123), "Hello Mom".to_string(), None, None)
.await
.unwrap();
// Отправляем в чат 456
client
.send_message(ChatId::new(456), "Hello Boss".to_string(), None, None)
.await
.unwrap();
// Отправляем ещё одно в чат 123
client
.send_message(ChatId::new(123), "How are you?".to_string(), None, None)
.await
.unwrap();
// Проверяем общее количество отправленных
assert_eq!(client.get_sent_messages().len(), 3);
// Проверяем что сообщения распределены по чатам
let chat123_messages = client.get_messages(123);
assert_eq!(chat123_messages.len(), 2);
assert_eq!(chat123_messages[0].text(), "Hello Mom");
assert_eq!(chat123_messages[1].text(), "How are you?");
let chat456_messages = client.get_messages(456);
assert_eq!(chat456_messages.len(), 1);
assert_eq!(chat456_messages[0].text(), "Hello Boss");
}
/// Test: Новое сообщение появляется в реальном времени (симуляция)
/// Тестируем что когда приходит новое входящее сообщение, оно добавляется в список
#[tokio::test]
async fn test_receive_incoming_message() {
let client = FakeTdClient::new();
// Добавляем существующее сообщение
client
.send_message(ChatId::new(123), "My outgoing".to_string(), None, None)
.await
.unwrap();
// Симулируем входящее сообщение от собеседника
let incoming_msg = TestMessageBuilder::new("Hey there!", 2000)
.sender("Alice")
.build();
let client = client.with_message(123, incoming_msg);
// Проверяем что в списке 2 сообщения
let messages = client.get_messages(123);
assert_eq!(messages.len(), 2);
assert!(messages[0].is_outgoing()); // Наше сообщение
assert!(!messages[1].is_outgoing()); // Входящее
assert_eq!(messages[1].text(), "Hey there!");
assert_eq!(messages[1].sender_name(), "Alice");
}