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 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}