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
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:
192
tests/drafts.rs
Normal file
192
tests/drafts.rs
Normal 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");
|
||||
}
|
||||
Reference in New Issue
Block a user