use mockito::Server;
use open_library_api_rs::client::OpenLibraryClient;
fn client_for(server: &Server) -> OpenLibraryClient {
OpenLibraryClient::builder()
.base_url(server.url())
.rate_limit(100)
.build()
.unwrap()
}
#[tokio::test]
async fn get_user_lists_parses_response() {
let mut server = Server::new_async().await;
let mock = server
.mock("GET", "/people/alice/lists.json")
.match_query(mockito::Matcher::AllOf(vec![
mockito::Matcher::UrlEncoded("limit".into(), "10".into()),
mockito::Matcher::UrlEncoded("offset".into(), "0".into()),
]))
.with_status(200)
.with_header("content-type", "application/json")
.with_body(r#"{"lists":[{"key":"/people/alice/lists/OL123L","name":"My Favourites","seed_count":10}],"size":1}"#)
.create_async()
.await;
let client = client_for(&server);
let lists = client.get_user_lists("alice", 10, 0).await.unwrap();
assert_eq!(lists.lists.len(), 1);
assert_eq!(lists.lists[0].name.as_deref(), Some("My Favourites"));
mock.assert_async().await;
}
#[tokio::test]
async fn get_user_lists_invalid_username_rejected() {
let server = Server::new_async().await;
let client = client_for(&server);
let err = client.get_user_lists("alice!@#", 10, 0).await.unwrap_err();
assert!(matches!(err, open_library_api_rs::Error::InvalidInput(_)));
}
#[tokio::test]
async fn get_list_parses_list() {
let mut server = Server::new_async().await;
let mock = server
.mock("GET", "/people/alice/lists/OL123L.json")
.with_status(200)
.with_header("content-type", "application/json")
.with_body(r#"{"key":"/people/alice/lists/OL123L","name":"Favourites","seed_count":5}"#)
.create_async()
.await;
let client = client_for(&server);
let list = client.get_list("alice", "OL123L").await.unwrap();
assert_eq!(list.name.as_deref(), Some("Favourites"));
mock.assert_async().await;
}