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