tmdb_api/configuration/
countries.rs

1//! https://developer.themoviedb.org/reference/configuration-countries
2
3use crate::client::Executor;
4
5pub type Params<'a> = crate::common::LanguageParams<'a>;
6
7#[derive(Debug, Deserialize)]
8pub struct Country {
9    pub iso_3166_1: String,
10    pub english_name: String,
11    pub native_name: String,
12}
13
14impl<E: Executor> crate::Client<E> {
15    /// Get a list of all jobs
16    ///
17    /// ```rust
18    /// use tmdb_api::client::Client;
19    /// use tmdb_api::client::reqwest::ReqwestExecutor;
20    ///
21    /// #[tokio::main]
22    /// async fn main() {
23    ///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
24    ///     match client.list_countries(&Default::default()).await {
25    ///         Ok(res) => println!("found: {:#?}", res),
26    ///         Err(err) => eprintln!("error: {:?}", err),
27    ///     };
28    /// }
29    /// ```
30    pub async fn list_countries(&self, params: &Params<'_>) -> crate::Result<Vec<Country>> {
31        self.execute::<Vec<Country>, _>("/configuration/countries", params)
32            .await
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use mockito::Matcher;
39
40    use crate::Client;
41    use crate::client::reqwest::ReqwestExecutor;
42
43    #[tokio::test]
44    async fn it_works() {
45        let mut server = mockito::Server::new_async().await;
46        let m = server
47            .mock("GET", "/configuration/countries")
48            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
49            .with_status(200)
50            .with_header("content-type", "application/json")
51            .with_body(include_str!("../../assets/configuration-countries.json"))
52            .create_async()
53            .await;
54
55        let client = Client::<ReqwestExecutor>::builder()
56            .with_api_key("secret".into())
57            .with_base_url(server.url())
58            .build()
59            .unwrap();
60        let result = client.list_countries(&Default::default()).await.unwrap();
61        assert!(!result.is_empty());
62
63        m.assert_async().await;
64    }
65
66    #[tokio::test]
67    async fn invalid_api_key() {
68        let mut server = mockito::Server::new_async().await;
69        let m = server
70            .mock("GET", "/configuration/countries")
71            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
72            .with_status(401)
73            .with_header("content-type", "application/json")
74            .with_body(include_str!("../../assets/invalid-api-key.json"))
75            .create_async()
76            .await;
77
78        let client = Client::<ReqwestExecutor>::builder()
79            .with_api_key("secret".into())
80            .with_base_url(server.url())
81            .build()
82            .unwrap();
83
84        let err = client
85            .list_countries(&Default::default())
86            .await
87            .unwrap_err();
88        let server_err = err.as_server_error().unwrap();
89        assert_eq!(server_err.status_code, 7);
90
91        m.assert_async().await;
92    }
93
94    #[tokio::test]
95    async fn resource_not_found() {
96        let mut server = mockito::Server::new_async().await;
97        let m = server
98            .mock("GET", "/configuration/countries")
99            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
100            .with_status(404)
101            .with_header("content-type", "application/json")
102            .with_body(include_str!("../../assets/resource-not-found.json"))
103            .create_async()
104            .await;
105
106        let client = Client::<ReqwestExecutor>::builder()
107            .with_api_key("secret".into())
108            .with_base_url(server.url())
109            .build()
110            .unwrap();
111
112        let err = client
113            .list_countries(&Default::default())
114            .await
115            .unwrap_err();
116        let server_err = err.as_server_error().unwrap();
117        assert_eq!(server_err.status_code, 34);
118
119        m.assert_async().await;
120    }
121}
122
123#[cfg(all(test, feature = "integration"))]
124mod integration_tests {
125    use crate::Client;
126    use crate::client::reqwest::ReqwestExecutor;
127
128    #[tokio::test]
129    async fn execute() {
130        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
131        let client = Client::<ReqwestExecutor>::new(secret);
132        let result = client.list_countries(&Default::default()).await.unwrap();
133        assert!(!result.is_empty());
134    }
135}