fixes
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

This commit is contained in:
Mikhail Kilin
2026-01-29 01:22:57 +03:00
parent 68a2b7a982
commit 126c7482af
39 changed files with 2861 additions and 74 deletions

192
tests/drafts.rs Normal file
View File

@@ -0,0 +1,192 @@
// 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");
}