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