tmdb_api/tvshow/
content_rating.rs1use 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 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::ReqwestExecutor;
42
43 #[tokio::test]
44 async fn it_works() {
45 let mut server = mockito::Server::new_async().await;
46 let client = Client::<ReqwestExecutor>::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::<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", "/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::<ReqwestExecutor>::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::ReqwestExecutor;
116
117 #[tokio::test]
118 async fn execute() {
119 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
120 let client = Client::<ReqwestExecutor>::new(secret);
121
122 let result = client.get_tvshow_content_ratings(1399).await.unwrap();
123 assert!(!result.results.is_empty());
124 }
125}