tmdb_api/movie/
translations.rs

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