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(_)));
}