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,218 @@
// Integration tests for edit message flow
mod helpers;
use helpers::fake_tdclient::FakeTdClient;
use helpers::test_data::TestMessageBuilder;
use tele_tui::types::{ChatId, MessageId};
/// Test: Редактирование сообщения изменяет текст
#[tokio::test]
async fn test_edit_message_changes_text() {
let client = FakeTdClient::new();
// Отправляем сообщение
let msg = client
.send_message(ChatId::new(123), "Original text".to_string(), None, None)
.await
.unwrap();
// Редактируем сообщение
client
.edit_message(ChatId::new(123), msg.id(), "Edited text".to_string())
.await
.unwrap();
// Проверяем что редактирование записалось
assert_eq!(client.get_edited_messages().len(), 1);
assert_eq!(client.get_edited_messages()[0].message_id, msg.id());
assert_eq!(client.get_edited_messages()[0].new_text, "Edited text");
// Проверяем что текст сообщения изменился
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].text(), "Edited text");
}
/// Test: Редактирование устанавливает edit_date
#[tokio::test]
async fn test_edit_message_sets_edit_date() {
let client = FakeTdClient::new();
// Отправляем сообщение
let msg = client
.send_message(ChatId::new(123), "Original".to_string(), None, None)
.await
.unwrap();
// Получаем дату до редактирования
let messages_before = client.get_messages(123);
let date_before = messages_before[0].date();
assert_eq!(messages_before[0].metadata.edit_date, 0); // Не редактировалось
// Редактируем сообщение
client
.edit_message(ChatId::new(123), msg.id(), "Edited".to_string())
.await
.unwrap();
// Проверяем что edit_date установлена
let messages_after = client.get_messages(123);
assert!(messages_after[0].metadata.edit_date > 0);
assert!(messages_after[0].metadata.edit_date > date_before); // edit_date после date
}
/// Test: Редактирование только своих сообщений (проверка через can_be_edited)
#[tokio::test]
async fn test_can_only_edit_own_messages() {
let client = FakeTdClient::new();
// Наше исходящее сообщение (можно редактировать)
let outgoing_msg = TestMessageBuilder::new("My message", 1).outgoing().build();
let client = client.with_message(123, outgoing_msg);
// Входящее сообщение от собеседника (нельзя редактировать)
let incoming_msg = TestMessageBuilder::new("Their message", 2)
.sender("Alice")
.build();
let client = client.with_message(123, incoming_msg);
// Проверяем флаги
let messages = client.get_messages(123);
assert!(messages[0].can_be_edited()); // Наше сообщение
assert!(!messages[1].can_be_edited()); // Чужое сообщение
}
/// Test: Множественные редактирования одного сообщения
#[tokio::test]
async fn test_multiple_edits_of_same_message() {
let client = FakeTdClient::new();
let msg = client
.send_message(ChatId::new(123), "Version 1".to_string(), None, None)
.await
.unwrap();
// Первое редактирование
client
.edit_message(ChatId::new(123), msg.id(), "Version 2".to_string())
.await
.unwrap();
// Второе редактирование
client
.edit_message(ChatId::new(123), msg.id(), "Version 3".to_string())
.await
.unwrap();
// Третье редактирование
client
.edit_message(ChatId::new(123), msg.id(), "Final version".to_string())
.await
.unwrap();
// Проверяем что все 3 редактирования записаны
assert_eq!(client.get_edited_messages().len(), 3);
assert_eq!(client.get_edited_messages()[0].new_text, "Version 2");
assert_eq!(client.get_edited_messages()[1].new_text, "Version 3");
assert_eq!(client.get_edited_messages()[2].new_text, "Final version");
// Проверяем что сообщение содержит последнюю версию
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].text(), "Final version");
}
/// Test: Редактирование несуществующего сообщения (возвращает ошибку)
#[tokio::test]
async fn test_edit_nonexistent_message() {
let client = FakeTdClient::new();
// Пытаемся отредактировать несуществующее сообщение
let result = client
.edit_message(ChatId::new(123), MessageId::new(999), "New text".to_string())
.await;
// Должна вернуться ошибка
assert!(result.is_err());
assert_eq!(result.unwrap_err(), "Message not found");
// В списке сообщений ничего нет
let messages = client.get_messages(123);
assert_eq!(messages.len(), 0);
}
/// Test: Отмена редактирования (Esc) - тестируем что можно восстановить original
/// В данном случае проверяем что FakeTdClient сохраняет историю edits
#[tokio::test]
async fn test_edit_history_tracking() {
let client = FakeTdClient::new();
let msg = client
.send_message(ChatId::new(123), "Original".to_string(), None, None)
.await
.unwrap();
// Симулируем начало редактирования -> изменение -> отмена
// Отменять на уровне FakeTdClient нельзя, но можно проверить что original сохранён
// Сохраняем original
let messages_before = client.get_messages(123);
let original = messages_before[0].text().to_string();
// Редактируем
client
.edit_message(ChatId::new(123), msg.id(), "Edited".to_string())
.await
.unwrap();
// Проверяем что изменилось
let messages_edited = client.get_messages(123);
assert_eq!(messages_edited[0].text(), "Edited");
// Можем "отменить" редактирование вернув original
client
.edit_message(ChatId::new(123), msg.id(), original)
.await
.unwrap();
// Проверяем что вернулось
let messages_restored = client.get_messages(123);
assert_eq!(messages_restored[0].text(), "Original");
// История показывает 2 редактирования
assert_eq!(client.get_edited_messages().len(), 2);
}
/// Test: Редактирование сразу после отправки (симуляция UpdateMessageSendSucceeded)
/// Проверяет что после send_message можно сразу edit_message с тем же ID
#[tokio::test]
async fn test_edit_immediately_after_send() {
let client = FakeTdClient::new();
// Отправляем сообщение
let sent_msg = client
.send_message(ChatId::new(123), "Just sent".to_string(), None, None)
.await
.unwrap();
// Сразу редактируем (не должно быть ошибки "Message not found")
let result = client
.edit_message(ChatId::new(123), sent_msg.id(), "Immediately edited".to_string())
.await;
// Редактирование должно пройти успешно
assert!(result.is_ok(), "Should be able to edit message immediately after sending");
// Проверяем что текст изменился
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].text(), "Immediately edited");
// История редактирований содержит это изменение
assert_eq!(client.get_edited_messages().len(), 1);
assert_eq!(client.get_edited_messages()[0].message_id, sent_msg.id());
assert_eq!(client.get_edited_messages()[0].new_text, "Immediately edited");
}