use mockito::Server;
use open_library_api_rs::client::OpenLibraryClient;
use open_library_api_rs::models::common::VolumeIdType;
use open_library_api_rs::models::partner::VolumeStatus;
fn client_for(server: &Server) -> OpenLibraryClient {
OpenLibraryClient::builder()
.base_url(server.url())
.rate_limit(100)
.build()
.unwrap()
}
#[tokio::test]
async fn read_volume_parses_response() {
let mut server = Server::new_async().await;
let mock = server
.mock("GET", "/api/volumes/brief/isbn/0451450523.json")
.with_status(200)
.with_header("content-type", "application/json")
.with_body(r#"{"records":{"http://openlibrary.org/books/OL7408846M":{"url":"https://openlibrary.org/books/OL7408846M","title":"The Lord of the Rings"}},"items":[{"status":"borrowable","url":"https://openlibrary.org/books/OL7408846M/read"}]}"#)
.create_async()
.await;
let client = client_for(&server);
let response = client
.read_volume(VolumeIdType::Isbn, "0451450523")
.await
.unwrap();
assert_eq!(response.records.len(), 1);
assert_eq!(response.items[0].status, Some(VolumeStatus::Borrowable));
mock.assert_async().await;
}
#[tokio::test]
async fn read_volume_empty_value_rejected() {
let server = Server::new_async().await;
let client = client_for(&server);
let err = client.read_volume(VolumeIdType::Isbn, "").await.unwrap_err();
assert!(matches!(err, open_library_api_rs::Error::InvalidInput(_)));
}