tmdb_api/configuration/
languages.rs

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