tmdb_api/certification/
list.rs1use std::collections::HashMap;
5
6use crate::client::Executor;
7
8use super::Certification;
9
10const TV_PATH: &str = "/certification/tv/list";
11const MOVIE_PATH: &str = "/certification/movie/list";
12
13#[derive(Clone, Debug, Deserialize)]
14pub struct Response {
15 pub certifications: HashMap<String, Vec<Certification>>,
16}
17
18impl<E: Executor> crate::Client<E> {
19 pub async fn list_movie_certifications(&self) -> crate::Result<Response> {
35 self.execute(MOVIE_PATH, &()).await
36 }
37
38 pub async fn list_tvshow_certifications(&self) -> crate::Result<Response> {
54 self.execute(TV_PATH, &()).await
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use mockito::Matcher;
61
62 use crate::Client;
63 use crate::client::reqwest::ReqwestExecutor;
64
65 #[tokio::test]
66 async fn tv_works() {
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", super::TV_PATH)
76 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
77 .with_status(200)
78 .with_header("content-type", "application/json")
79 .with_body(include_str!("../../assets/certification-tv-list.json"))
80 .create_async()
81 .await;
82 let result = client.list_tvshow_certifications().await.unwrap();
83 assert!(!result.certifications.is_empty());
84 m.assert_async().await;
85 }
86
87 #[tokio::test]
88 async fn movie_works() {
89 let mut server = mockito::Server::new_async().await;
90 let client = Client::<ReqwestExecutor>::builder()
91 .with_api_key("secret".into())
92 .with_base_url(server.url())
93 .build()
94 .unwrap();
95
96 let m = server
97 .mock("GET", super::MOVIE_PATH)
98 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
99 .with_status(200)
100 .with_header("content-type", "application/json")
101 .with_body(include_str!("../../assets/certification-movie-list.json"))
102 .create_async()
103 .await;
104 let result = client.list_movie_certifications().await.unwrap();
105 assert!(!result.certifications.is_empty());
106 m.assert_async().await;
107 }
108
109 #[tokio::test]
110 async fn invalid_api_key() {
111 let mut server = mockito::Server::new_async().await;
112 let client = Client::<ReqwestExecutor>::builder()
113 .with_api_key("secret".into())
114 .with_base_url(server.url())
115 .build()
116 .unwrap();
117
118 let _m = server
119 .mock("GET", super::TV_PATH)
120 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
121 .with_status(401)
122 .with_header("content-type", "application/json")
123 .with_body(include_str!("../../assets/invalid-api-key.json"))
124 .create_async()
125 .await;
126
127 let err = client.list_tvshow_certifications().await.unwrap_err();
128 let server_err = err.as_server_error().unwrap();
129 assert_eq!(server_err.status_code, 7);
130 }
131
132 #[tokio::test]
133 async fn resource_not_found() {
134 let mut server = mockito::Server::new_async().await;
135 let client = Client::<ReqwestExecutor>::builder()
136 .with_api_key("secret".into())
137 .with_base_url(server.url())
138 .build()
139 .unwrap();
140
141 let _m = server
142 .mock("GET", super::TV_PATH)
143 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
144 .with_status(404)
145 .with_header("content-type", "application/json")
146 .with_body(include_str!("../../assets/resource-not-found.json"))
147 .create_async()
148 .await;
149
150 let err = client.list_tvshow_certifications().await.unwrap_err();
151 let server_err = err.as_server_error().unwrap();
152 assert_eq!(server_err.status_code, 34);
153 }
154}
155
156#[cfg(all(test, feature = "integration"))]
157mod integration_tests {
158 use crate::client::Client;
159 use crate::client::reqwest::ReqwestExecutor;
160
161 #[tokio::test]
162 async fn execute_tv() {
163 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
164 let client = Client::<ReqwestExecutor>::new(secret);
165 let result = client.list_tvshow_certifications().await.unwrap();
166 assert!(!result.certifications.is_empty());
167 }
168
169 #[tokio::test]
170 async fn execute_movie() {
171 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
172 let client = Client::<ReqwestExecutor>::new(secret);
173 let result = client.list_movie_certifications().await.unwrap();
174 assert!(!result.certifications.is_empty());
175 }
176}