tmdb_api/movie/
images.rs

1use crate::{client::Executor, common::image::Image};
2
3pub type Params<'a> = crate::common::LanguageParams<'a>;
4
5#[derive(Debug, Deserialize, Serialize)]
6pub struct GetMovieImagesResponse {
7    pub id: u64,
8    pub backdrops: Vec<Image>,
9    pub posters: Vec<Image>,
10    pub logos: Vec<Image>,
11}
12
13impl<E: Executor> crate::Client<E> {
14    /// Get movie images
15    ///
16    /// ```rust
17    /// use tmdb_api::client::Client;
18    /// use tmdb_api::client::reqwest::Client as ReqwestClient;
19    ///
20    /// #[tokio::main]
21    /// async fn main() {
22    ///     let client = Client::<ReqwestClient>::new("this-is-my-secret-token".into());
23    ///     match client.get_movie_images(42, &Default::default()).await {
24    ///         Ok(res) => println!("found: {:#?}", res),
25    ///         Err(err) => eprintln!("error: {:?}", err),
26    ///     };
27    /// }
28    /// ```
29    pub async fn get_movie_images(
30        &self,
31        movie_id: u64,
32        params: &Params<'_>,
33    ) -> crate::Result<GetMovieImagesResponse> {
34        let url = format!("/movie/{movie_id}/images");
35        self.execute(&url, params).await
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use mockito::Matcher;
42
43    use crate::client::Client;
44    use crate::client::reqwest::Client as ReqwestClient;
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/550/images")
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-images.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
64            .get_movie_images(550, &Default::default())
65            .await
66            .unwrap();
67        assert_eq!(result.id, 550);
68    }
69
70    #[tokio::test]
71    async fn invalid_api_key() {
72        let mut server = mockito::Server::new_async().await;
73        let _m = server
74            .mock("GET", "/movie/42/images")
75            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
76            .with_status(401)
77            .with_header("content-type", "application/json")
78            .with_body(include_str!("../../assets/invalid-api-key.json"))
79            .create_async()
80            .await;
81
82        let client = Client::<ReqwestClient>::builder()
83            .with_api_key("secret".into())
84            .with_base_url(server.url())
85            .build()
86            .unwrap();
87        let err = client
88            .get_movie_images(42, &Default::default())
89            .await
90            .unwrap_err();
91        let server_err = err.as_server_error().unwrap();
92        assert_eq!(server_err.status_code, 7);
93    }
94
95    #[tokio::test]
96    async fn resource_not_found() {
97        let mut server = mockito::Server::new_async().await;
98        let _m = server
99            .mock("GET", "/movie/42/images")
100            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
101            .with_status(404)
102            .with_header("content-type", "application/json")
103            .with_body(include_str!("../../assets/resource-not-found.json"))
104            .create_async()
105            .await;
106
107        let client = Client::<ReqwestClient>::builder()
108            .with_api_key("secret".into())
109            .with_base_url(server.url())
110            .build()
111            .unwrap();
112        let err = client
113            .get_movie_images(42, &Default::default())
114            .await
115            .unwrap_err();
116        let server_err = err.as_server_error().unwrap();
117        assert_eq!(server_err.status_code, 34);
118    }
119}
120
121#[cfg(all(test, feature = "integration"))]
122mod integration_tests {
123    use crate::client::Client;
124    use crate::client::reqwest::Client as ReqwestClient;
125
126    #[tokio::test]
127    async fn execute() {
128        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
129        let client = Client::<ReqwestClient>::new(secret);
130        let result = client
131            .get_movie_images(550, &Default::default())
132            .await
133            .unwrap();
134        assert_eq!(result.id, 550);
135    }
136}