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
8    /// example: en,null
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub include_image_language: Option<Cow<'a, str>>,
11    /// ISO 639-1 value to display translated data for the fields that support
12    /// it.
13    #[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    /// Get tvshow images
47    ///
48    /// ```rust
49    /// use tmdb_api::client::Client;
50    /// use tmdb_api::client::reqwest::Client as ReqwestClient;
51    ///
52    /// #[tokio::main]
53    /// async fn main() {
54    ///     let client = Client::<ReqwestClient>::new("this-is-my-secret-token".into());
55    ///     match client.get_tvshow_images(42, &Default::default()).await {
56    ///         Ok(res) => println!("found: {:#?}", res),
57    ///         Err(err) => eprintln!("error: {:?}", err),
58    ///     };
59    /// }
60    /// ```
61    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}