229 lines
7.8 KiB
Rust
229 lines
7.8 KiB
Rust
// Integration tests for navigation flow
|
||
|
||
mod helpers;
|
||
|
||
use helpers::fake_tdclient::FakeTdClient;
|
||
use helpers::test_data::{create_test_chat, TestMessageBuilder};
|
||
|
||
/// Test: Навигация вверх/вниз по списку чатов
|
||
#[test]
|
||
fn test_navigate_chat_list_up_down() {
|
||
let mut client = FakeTdClient::new();
|
||
|
||
let chat1 = create_test_chat("Mom", 123);
|
||
let chat2 = create_test_chat("Boss", 456);
|
||
let chat3 = create_test_chat("Friend", 789);
|
||
|
||
client = client.with_chats(vec![chat1, chat2, chat3]);
|
||
|
||
let chats = client.get_chats();
|
||
|
||
// Начинаем с индекса 0
|
||
let mut selected_index = 0;
|
||
assert_eq!(chats[selected_index].title, "Mom");
|
||
|
||
// ↓ - вниз
|
||
selected_index = (selected_index + 1).min(chats.len() - 1);
|
||
assert_eq!(selected_index, 1);
|
||
assert_eq!(chats[selected_index].title, "Boss");
|
||
|
||
// ↓ - ещё вниз
|
||
selected_index = (selected_index + 1).min(chats.len() - 1);
|
||
assert_eq!(selected_index, 2);
|
||
assert_eq!(chats[selected_index].title, "Friend");
|
||
|
||
// ↓ - на границе (не должно выйти за пределы)
|
||
selected_index = (selected_index + 1).min(chats.len() - 1);
|
||
assert_eq!(selected_index, 2); // Остался на последнем
|
||
|
||
// ↑ - вверх
|
||
selected_index = selected_index.saturating_sub(1);
|
||
assert_eq!(selected_index, 1);
|
||
assert_eq!(chats[selected_index].title, "Boss");
|
||
|
||
// ↑ - ещё вверх
|
||
selected_index = selected_index.saturating_sub(1);
|
||
assert_eq!(selected_index, 0);
|
||
assert_eq!(chats[selected_index].title, "Mom");
|
||
|
||
// ↑ - на границе (не должно выйти за пределы)
|
||
selected_index = selected_index.saturating_sub(1);
|
||
assert_eq!(selected_index, 0); // Остался на первом
|
||
}
|
||
|
||
/// Test: Enter открывает чат
|
||
#[test]
|
||
fn test_enter_opens_chat() {
|
||
let mut client = FakeTdClient::new();
|
||
|
||
let chat = create_test_chat("Mom", 123);
|
||
let _client = client.with_chat(chat);
|
||
|
||
// Состояние: список чатов, выбран чат 123
|
||
let selected_chat_id: Option<i64> = None;
|
||
|
||
// Пользователь нажал Enter
|
||
let new_selected_chat_id = Some(123);
|
||
|
||
assert_eq!(selected_chat_id, None);
|
||
assert_eq!(new_selected_chat_id, Some(123));
|
||
}
|
||
|
||
/// Test: Esc закрывает чат
|
||
#[test]
|
||
fn test_esc_closes_chat() {
|
||
// Состояние: открыт чат 123
|
||
let selected_chat_id = Some(123);
|
||
|
||
// Пользователь нажал Esc
|
||
let selected_chat_id: Option<i64> = None;
|
||
|
||
assert_eq!(selected_chat_id, None);
|
||
}
|
||
|
||
/// Test: Скролл сообщений в чате
|
||
#[test]
|
||
fn test_scroll_messages_in_chat() {
|
||
let mut client = FakeTdClient::new();
|
||
|
||
let messages = vec![
|
||
TestMessageBuilder::new("Msg 1", 1).build(),
|
||
TestMessageBuilder::new("Msg 2", 2).build(),
|
||
TestMessageBuilder::new("Msg 3", 3).build(),
|
||
TestMessageBuilder::new("Msg 4", 4).build(),
|
||
TestMessageBuilder::new("Msg 5", 5).build(),
|
||
];
|
||
|
||
client = client.with_messages(123, messages);
|
||
|
||
let msgs = client.get_messages(123);
|
||
|
||
// Скролл начинается снизу (последнее сообщение видно)
|
||
let mut scroll_offset: usize = 0;
|
||
|
||
// ↑ - скролл вверх (увеличиваем offset)
|
||
scroll_offset += 1;
|
||
assert_eq!(scroll_offset, 1);
|
||
|
||
// ↑ - ещё вверх
|
||
scroll_offset += 1;
|
||
assert_eq!(scroll_offset, 2);
|
||
|
||
// ↓ - скролл вниз (уменьшаем offset)
|
||
scroll_offset = scroll_offset.saturating_sub(1);
|
||
assert_eq!(scroll_offset, 1);
|
||
|
||
// ↓ - к низу
|
||
scroll_offset = scroll_offset.saturating_sub(1);
|
||
assert_eq!(scroll_offset, 0);
|
||
|
||
// ↓ - на границе
|
||
scroll_offset = scroll_offset.saturating_sub(1);
|
||
assert_eq!(scroll_offset, 0); // Не уходим в минус
|
||
}
|
||
|
||
/// Test: Переключение между папками (1-9)
|
||
#[test]
|
||
fn test_switch_folders() {
|
||
let mut client = FakeTdClient::new();
|
||
|
||
// Добавляем папки (FakeTdClient уже создаёт "All" с id=0)
|
||
client = client.with_folder(1, "Personal").with_folder(2, "Work");
|
||
|
||
let folders = client.get_folders();
|
||
|
||
// Проверяем что папки на месте
|
||
assert_eq!(folders.len(), 3);
|
||
assert_eq!(folders[0].name, "All");
|
||
assert_eq!(folders[1].name, "Personal");
|
||
assert_eq!(folders[2].name, "Work");
|
||
|
||
// Начинаем с папки 0 (All)
|
||
let mut selected_folder_index = 0;
|
||
assert_eq!(folders[selected_folder_index].name, "All");
|
||
|
||
// Нажали '1' - папка Personal (индекс 1)
|
||
selected_folder_index = 1;
|
||
assert_eq!(folders[selected_folder_index].name, "Personal");
|
||
|
||
// Нажали '2' - папка Work (индекс 2)
|
||
selected_folder_index = 2;
|
||
assert_eq!(folders[selected_folder_index].name, "Work");
|
||
|
||
// Нажали '0' (или Esc из папки) - обратно в All (индекс 0)
|
||
selected_folder_index = 0;
|
||
assert_eq!(folders[selected_folder_index].name, "All");
|
||
}
|
||
|
||
/// Test: Русская раскладка для навигации (р/о/л/д)
|
||
#[test]
|
||
fn test_russian_layout_navigation() {
|
||
// В реальном App: к/j/h/l маппятся на р/о/л/д для русской раскладки
|
||
|
||
// Mapping:
|
||
// j (down) <-> о
|
||
// k (up) <-> л
|
||
// h (left) <-> р
|
||
// l (right) <-> д
|
||
|
||
let mut selected_index = 1;
|
||
|
||
// Симулируем нажатие 'о' (как 'j' - вниз)
|
||
selected_index += 1;
|
||
assert_eq!(selected_index, 2);
|
||
|
||
// 'л' (как 'k' - вверх)
|
||
selected_index -= 1;
|
||
assert_eq!(selected_index, 1);
|
||
|
||
// Проверяем что логика работает одинаково
|
||
assert!(true); // Реальный тест был бы в input handler
|
||
}
|
||
|
||
/// Test: Подгрузка старых сообщений при скролле вверх
|
||
#[test]
|
||
fn test_load_older_messages_on_scroll_up() {
|
||
let mut client = FakeTdClient::new();
|
||
|
||
// Начальные сообщения (последние 10)
|
||
let initial_messages = vec![
|
||
TestMessageBuilder::new("Msg 91", 91).build(),
|
||
TestMessageBuilder::new("Msg 92", 92).build(),
|
||
TestMessageBuilder::new("Msg 93", 93).build(),
|
||
TestMessageBuilder::new("Msg 94", 94).build(),
|
||
TestMessageBuilder::new("Msg 95", 95).build(),
|
||
TestMessageBuilder::new("Msg 96", 96).build(),
|
||
TestMessageBuilder::new("Msg 97", 97).build(),
|
||
TestMessageBuilder::new("Msg 98", 98).build(),
|
||
TestMessageBuilder::new("Msg 99", 99).build(),
|
||
TestMessageBuilder::new("Msg 100", 100).build(),
|
||
];
|
||
|
||
client = client.with_messages(123, initial_messages);
|
||
|
||
assert_eq!(client.get_messages(123).len(), 10);
|
||
|
||
// Пользователь скроллит до самого верха (дошёл до Msg 91)
|
||
// Триггерим подгрузку старых сообщений
|
||
|
||
// Симулируем подгрузку (добавляем старые сообщения в начало)
|
||
let older_messages = vec![
|
||
TestMessageBuilder::new("Msg 81", 81).build(),
|
||
TestMessageBuilder::new("Msg 82", 82).build(),
|
||
TestMessageBuilder::new("Msg 83", 83).build(),
|
||
TestMessageBuilder::new("Msg 84", 84).build(),
|
||
TestMessageBuilder::new("Msg 85", 85).build(),
|
||
];
|
||
|
||
// Добавляем к существующим (в реальности - prepend)
|
||
let mut all_messages = older_messages;
|
||
all_messages.extend(client.get_messages(123));
|
||
|
||
client.messages.insert(123, all_messages);
|
||
|
||
// Теперь должно быть 15 сообщений
|
||
assert_eq!(client.get_messages(123).len(), 15);
|
||
assert_eq!(client.get_messages(123)[0].content, "Msg 81");
|
||
assert_eq!(client.get_messages(123)[14].content, "Msg 100");
|
||
}
|