open-library-api-rs 0.1.0

Async Rust client for the Open Library API
Documentation
// v0.0.1
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;
}