Split core and TUI crates

This commit is contained in:
Mikhail Kilin
2026-05-20 00:31:18 +03:00
parent 91a8700b8e
commit eefac431e5
238 changed files with 624 additions and 191 deletions

View File

@@ -0,0 +1,176 @@
// Integration tests for network and typing flow
mod helpers;
use helpers::fake_tdclient::FakeTdClient;
use helpers::test_data::create_test_chat;
use tele_tui::tdlib::NetworkState;
use tele_tui::types::ChatId;
/// Test: Смена состояния сети отображается в UI
#[tokio::test]
async fn test_network_state_changes() {
let client = FakeTdClient::new();
// Начальное состояние - Ready
assert_eq!(client.get_network_state(), NetworkState::Ready);
// Сеть пропала
client.simulate_network_change(NetworkState::WaitingForNetwork);
assert_eq!(client.get_network_state(), NetworkState::WaitingForNetwork);
// В UI: "⚠ Нет сети"
// Подключаемся к прокси
client.simulate_network_change(NetworkState::ConnectingToProxy);
assert_eq!(client.get_network_state(), NetworkState::ConnectingToProxy);
// В UI: "⏳ Прокси..."
// Подключаемся к серверам
client.simulate_network_change(NetworkState::Connecting);
assert_eq!(client.get_network_state(), NetworkState::Connecting);
// В UI: "⏳ Подключение..."
// Соединение восстановлено
client.simulate_network_change(NetworkState::Ready);
assert_eq!(client.get_network_state(), NetworkState::Ready);
// В UI: индикатор скрывается
}
/// Test: WaitingForNetwork - нет подключения
#[tokio::test]
async fn test_network_waiting_for_network() {
let client = FakeTdClient::new();
client.simulate_network_change(NetworkState::WaitingForNetwork);
assert_eq!(client.get_network_state(), NetworkState::WaitingForNetwork);
// В этом состоянии:
// - Показывается предупреждение "⚠ Нет сети"
// - Отправка сообщений заблокирована
// - Updates не приходят
}
/// Test: ConnectingToProxy - подключение через прокси
#[tokio::test]
async fn test_network_connecting_to_proxy() {
let client = FakeTdClient::new();
client.simulate_network_change(NetworkState::ConnectingToProxy);
assert_eq!(client.get_network_state(), NetworkState::ConnectingToProxy);
// В UI: "⏳ Прокси..."
}
/// Test: Connecting - подключение к серверам Telegram
#[tokio::test]
async fn test_network_connecting() {
let client = FakeTdClient::new();
client.simulate_network_change(NetworkState::Connecting);
assert_eq!(client.get_network_state(), NetworkState::Connecting);
// В UI: "⏳ Подключение..."
}
/// Test: Updating - обновление данных
#[tokio::test]
async fn test_network_updating() {
let client = FakeTdClient::new();
client.simulate_network_change(NetworkState::Updating);
assert_eq!(client.get_network_state(), NetworkState::Updating);
// В UI: "⏳ Обновление..."
}
/// Test: Typing indicator - пользователь печатает
#[tokio::test]
async fn test_typing_indicator_on() {
let client = FakeTdClient::new();
let chat = create_test_chat("Alice", 123);
let client = client.with_chat(chat);
// Alice начала печатать в чате 123
// Симулируем через send_chat_action
client
.send_chat_action(ChatId::new(123), "Typing".to_string())
.await;
assert_eq!(*client.typing_chat_id.lock().unwrap(), Some(123));
// В UI: под сообщениями отображается "Alice печатает..."
}
/// Test: Typing indicator - пользователь перестал печатать
#[tokio::test]
async fn test_typing_indicator_off() {
let client = FakeTdClient::new();
// Изначально Alice печатала
client
.send_chat_action(ChatId::new(123), "Typing".to_string())
.await;
assert_eq!(*client.typing_chat_id.lock().unwrap(), Some(123));
// Alice перестала печатать
client
.send_chat_action(ChatId::new(123), "Cancel".to_string())
.await;
assert_eq!(*client.typing_chat_id.lock().unwrap(), None);
// В UI: индикатор "печатает..." исчезает
}
/// Test: Отправка своего typing status
#[tokio::test]
async fn test_send_own_typing_status() {
let _client = FakeTdClient::new();
// Пользователь начал печатать в чате 456
// В реальном App вызывается client.send_chat_action(chat_id, ChatAction::Typing)
// Симулируем: устанавливаем что мы печатаем
let our_typing_chat_id = Some(456);
assert_eq!(our_typing_chat_id, Some(456));
// Собеседник видит что мы печатаем
// Через некоторое время (или при отправке сообщения) - отменяем
// client.send_chat_action(chat_id, ChatAction::Cancel)
let our_typing_chat_id: Option<i64> = None;
assert_eq!(our_typing_chat_id, None);
}
/// Test: Множественные переходы состояний сети
#[tokio::test]
async fn test_multiple_network_state_transitions() {
let client = FakeTdClient::new();
// Цикл переходов состояний
let states = vec![
NetworkState::Ready,
NetworkState::Connecting,
NetworkState::Ready,
NetworkState::WaitingForNetwork,
NetworkState::ConnectingToProxy,
NetworkState::Connecting,
NetworkState::Updating,
NetworkState::Ready,
];
for state in states {
client.simulate_network_change(state.clone());
assert_eq!(client.get_network_state(), state);
}
// Финальное состояние - Ready
assert_eq!(client.get_network_state(), NetworkState::Ready);
}