tmdb_api/movie/
external_ids.rs1use crate::client::Executor;
2
3#[derive(Debug, Deserialize)]
4pub struct MovieExternalIds {
5 pub id: u64,
6 #[serde(deserialize_with = "crate::util::empty_string::deserialize")]
7 pub imdb_id: Option<String>,
8 #[serde(deserialize_with = "crate::util::empty_string::deserialize")]
9 pub wikidata_id: Option<String>,
10 #[serde(deserialize_with = "crate::util::empty_string::deserialize")]
11 pub facebook_id: Option<String>,
12 #[serde(deserialize_with = "crate::util::empty_string::deserialize")]
13 pub instagram_id: Option<String>,
14 #[serde(deserialize_with = "crate::util::empty_string::deserialize")]
15 pub twitter_id: Option<String>,
16}
17
18impl<E: Executor> crate::Client<E> {
19 pub async fn get_movie_external_ids(&self, movie_id: u64) -> crate::Result<MovieExternalIds> {
35 let url = format!("/movie/{movie_id}/external_ids");
36 self.execute(&url, &()).await
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use crate::client::Client;
43 use crate::client::reqwest::Client as ReqwestClient;
44 use mockito::Matcher;
45
46 #[tokio::test]
47 async fn it_works() {
48 let mut server = mockito::Server::new_async().await;
49 let m = server
50 .mock("GET", "/movie/335984/external_ids")
51 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
52 .with_status(200)
53 .with_header("content-type", "application/json")
54 .with_body(include_str!("../../assets/movie-external-ids.json"))
55 .create_async()
56 .await;
57
58 let client = Client::<ReqwestClient>::builder()
59 .with_api_key("secret".into())
60 .with_base_url(server.url())
61 .build()
62 .unwrap();
63 let result = client.get_movie_external_ids(335984).await.unwrap();
64 assert_eq!(result.id, 550);
65
66 m.assert_async().await;
67 }
68
69 #[tokio::test]
70 async fn invalid_api_key() {
71 let mut server = mockito::Server::new_async().await;
72 let m = server
73 .mock("GET", "/movie/42/external_ids")
74 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
75 .with_status(401)
76 .with_header("content-type", "application/json")
77 .with_body(include_str!("../../assets/invalid-api-key.json"))
78 .create_async()
79 .await;
80
81 let client = Client::<ReqwestClient>::builder()
82 .with_api_key("secret".into())
83 .with_base_url(server.url())
84 .build()
85 .unwrap();
86 let err = client.get_movie_external_ids(42).await.unwrap_err();
87 let server_err = err.as_server_error().unwrap();
88 assert_eq!(server_err.status_code, 7);
89
90 m.assert_async().await;
91 }
92
93 #[tokio::test]
94 async fn resource_not_found() {
95 let mut server = mockito::Server::new_async().await;
96 let m = server
97 .mock("GET", "/movie/42/external_ids")
98 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
99 .with_status(404)
100 .with_header("content-type", "application/json")
101 .with_body(include_str!("../../assets/resource-not-found.json"))
102 .create_async()
103 .await;
104
105 let client = Client::<ReqwestClient>::builder()
106 .with_api_key("secret".into())
107 .with_base_url(server.url())
108 .build()
109 .unwrap();
110 let err = client.get_movie_external_ids(42).await.unwrap_err();
111 let server_err = err.as_server_error().unwrap();
112 assert_eq!(server_err.status_code, 34);
113
114 m.assert_async().await;
115 }
116}
117
118#[cfg(all(test, feature = "integration"))]
119mod integration_tests {
120 use crate::client::Client;
121 use crate::client::reqwest::Client as ReqwestClient;
122
123 #[tokio::test]
124 async fn execute() {
125 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
126 let client = Client::<ReqwestClient>::new(secret);
127 let result = client.get_movie_external_ids(335984).await.unwrap();
128 assert_eq!(result.id, 335984);
129 }
130}