tmdb_api/tvshow/
content_rating.rs

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