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,190 @@
// Integration tests for drafts flow
mod helpers;
use helpers::test_data::{create_test_chat, TestChatBuilder};
use std::collections::HashMap;
/// Простая структура для хранения черновиков (как в реальном App)
struct DraftManager {
drafts: HashMap<i64, String>, // chat_id -> draft text
}
impl DraftManager {
fn new() -> Self {
Self { drafts: HashMap::new() }
}
/// Сохранить черновик для чата
fn save_draft(&mut self, chat_id: i64, text: String) {
if text.is_empty() {
self.drafts.remove(&chat_id);
} else {
self.drafts.insert(chat_id, text);
}
}
/// Получить черновик для чата
fn get_draft(&self, chat_id: i64) -> Option<&String> {
self.drafts.get(&chat_id)
}
/// Очистить черновик для чата
fn clear_draft(&mut self, chat_id: i64) {
self.drafts.remove(&chat_id);
}
/// Проверить есть ли черновик
fn has_draft(&self, chat_id: i64) -> bool {
self.drafts.contains_key(&chat_id)
}
}
/// Test: Переключение между чатами сохраняет текст
#[tokio::test]
async fn test_switching_chats_saves_draft() {
let mut drafts = DraftManager::new();
// Пользователь в чате 123, начал печатать
let current_chat = 123;
let input_text = "Hello, this is a draft message";
// Перед переключением на другой чат - сохраняем
drafts.save_draft(current_chat, input_text.to_string());
// Переключаемся на чат 456
let _new_chat = 456;
// Проверяем что черновик для 123 сохранился
assert!(drafts.has_draft(123));
assert_eq!(drafts.get_draft(123).unwrap(), input_text);
// В новом чате 456 черновика нет
assert!(!drafts.has_draft(456));
}
/// Test: Возврат в чат восстанавливает текст
#[tokio::test]
async fn test_returning_to_chat_restores_draft() {
let mut drafts = DraftManager::new();
// Сохраняем черновик в чате 123
drafts.save_draft(123, "Unfinished message".to_string());
// Переключились на другие чаты
// ...
// Возвращаемся в чат 123
let restored_text = drafts.get_draft(123);
assert!(restored_text.is_some());
assert_eq!(restored_text.unwrap(), "Unfinished message");
}
/// Test: Отправка сообщения удаляет черновик
#[tokio::test]
async fn test_sending_message_clears_draft() {
let mut drafts = DraftManager::new();
// Сохранили черновик
drafts.save_draft(123, "Draft text".to_string());
assert!(drafts.has_draft(123));
// Пользователь отправил сообщение - очищаем черновик
drafts.clear_draft(123);
assert!(!drafts.has_draft(123));
assert_eq!(drafts.get_draft(123), None);
}
/// Test: Индикатор черновика в списке чатов
#[tokio::test]
async fn test_draft_indicator_in_chat_list() {
let mut drafts = DraftManager::new();
// Создаём несколько чатов
let _chat1 = create_test_chat("Mom", 123);
let chat2 = TestChatBuilder::new("Boss", 456)
.draft("Draft: Meeting notes")
.build();
let _chat3 = create_test_chat("Friend", 789);
// В реальном App: chat.draft_text устанавливается из DraftManager
// Здесь просто проверяем что у chat2 есть draft_text поле
assert_eq!(chat2.draft_text.as_ref().unwrap(), "Draft: Meeting notes");
// Симулируем: пользователь набрал текст в чате 123
drafts.save_draft(123, "My draft".to_string());
// Проверяем что драфт есть
assert!(drafts.has_draft(123));
assert_eq!(drafts.get_draft(123).unwrap(), "My draft");
// В UI рядом с чатом 123 будет показываться индикатор/превью
// Например: "Mom" | "Draft: My draft"
}
/// Test: Множественные черновики в разных чатах
#[tokio::test]
async fn test_multiple_drafts_in_different_chats() {
let mut drafts = DraftManager::new();
// Создаём черновики в 3 чатах
drafts.save_draft(123, "Draft for Mom".to_string());
drafts.save_draft(456, "Draft for Boss".to_string());
drafts.save_draft(789, "Draft for Friend".to_string());
// Проверяем что все сохранились
assert_eq!(drafts.get_draft(123).unwrap(), "Draft for Mom");
assert_eq!(drafts.get_draft(456).unwrap(), "Draft for Boss");
assert_eq!(drafts.get_draft(789).unwrap(), "Draft for Friend");
// Очищаем один
drafts.clear_draft(456);
// Проверяем что остальные на месте
assert!(drafts.has_draft(123));
assert!(!drafts.has_draft(456));
assert!(drafts.has_draft(789));
}
/// Test: Пустой текст не сохраняется как черновик
#[tokio::test]
async fn test_empty_text_does_not_save_draft() {
let mut drafts = DraftManager::new();
// Пытаемся сохранить пустой черновик
drafts.save_draft(123, "".to_string());
// Не должен сохраниться
assert!(!drafts.has_draft(123));
// Сохраняем нормальный черновик
drafts.save_draft(123, "Text".to_string());
assert!(drafts.has_draft(123));
// Затем очищаем (сохраняем пустой)
drafts.save_draft(123, "".to_string());
// Черновик должен удалиться
assert!(!drafts.has_draft(123));
}
/// Test: Редактирование черновика
#[tokio::test]
async fn test_editing_draft() {
let mut drafts = DraftManager::new();
// Сохраняем начальный черновик
drafts.save_draft(123, "First version".to_string());
assert_eq!(drafts.get_draft(123).unwrap(), "First version");
// Пользователь редактирует - сохраняем обновлённую версию
drafts.save_draft(123, "Second version".to_string());
assert_eq!(drafts.get_draft(123).unwrap(), "Second version");
// Ещё раз редактирует
drafts.save_draft(123, "Final version".to_string());
assert_eq!(drafts.get_draft(123).unwrap(), "Final version");
}