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