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> {
41 self.execute(MOVIE_PATH, &()).await
42 }
43
44 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}