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;
use open_library_api_rs::models::changes::ChangesParams;
use open_library_api_rs::models::common::ChangeKind;

fn client_for(server: &Server) -> OpenLibraryClient {
    OpenLibraryClient::builder()
        .base_url(server.url())
        .rate_limit(100)
        .build()
        .unwrap()
}

#[tokio::test]
async fn get_recent_changes_parses_array() {
    let mut server = Server::new_async().await;
    let mock = server
        .mock("GET", "/recentchanges.json")
        .with_status(200)
        .with_header("content-type", "application/json")
        .with_body(r#"[{"kind":"edit-book","key":"/books/OL7353617M","comment":"Fixed typo"}]"#)
        .create_async()
        .await;

    let client = client_for(&server);
    let changes = client.get_recent_changes(ChangesParams::default()).await.unwrap();
    assert_eq!(changes.len(), 1);
    assert_eq!(changes[0].kind, Some(ChangeKind::EditBook));
    mock.assert_async().await;
}

#[tokio::test]
async fn get_changes_by_date_uses_correct_path() {
    let mut server = Server::new_async().await;
    let mock = server
        .mock("GET", "/recentchanges/2024/06/15.json")
        .with_status(200)
        .with_header("content-type", "application/json")
        .with_body(r#"[]"#)
        .create_async()
        .await;

    let client = client_for(&server);
    let changes = client
        .get_changes_by_date("2024-06-15", ChangesParams::default())
        .await
        .unwrap();
    assert!(changes.is_empty());
    mock.assert_async().await;
}

#[tokio::test]
async fn get_changes_bad_date_rejected() {
    let server = Server::new_async().await;
    let client = client_for(&server);
    let err = client
        .get_changes_by_date("not-a-date", ChangesParams::default())
        .await
        .unwrap_err();
    assert!(matches!(err, open_library_api_rs::Error::InvalidInput(_)));
}