| @ -0,0 +1,84 @@ | |||
| use futures::stream::{self, StreamExt}; | |||
| use tokio::io; | |||
| use tokio::net; | |||
| use tokio::sync::mpsc; | |||
| use solstice::proto::server::{ | |||
| Client, ClientOptions, Credentials, ServerRequest, ServerResponse, | |||
| UserStatusRequest, Version, | |||
| }; | |||
| // Enable capturing logs in tests. | |||
| fn init() { | |||
| let _ = env_logger::builder().is_test(true).try_init(); | |||
| } | |||
| async fn connect() -> io::Result<net::TcpStream> { | |||
| net::TcpStream::connect("server.slsknet.org:2242").await | |||
| } | |||
| fn make_user_name(test_name: &str) -> String { | |||
| format!("st_{}", test_name) | |||
| } | |||
| fn client_options(user_name: String) -> ClientOptions { | |||
| let password = "abcdefgh".to_string(); | |||
| let credentials = Credentials::new(user_name, password).unwrap(); | |||
| ClientOptions { | |||
| credentials, | |||
| version: Version::default(), | |||
| } | |||
| } | |||
| #[tokio::test] | |||
| async fn integration_connect() { | |||
| init(); | |||
| let stream = connect().await.unwrap(); | |||
| let options = client_options(make_user_name("connect")); | |||
| let client = Client::login(stream, options).await.unwrap(); | |||
| let mut inbound = client.run(stream::pending()); | |||
| assert!(inbound.next().await.is_some()); | |||
| } | |||
| #[tokio::test] | |||
| async fn integration_check_user_status() { | |||
| init(); | |||
| let stream = connect().await.unwrap(); | |||
| let user_name = make_user_name("check_user_status"); | |||
| let options = client_options(user_name.clone()); | |||
| let client = Client::login(stream, options).await.unwrap(); | |||
| let (request_tx, mut request_rx) = mpsc::channel(1); | |||
| let outbound = Box::pin(async_stream::stream! { | |||
| while let Some(request) = request_rx.recv().await { | |||
| yield request; | |||
| } | |||
| }); | |||
| let mut inbound = client.run(outbound); | |||
| request_tx | |||
| .send(ServerRequest::UserStatusRequest(UserStatusRequest { | |||
| user_name: user_name.clone(), | |||
| })) | |||
| .await | |||
| .unwrap(); | |||
| while let Some(result) = inbound.next().await { | |||
| let response = result.unwrap(); | |||
| if let ServerResponse::UserStatusResponse(response) = response { | |||
| assert_eq!(response.user_name, user_name); | |||
| return; | |||
| } | |||
| } | |||
| unreachable!(); | |||
| } | |||