wikibase_rest_api 0.1.16

A Rust client for the Wikibase REST API.
Documentation
impl_language_string_value!(
    Description,
    "descriptions",
    "descriptions_with_language_fallback",
    "description",
    "Description"
);

#[cfg(test)]
mod tests {
    use super::*;
    use wiremock::matchers::{bearer_token, body_partial_json, method, path};
    use wiremock::{Mock, MockServer, ResponseTemplate};

    #[tokio::test]
    #[cfg_attr(miri, ignore)]
    async fn test_descriptions_get_match_with_fallback() {
        let id = "Q42";
        let mock_path = format!(
            "/w/rest.php/wikibase/v1/entities/items/{id}/descriptions_with_language_fallback/foo"
        );
        let mock_server = MockServer::start().await;
        Mock::given(method("GET"))
            .and(path(&mock_path))
            .respond_with(ResponseTemplate::new(200).set_body_json(json!("Douglas Adams")))
            .mount(&mock_server)
            .await;
        let api = RestApi::builder(&(mock_server.uri() + "/w/rest.php"))
            .unwrap()
            .build();

        let id = EntityId::item(id);
        let description = Description::get_with_fallback(&id, "foo", &api)
            .await
            .unwrap();
        assert_eq!(description.language(), "foo");
        assert_eq!(description.value(), "Douglas Adams");
    }

    #[tokio::test]
    #[cfg_attr(miri, ignore)]
    async fn test_description_get() {
        let id = "Q42";
        let mock_description = "Foo bar baz";
        let mock_path = format!("/w/rest.php/wikibase/v1/entities/items/{id}/descriptions/en");
        let mock_server = MockServer::start().await;
        Mock::given(method("GET"))
            .and(path(&mock_path))
            .respond_with(ResponseTemplate::new(200).set_body_json(mock_description))
            .mount(&mock_server)
            .await;
        let api = RestApi::builder(&(mock_server.uri() + "/w/rest.php"))
            .unwrap()
            .build();

        let id = EntityId::item(id);
        let description = Description::get(&id, "en", &api).await.unwrap();
        assert_eq!(description.language(), "en");
        assert_eq!(description.value(), mock_description);
    }

    #[tokio::test]
    #[cfg_attr(miri, ignore)]
    async fn test_description_put() {
        let description = "Foo bar baz";
        let id = "Q42";
        let mock_path = format!("/w/rest.php/wikibase/v1/entities/items/{id}/descriptions/en");
        let mock_server = MockServer::start().await;
        let token = "FAKE_TOKEN";
        Mock::given(body_partial_json(json!({"description": description})))
            .and(method("PUT"))
            .and(path(&mock_path))
            .and(bearer_token(token))
            .respond_with(ResponseTemplate::new(200).set_body_json(json!(description)))
            .mount(&mock_server)
            .await;
        let mut api = RestApi::builder(&(mock_server.uri() + "/w/rest.php"))
            .unwrap()
            .with_access_token(token)
            .build();

        let id = EntityId::item(id);
        let new_description = Description::new("en", description);
        let return_description = new_description.put(&id, &mut api).await.unwrap();
        assert_eq!(return_description.language(), "en");
        assert_eq!(return_description.value(), description);
    }

    #[tokio::test]
    #[cfg_attr(miri, ignore)]
    async fn test_description_delete() {
        let id = "Q42";
        let mock_path = format!("/w/rest.php/wikibase/v1/entities/items/{id}/descriptions/en");
        let mock_server = MockServer::start().await;
        let token = "FAKE_TOKEN";
        Mock::given(method("DELETE"))
            .and(path(&mock_path))
            .and(bearer_token(token))
            .respond_with(ResponseTemplate::new(200).set_body_json(json!("Description deleted")))
            .mount(&mock_server)
            .await;
        let mut api = RestApi::builder(&(mock_server.uri() + "/w/rest.php"))
            .unwrap()
            .with_access_token(token)
            .build();

        let id = EntityId::item(id);
        let description = Description::new("en", "");
        let result = description.delete(&id, &mut api).await;
        assert!(result.is_ok());
    }

    #[test]
    fn test_from() {
        let ls = LanguageString::new("en", "Foo bar baz");
        let description = Description::from(ls);
        assert_eq!(description.language(), "en");
        assert_eq!(description.value(), "Foo bar baz");
    }

    #[test]
    fn test_into() {
        let description = Description::new("en", "Foo bar baz");
        let ls: LanguageString = description.into();
        assert_eq!(ls.language(), "en");
        assert_eq!(ls.value(), "Foo bar baz");
    }
}