// 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; /// Test: Смена состояния сети отображается в UI #[test] fn test_network_state_changes() { let mut client = FakeTdClient::new(); // Начальное состояние - Ready assert_eq!(client.network_state, NetworkState::Ready); // Сеть пропала client.network_state = NetworkState::WaitingForNetwork; assert_eq!(client.network_state, NetworkState::WaitingForNetwork); // В UI: "⚠ Нет сети" // Подключаемся к прокси client.network_state = NetworkState::ConnectingToProxy; assert_eq!(client.network_state, NetworkState::ConnectingToProxy); // В UI: "⏳ Прокси..." // Подключаемся к серверам client.network_state = NetworkState::Connecting; assert_eq!(client.network_state, NetworkState::Connecting); // В UI: "⏳ Подключение..." // Соединение восстановлено client.network_state = NetworkState::Ready; assert_eq!(client.network_state, NetworkState::Ready); // В UI: индикатор скрывается } /// Test: WaitingForNetwork - нет подключения #[test] fn test_network_waiting_for_network() { let mut client = FakeTdClient::new(); client.network_state = NetworkState::WaitingForNetwork; assert_eq!(client.network_state, NetworkState::WaitingForNetwork); // В этом состоянии: // - Показывается предупреждение "⚠ Нет сети" // - Отправка сообщений заблокирована // - Updates не приходят } /// Test: ConnectingToProxy - подключение через прокси #[test] fn test_network_connecting_to_proxy() { let mut client = FakeTdClient::new(); client.network_state = NetworkState::ConnectingToProxy; assert_eq!(client.network_state, NetworkState::ConnectingToProxy); // В UI: "⏳ Прокси..." } /// Test: Connecting - подключение к серверам Telegram #[test] fn test_network_connecting() { let mut client = FakeTdClient::new(); client.network_state = NetworkState::Connecting; assert_eq!(client.network_state, NetworkState::Connecting); // В UI: "⏳ Подключение..." } /// Test: Updating - обновление данных #[test] fn test_network_updating() { let mut client = FakeTdClient::new(); client.network_state = NetworkState::Updating; assert_eq!(client.network_state, NetworkState::Updating); // В UI: "⏳ Обновление..." } /// Test: Typing indicator - пользователь печатает #[test] fn test_typing_indicator_on() { let mut client = FakeTdClient::new(); let chat = create_test_chat("Alice", 123); client = client.with_chat(chat); // Alice начала печатать в чате 123 client.set_typing(Some(123)); assert_eq!(client.typing_chat_id, Some(123)); // В UI: под сообщениями отображается "Alice печатает..." } /// Test: Typing indicator - пользователь перестал печатать #[test] fn test_typing_indicator_off() { let mut client = FakeTdClient::new(); // Изначально Alice печатала client.set_typing(Some(123)); assert_eq!(client.typing_chat_id, Some(123)); // Alice перестала печатать client.set_typing(None); assert_eq!(client.typing_chat_id, None); // В UI: индикатор "печатает..." исчезает } /// Test: Отправка своего typing status #[test] fn test_send_own_typing_status() { let mut 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: Множественные переходы состояний сети #[test] fn test_multiple_network_state_transitions() { let mut 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.network_state = state.clone(); assert_eq!(client.network_state, state); } // Финальное состояние - Ready assert_eq!(client.network_state, NetworkState::Ready); }