Files
telegram-tui/tests/network_typing.rs
Mikhail Kilin 3b7ef41cae
Some checks failed
ci/woodpecker/pr/check Pipeline was successful
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
fix: resolve all 40 clippy warnings (dead_code, unused_imports, lints)
- Add #[allow(unused_imports)] on pub re-exports used only by lib/tests
- Add #[allow(dead_code)] on public API items unused in binary target
- Fix collapsible_if, redundant_closure, unnecessary_map_or in main.rs
- Prefix unused test variables with underscore

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 17:50:18 +03:00

177 lines
5.8 KiB
Rust
Raw 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 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);
}