// 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 = 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); }