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