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