tmdb_api/tvshow/
images.rs

1use std::borrow::Cow;
2
3use crate::common::image::Image;
4
5#[derive(Clone, Debug, Default, Serialize)]
6pub struct Params<'a> {
7    /// specify a comma separated list of ISO-639-1 values to query, for example: en,null
8    #[serde(skip_serializing_if = "Option::is_none")]
9    pub include_image_language: Option<Cow<'a, str>>,
10    /// ISO 639-1 value to display translated data for the fields that support it.
11    #[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    /// Get tvshow images
45    ///
46    /// ```rust
47    /// use tmdb_api::client::Client;
48    /// use tmdb_api::client::reqwest::Client as ReqwestClient;
49    ///
50    /// #[tokio::main]
51    /// async fn main() {
52    ///     let client = Client::<ReqwestClient>::new("this-is-my-secret-token".into());
53    ///     match client.get_tvshow_images(42, &Default::default()).await {
54    ///         Ok(res) => println!("found: {:#?}", res),
55    ///         Err(err) => eprintln!("error: {:?}", err),
56    ///     };
57    /// }
58    /// ```
59    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::Client as ReqwestClient;
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::<ReqwestClient>::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::<ReqwestClient>::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::<ReqwestClient>::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::Client as ReqwestClient;
154
155    #[tokio::test]
156    async fn execute() {
157        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
158        let client = Client::<ReqwestClient>::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}