scryfall_sdk_rust 0.1.1

A light wrapper (SDK) for Scryfall API (https://scryfall.com/docs/api)
Documentation
use httpmock::Method::GET;
use httpmock::MockServer;
use indoc::indoc;
use rstest::{fixture, rstest};
use url::Url;

use scryfall_sdk_rust::{
    Scryfall,
    ScryfallBlocking,
    HttpResource,
    resources::{
        catalog::Catalog,
        catalog::CatalogResource,
        ResourceKind
    }
};

#[fixture]
#[once]
fn response() -> String {
    indoc!(r#"
    {
      "object": "catalog",
      "uri": "https://some-url.com",
      "total_values": 3,
      "data": [
        "SomeValue",
        "SomeValue",
        "SomeValue"
      ]
    }
    "#).into()
}

#[fixture]
#[once]
fn catalog() -> Catalog {
    Catalog {
        kind: ResourceKind::Catalog,
        uri: Some("https://some-url.com".parse::<Url>().unwrap()),
        total_values: 3,
        data: vec!["SomeValue".into(), "SomeValue".into(), "SomeValue".into()]
    }
}

#[rstest]
#[case::ability_words(CatalogResource::AbilityWords)]
#[case::artifact_types(CatalogResource::ArtifactTypes)]
#[case::artist_names(CatalogResource::ArtistNames)]
#[case::card_names(CatalogResource::CardNames)]
#[case::creature_types(CatalogResource::CreatureTypes)]
#[case::enchantment_types(CatalogResource::EnchantmentTypes)]
#[case::keyword_abilities(CatalogResource::KeywordAbilities)]
#[case::keyword_actions(CatalogResource::KeywordActions)]
#[case::land_types(CatalogResource::LandTypes)]
#[case::loyalties(CatalogResource::Loyalties)]
#[case::planeswalker_types(CatalogResource::PlaneswalkerTypes)]
#[case::powers(CatalogResource::Powers)]
#[case::spell_types(CatalogResource::SpellTypes)]
#[case::toughnesses(CatalogResource::Toughnesses)]
#[case::watermarks(CatalogResource::Watermarks)]
#[case::word_bank(CatalogResource::WordBank)]
fn test_blocking_request(response: &String, catalog: &Catalog, #[case]resource: CatalogResource) {
    let server = MockServer::start();

    let endpoint = server.mock(|when, then| {
        when.method(GET).path(format!("/{}", resource.path()));
        then.status(200)
            .header("content-type", "application/json")
            .body(response);
    });

    let url = server.base_url();
    let client = ScryfallBlocking::from_url(&url);

    let response = client
        .request(&resource)
        .expect("Expected a valid Catalog response");

    endpoint.assert();
    assert_eq!(catalog, &response)
}

#[rstest]
#[case::ability_words(CatalogResource::AbilityWords)]
#[case::artifact_types(CatalogResource::ArtifactTypes)]
#[case::artist_names(CatalogResource::ArtistNames)]
#[case::card_names(CatalogResource::CardNames)]
#[case::creature_types(CatalogResource::CreatureTypes)]
#[case::enchantment_types(CatalogResource::EnchantmentTypes)]
#[case::keyword_abilities(CatalogResource::KeywordAbilities)]
#[case::keyword_actions(CatalogResource::KeywordActions)]
#[case::land_types(CatalogResource::LandTypes)]
#[case::loyalties(CatalogResource::Loyalties)]
#[case::planeswalker_types(CatalogResource::PlaneswalkerTypes)]
#[case::powers(CatalogResource::Powers)]
#[case::spell_types(CatalogResource::SpellTypes)]
#[case::toughnesses(CatalogResource::Toughnesses)]
#[case::watermarks(CatalogResource::Watermarks)]
#[case::word_bank(CatalogResource::WordBank)]
#[tokio::test]
async fn test_async_request(response: &String, catalog: &Catalog, #[case]resource: CatalogResource) {
    let server = MockServer::start_async().await;

    let endpoint = server.mock(|when, then| {
        when.method(GET).path(format!("/{}", resource.path()));
        then.status(200)
            .header("content-type", "application/json")
            .body(response);
    });

    let url = server.base_url();
    let client = Scryfall::from_url(&url);

    let response = client
        .request(&resource).await
        .expect("Expected a valid Catalog response");

    endpoint.assert();
    assert_eq!(catalog, &response)
}