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