tmdb_api/movie/
translations.rs1#[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 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 crate::client::Client;
51 use crate::client::reqwest::ReqwestExecutor;
52 use mockito::Matcher;
53
54 #[tokio::test]
55 async fn it_works() {
56 let mut server = mockito::Server::new_async().await;
57 let client = Client::<ReqwestExecutor>::builder()
58 .with_api_key("secret".into())
59 .with_base_url(server.url())
60 .build()
61 .unwrap();
62
63 let _m = server
64 .mock("GET", "/movie/550/translations")
65 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
66 .with_status(200)
67 .with_header("content-type", "application/json")
68 .with_body(include_str!("../../assets/movie-translations.json"))
69 .create_async()
70 .await;
71
72 let result = client.get_movie_translations(550).await.unwrap();
73 assert!(!result.translations.is_empty());
74 }
75
76 #[tokio::test]
77 async fn invalid_api_key() {
78 let mut server = mockito::Server::new_async().await;
79 let client = Client::<ReqwestExecutor>::builder()
80 .with_api_key("secret".into())
81 .with_base_url(server.url())
82 .build()
83 .unwrap();
84
85 let _m = server
86 .mock("GET", "/movie/550/translations")
87 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
88 .with_status(401)
89 .with_header("content-type", "application/json")
90 .with_body(include_str!("../../assets/invalid-api-key.json"))
91 .create_async()
92 .await;
93
94 let err = client.get_movie_translations(550).await.unwrap_err();
95 let server_err = err.as_server_error().unwrap();
96 assert_eq!(server_err.status_code, 7);
97 }
98
99 #[tokio::test]
100 async fn resource_not_found() {
101 let mut server = mockito::Server::new_async().await;
102 let client = Client::<ReqwestExecutor>::builder()
103 .with_api_key("secret".into())
104 .with_base_url(server.url())
105 .build()
106 .unwrap();
107
108 let _m = server
109 .mock("GET", "/movie/550/translations")
110 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
111 .with_status(404)
112 .with_header("content-type", "application/json")
113 .with_body(include_str!("../../assets/resource-not-found.json"))
114 .create_async()
115 .await;
116
117 let err = client.get_movie_translations(550).await.unwrap_err();
118 let server_err = err.as_server_error().unwrap();
119 assert_eq!(server_err.status_code, 34);
120 }
121}
122
123#[cfg(all(test, feature = "integration"))]
124mod integration_tests {
125 use crate::client::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
133 let result = client.get_movie_translations(550).await.unwrap();
134 assert!(!result.translations.is_empty());
135 assert_eq!(result.id, 550);
136 }
137}