191 lines
6.5 KiB
Rust
191 lines
6.5 KiB
Rust
// 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: Переключение между чатами сохраняет текст
|
||
#[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");
|
||
}
|