tmdb_api/certification/
list.rs

1//! https://developer.themoviedb.org/reference/certification-movie-list
2//! https://developer.themoviedb.org/reference/certifications-tv-list
3
4use std::collections::HashMap;
5
6use crate::client::Executor;
7
8use super::Certification;
9
10const TV_PATH: &str = "/certification/tv/list";
11const MOVIE_PATH: &str = "/certification/movie/list";
12
13#[derive(Clone, Debug, Deserialize)]
14pub struct Response {
15    pub certifications: HashMap<String, Vec<Certification>>,
16}
17
18impl<E: Executor> crate::Client<E> {
19    /// Get an up to date list of the officially supported movie certifications on TMDB
20    ///
21    /// ```rust
22    /// use tmdb_api::Client;
23    /// use tmdb_api::client::reqwest::ReqwestExecutor;
24    ///
25    /// #[tokio::main]
26    /// async fn main() {
27    ///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
28    ///     match client.list_movie_certifications().await {
29    ///         Ok(res) => println!("found: {:#?}", res),
30    ///         Err(err) => eprintln!("error: {:?}", err),
31    ///     };
32    /// }
33    /// ```
34    pub async fn list_movie_certifications(&self) -> crate::Result<Response> {
35        self.execute(MOVIE_PATH, &()).await
36    }
37
38    /// Get an up to date list of the officially supported tv show certifications on TMDB
39    ///
40    /// ```rust
41    /// use tmdb_api::Client;
42    /// use tmdb_api::client::reqwest::ReqwestExecutor;
43    ///
44    /// #[tokio::main]
45    /// async fn main() {
46    ///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
47    ///     match client.list_tvshow_certifications().await {
48    ///         Ok(res) => println!("found: {:#?}", res),
49    ///         Err(err) => eprintln!("error: {:?}", err),
50    ///     };
51    /// }
52    /// ```
53    pub async fn list_tvshow_certifications(&self) -> crate::Result<Response> {
54        self.execute(TV_PATH, &()).await
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use mockito::Matcher;
61
62    use crate::Client;
63    use crate::client::reqwest::ReqwestExecutor;
64
65    #[tokio::test]
66    async fn tv_works() {
67        let mut server = mockito::Server::new_async().await;
68        let client = Client::<ReqwestExecutor>::builder()
69            .with_api_key("secret".into())
70            .with_base_url(server.url())
71            .build()
72            .unwrap();
73
74        let m = server
75            .mock("GET", super::TV_PATH)
76            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
77            .with_status(200)
78            .with_header("content-type", "application/json")
79            .with_body(include_str!("../../assets/certification-tv-list.json"))
80            .create_async()
81            .await;
82        let result = client.list_tvshow_certifications().await.unwrap();
83        assert!(!result.certifications.is_empty());
84        m.assert_async().await;
85    }
86
87    #[tokio::test]
88    async fn movie_works() {
89        let mut server = mockito::Server::new_async().await;
90        let client = Client::<ReqwestExecutor>::builder()
91            .with_api_key("secret".into())
92            .with_base_url(server.url())
93            .build()
94            .unwrap();
95
96        let m = server
97            .mock("GET", super::MOVIE_PATH)
98            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
99            .with_status(200)
100            .with_header("content-type", "application/json")
101            .with_body(include_str!("../../assets/certification-movie-list.json"))
102            .create_async()
103            .await;
104        let result = client.list_movie_certifications().await.unwrap();
105        assert!(!result.certifications.is_empty());
106        m.assert_async().await;
107    }
108
109    #[tokio::test]
110    async fn invalid_api_key() {
111        let mut server = mockito::Server::new_async().await;
112        let client = Client::<ReqwestExecutor>::builder()
113            .with_api_key("secret".into())
114            .with_base_url(server.url())
115            .build()
116            .unwrap();
117
118        let _m = server
119            .mock("GET", super::TV_PATH)
120            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
121            .with_status(401)
122            .with_header("content-type", "application/json")
123            .with_body(include_str!("../../assets/invalid-api-key.json"))
124            .create_async()
125            .await;
126
127        let err = client.list_tvshow_certifications().await.unwrap_err();
128        let server_err = err.as_server_error().unwrap();
129        assert_eq!(server_err.status_code, 7);
130    }
131
132    #[tokio::test]
133    async fn resource_not_found() {
134        let mut server = mockito::Server::new_async().await;
135        let client = Client::<ReqwestExecutor>::builder()
136            .with_api_key("secret".into())
137            .with_base_url(server.url())
138            .build()
139            .unwrap();
140
141        let _m = server
142            .mock("GET", super::TV_PATH)
143            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
144            .with_status(404)
145            .with_header("content-type", "application/json")
146            .with_body(include_str!("../../assets/resource-not-found.json"))
147            .create_async()
148            .await;
149
150        let err = client.list_tvshow_certifications().await.unwrap_err();
151        let server_err = err.as_server_error().unwrap();
152        assert_eq!(server_err.status_code, 34);
153    }
154}
155
156#[cfg(all(test, feature = "integration"))]
157mod integration_tests {
158    use crate::client::Client;
159    use crate::client::reqwest::ReqwestExecutor;
160
161    #[tokio::test]
162    async fn execute_tv() {
163        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
164        let client = Client::<ReqwestExecutor>::new(secret);
165        let result = client.list_tvshow_certifications().await.unwrap();
166        assert!(!result.certifications.is_empty());
167    }
168
169    #[tokio::test]
170    async fn execute_movie() {
171        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
172        let client = Client::<ReqwestExecutor>::new(secret);
173        let result = client.list_movie_certifications().await.unwrap();
174        assert!(!result.certifications.is_empty());
175    }
176}