tmdb_api/movie/
external_ids.rs

1use 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    /// Get movie external ids
20    ///
21    /// ```rust
22    /// use tmdb_api::client::Client;
23    /// use tmdb_api::client::reqwest::ReqwestExecutor;
24    ///
25    /// #[tokio::main]
26    /// async fn main() {
27    ///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
28    ///     match client.get_movie_external_ids(42).await {
29    ///         Ok(res) => println!("found: {:#?}", res),
30    ///         Err(err) => eprintln!("error: {:?}", err),
31    ///     };
32    /// }
33    /// ```
34    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::ReqwestExecutor;
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::<ReqwestExecutor>::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::<ReqwestExecutor>::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::<ReqwestExecutor>::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::ReqwestExecutor;
122
123    #[tokio::test]
124    async fn execute() {
125        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
126        let client = Client::<ReqwestExecutor>::new(secret);
127        let result = client.get_movie_external_ids(335984).await.unwrap();
128        assert_eq!(result.id, 335984);
129    }
130}