tmdb_api/movie/
images.rs

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