tmdb_api/tvshow/
images.rs1use std::borrow::Cow;
2
3use crate::common::image::Image;
4
5#[derive(Clone, Debug, Default, Serialize)]
6pub struct Params<'a> {
7 #[serde(skip_serializing_if = "Option::is_none")]
10 pub include_image_language: Option<Cow<'a, str>>,
11 #[serde(skip_serializing_if = "Option::is_none")]
14 pub language: Option<Cow<'a, str>>,
15}
16
17impl<'a> Params<'a> {
18 pub fn set_include_image_language(&mut self, value: impl Into<Cow<'a, str>>) {
19 self.include_image_language = Some(value.into());
20 }
21
22 pub fn with_include_image_language(mut self, value: impl Into<Cow<'a, str>>) -> Self {
23 self.set_include_image_language(value);
24 self
25 }
26
27 pub fn set_language(&mut self, value: impl Into<Cow<'a, str>>) {
28 self.language = Some(value.into());
29 }
30
31 pub fn with_language(mut self, value: impl Into<Cow<'a, str>>) -> Self {
32 self.set_language(value);
33 self
34 }
35}
36
37#[derive(Debug, Deserialize, Serialize)]
38pub struct GetTVshowImagesResponse {
39 pub id: u64,
40 pub backdrops: Vec<Image>,
41 pub posters: Vec<Image>,
42 pub logos: Vec<Image>,
43}
44
45impl<E: crate::client::Executor> crate::Client<E> {
46 pub async fn get_tvshow_images(
62 &self,
63 tvshow_id: u64,
64 params: &Params<'_>,
65 ) -> crate::Result<GetTVshowImagesResponse> {
66 let url = format!("/tv/{tvshow_id}/images");
67 self.execute(&url, params).await
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use mockito::Matcher;
74
75 use crate::client::Client;
76 use crate::client::reqwest::Client as ReqwestClient;
77
78 #[tokio::test]
79 async fn it_works() {
80 let mut server = mockito::Server::new_async().await;
81 let client = Client::<ReqwestClient>::builder()
82 .with_api_key("secret".into())
83 .with_base_url(server.url())
84 .build()
85 .unwrap();
86
87 let _m = server
88 .mock("GET", "/tv/550/images")
89 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
90 .with_status(200)
91 .with_header("content-type", "application/json")
92 .with_body(include_str!("../../assets/tv-images.json"))
93 .create_async()
94 .await;
95 let result = client
96 .get_tvshow_images(550, &Default::default())
97 .await
98 .unwrap();
99 assert_eq!(result.id, 550);
100 }
101
102 #[tokio::test]
103 async fn invalid_api_key() {
104 let mut server = mockito::Server::new_async().await;
105 let client = Client::<ReqwestClient>::builder()
106 .with_api_key("secret".into())
107 .with_base_url(server.url())
108 .build()
109 .unwrap();
110
111 let _m = server
112 .mock("GET", "/tv/42/images")
113 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
114 .with_status(401)
115 .with_header("content-type", "application/json")
116 .with_body(include_str!("../../assets/invalid-api-key.json"))
117 .create_async()
118 .await;
119 let err = client
120 .get_tvshow_images(42, &Default::default())
121 .await
122 .unwrap_err();
123 let server_err = err.as_server_error().unwrap();
124 assert_eq!(server_err.status_code, 7);
125 }
126
127 #[tokio::test]
128 async fn resource_not_found() {
129 let mut server = mockito::Server::new_async().await;
130 let client = Client::<ReqwestClient>::builder()
131 .with_api_key("secret".into())
132 .with_base_url(server.url())
133 .build()
134 .unwrap();
135
136 let _m = server
137 .mock("GET", "/tv/42/images")
138 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
139 .with_status(404)
140 .with_header("content-type", "application/json")
141 .with_body(include_str!("../../assets/resource-not-found.json"))
142 .create_async()
143 .await;
144 let err = client
145 .get_tvshow_images(42, &Default::default())
146 .await
147 .unwrap_err();
148 let server_err = err.as_server_error().unwrap();
149 assert_eq!(server_err.status_code, 34);
150 }
151}
152
153#[cfg(all(test, feature = "integration"))]
154mod integration_tests {
155 use crate::client::Client;
156 use crate::client::reqwest::Client as ReqwestClient;
157
158 #[tokio::test]
159 async fn execute() {
160 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
161 let client = Client::<ReqwestClient>::new(secret);
162
163 let result = client
164 .get_tvshow_images(550, &Default::default())
165 .await
166 .unwrap();
167 assert_eq!(result.id, 550);
168 }
169}