tmdb_api/company/
images.rs

1use crate::client::Executor;
2
3#[derive(Clone, Debug, Deserialize, Serialize)]
4pub struct CompanyImage {
5    pub aspect_ratio: f64,
6    pub file_path: String,
7    pub height: u64,
8    pub width: u64,
9    pub id: String,
10    pub file_type: String,
11    pub vote_average: f64,
12    pub vote_count: u64,
13}
14
15#[derive(Clone, Debug, Deserialize)]
16pub struct Response {
17    pub logos: Vec<CompanyImage>,
18}
19
20impl<E: Executor> crate::Client<E> {
21    /// Get the company logos by id.
22    ///
23    /// ```rust
24    /// use tmdb_api::client::Client;
25    /// use tmdb_api::client::reqwest::ReqwestExecutor;
26    ///
27    /// #[tokio::main]
28    /// async fn main() {
29    ///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
30    ///     match client.get_company_images(1).await {
31    ///         Ok(res) => println!("found: {:#?}", res),
32    ///         Err(err) => eprintln!("error: {:?}", err),
33    ///     };
34    /// }
35    /// ```
36    pub async fn get_company_images(&self, company_id: u64) -> crate::Result<Response> {
37        let path = format!("/company/{company_id}/images");
38        self.execute(&path, &()).await
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use crate::client::Client;
45    use crate::client::reqwest::ReqwestExecutor;
46    use mockito::Matcher;
47
48    #[tokio::test]
49    async fn it_works() {
50        let mut server = mockito::Server::new_async().await;
51        let m = server
52            .mock("GET", "/company/1/images")
53            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
54            .with_status(200)
55            .with_header("content-type", "application/json")
56            .with_body(include_str!("../../assets/company-images.json"))
57            .create_async()
58            .await;
59
60        let client = Client::<ReqwestExecutor>::builder()
61            .with_api_key("secret".into())
62            .with_base_url(server.url())
63            .build()
64            .unwrap();
65        let result = client.get_company_images(1).await.unwrap();
66        assert_eq!(result.logos.len(), 2);
67
68        m.assert_async().await;
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", "/company/1/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::<ReqwestExecutor>::builder()
84            .with_api_key("secret".into())
85            .with_base_url(server.url())
86            .build()
87            .unwrap();
88        let err = client.get_company_images(1).await.unwrap_err();
89        let server_err = err.as_server_error().unwrap();
90        assert_eq!(server_err.status_code, 7);
91
92        m.assert_async().await;
93    }
94
95    #[tokio::test]
96    async fn resource_not_found() {
97        let mut server = mockito::Server::new_async().await;
98        let m = server
99            .mock("GET", "/company/1/images")
100            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
101            .with_status(404)
102            .with_header("content-type", "application/json")
103            .with_body(include_str!("../../assets/resource-not-found.json"))
104            .create_async()
105            .await;
106
107        let client = Client::<ReqwestExecutor>::builder()
108            .with_api_key("secret".into())
109            .with_base_url(server.url())
110            .build()
111            .unwrap();
112        let err = client.get_company_images(1).await.unwrap_err();
113        let server_err = err.as_server_error().unwrap();
114        assert_eq!(server_err.status_code, 34);
115
116        m.assert_async().await;
117    }
118}
119
120#[cfg(all(test, feature = "integration"))]
121mod integration_tests {
122    use crate::client::Client;
123    use crate::client::reqwest::ReqwestExecutor;
124
125    #[tokio::test]
126    async fn execute() {
127        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
128        let client = Client::<ReqwestExecutor>::new(secret);
129        let result = client.get_company_images(1).await.unwrap();
130        assert!(!result.logos.is_empty());
131    }
132}