Files
telegram-tui/tests/drafts.rs
Mikhail Kilin 264f183510
Some checks failed
ci/woodpecker/pr/check Pipeline 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
style: auto-format entire codebase with cargo fmt (stable rustfmt.toml)
2026-02-22 17:09:51 +03:00

192 lines
6.6 KiB
Rust
Raw Permalink 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;
use tele_tui::types::{ChatId, MessageId};
/// Простая структура для хранения черновиков (как в реальном 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");
}