tmdb_api/
certification.rs1use 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 pub async fn list_movie_certifications(&self) -> crate::Result<Response> {
40 self.execute(MOVIE_PATH, &()).await
41 }
42
43 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}