// Integration tests for drafts flow mod helpers; use helpers::test_data::{create_test_chat, TestChatBuilder}; use std::collections::HashMap; /// Простая структура для хранения черновиков (как в реальном App) struct DraftManager { drafts: HashMap, // 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: Переключение между чатами сохраняет текст #[test] 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: Возврат в чат восстанавливает текст #[test] 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: Отправка сообщения удаляет черновик #[test] 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: Индикатор черновика в списке чатов #[test] 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: Множественные черновики в разных чатах #[test] 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: Пустой текст не сохраняется как черновик #[test] 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: Редактирование черновика #[test] 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"); }