diff --git a/README.md b/README.md index 793030e..930902b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ rustup default stable Then run the service: ```bash -cargo run +cargo run --bin pokedex-api ``` The API listens on `0.0.0.0:5000` by default. diff --git a/src/clients/pokeapi.rs b/src/clients/pokeapi.rs index 8509395..4629236 100644 --- a/src/clients/pokeapi.rs +++ b/src/clients/pokeapi.rs @@ -25,7 +25,11 @@ impl PokeApiClient { #[instrument(skip(self), fields(pokemon.name = %name))] pub async fn get_pokemon_info(&self, name: &str) -> Result { validate_pokemon_name(name)?; - let url = format!("{}/pokemon-species/{}", self.base_url, name); + let url = format!( + "{}/pokemon-species/{}", + self.base_url, + name.to_ascii_lowercase() + ); let response = self .http .get(url) @@ -176,6 +180,32 @@ mod tests { assert!(pokemon.is_legendary); } + #[tokio::test] + async fn normalizes_pokemon_names_to_pokeapi_identifiers() { + let server = MockServer::start().await; + Mock::given(matchers::method("GET")) + .and(matchers::path("/pokemon-species/mewtwo")) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "name": "mewtwo", + "is_legendary": true, + "habitat": { "name": "rare" }, + "flavor_text_entries": [ + { "flavor_text": "Created by science.", "language": { "name": "en" } } + ] + }))) + .expect(1) + .mount(&server) + .await; + let client = client_for(&server); + + let pokemon = client + .get_pokemon_info("Mewtwo") + .await + .expect("mixed-case pokemon names should resolve"); + + assert_eq!(pokemon.name, "mewtwo"); + } + #[tokio::test] async fn uses_unknown_habitat_when_pokeapi_has_no_habitat() { let server = MockServer::start().await;