use http_client_vcr::NoOpClient;
use lastfm_edit::{LastFmEditClientImpl, LastFmEditSession};
use std::time::Duration;
use tokio::time::timeout;
fn create_test_session() -> LastFmEditSession {
LastFmEditSession::new(
"test_user".to_string(),
vec!["sessionid=.test_session_id_12345".to_string()],
Some("test_csrf_token".to_string()),
"https://www.last.fm".to_string(),
)
}
#[test_log::test(tokio::test)]
async fn test_shared_broadcaster_across_clients() {
let http_client1 = NoOpClient::new();
let client1 = LastFmEditClientImpl::from_session(Box::new(http_client1), create_test_session());
let http_client2 = NoOpClient::new();
let client2 = client1.with_shared_broadcaster(Box::new(http_client2));
let http_client3 = NoOpClient::new();
let session = client1.get_session();
let client3 = LastFmEditClientImpl::from_session(Box::new(http_client3), session);
let mut events1 = client1.subscribe();
let mut events2 = client2.subscribe();
let mut events3 = client3.subscribe();
assert!(client1.latest_event().is_none());
assert!(client2.latest_event().is_none());
assert!(client3.latest_event().is_none());
let no_event_1 = timeout(Duration::from_millis(10), events1.recv()).await;
let no_event_2 = timeout(Duration::from_millis(10), events2.recv()).await;
let no_event_3 = timeout(Duration::from_millis(10), events3.recv()).await;
assert!(no_event_1.is_err());
assert!(no_event_2.is_err());
assert!(no_event_3.is_err());
}
#[test_log::test(tokio::test)]
async fn test_session_sharing_vs_broadcaster_sharing() {
let http_client1 = NoOpClient::new();
let client1 = LastFmEditClientImpl::from_session(Box::new(http_client1), create_test_session());
let http_client2 = NoOpClient::new();
let session = client1.get_session();
let client2 = LastFmEditClientImpl::from_session(Box::new(http_client2), session);
let http_client3 = NoOpClient::new();
let client3 = client1.with_shared_broadcaster(Box::new(http_client3));
assert_eq!(
client1.get_session().base_url,
client2.get_session().base_url
);
assert_eq!(
client1.get_session().base_url,
client3.get_session().base_url
);
assert!(client1.latest_event().is_none());
assert!(client2.latest_event().is_none());
assert!(client3.latest_event().is_none());
let _events1 = client1.subscribe();
let _events2 = client2.subscribe();
let _events3 = client3.subscribe();
}
#[test_log::test]
fn test_client_creation_patterns() {
let http_client1 = NoOpClient::new();
let client1 = LastFmEditClientImpl::from_session(Box::new(http_client1), create_test_session());
let http_client2 = NoOpClient::new();
let session = client1.get_session();
let client2 = LastFmEditClientImpl::from_session(Box::new(http_client2), session);
assert_eq!(
client1.get_session().base_url,
client2.get_session().base_url
);
let http_client3 = NoOpClient::new();
let client3 = client1.with_shared_broadcaster(Box::new(http_client3));
assert_eq!(
client1.get_session().base_url,
client3.get_session().base_url
);
let _sub1 = client1.subscribe();
let _sub2 = client2.subscribe();
let _sub3 = client3.subscribe();
}