Files
telegram-tui/tests/drafts.rs
Mikhail Kilin 126c7482af
Some checks failed
CI / Check (pull_request) Has been cancelled
CI / Format (pull_request) Has been cancelled
CI / Clippy (pull_request) Has been cancelled
CI / Build (macos-latest) (pull_request) Has been cancelled
CI / Build (ubuntu-latest) (pull_request) Has been cancelled
CI / Build (windows-latest) (pull_request) Has been cancelled
fixes
2026-01-29 01:22:57 +03:00

193 lines
6.5 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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");
}