tmdb_api/configuration/
countries.rs1use crate::client::Executor;
4
5pub type Params<'a> = crate::common::LanguageParams<'a>;
6
7#[derive(Debug, Deserialize)]
8pub struct Country {
9 pub iso_3166_1: String,
10 pub english_name: String,
11 pub native_name: String,
12}
13
14impl<E: Executor> crate::Client<E> {
15 pub async fn list_countries(&self, params: &Params<'_>) -> crate::Result<Vec<Country>> {
31 self.execute::<Vec<Country>, _>("/configuration/countries", params)
32 .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 m = server
47 .mock("GET", "/configuration/countries")
48 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
49 .with_status(200)
50 .with_header("content-type", "application/json")
51 .with_body(include_str!("../../assets/configuration-countries.json"))
52 .create_async()
53 .await;
54
55 let client = Client::<ReqwestExecutor>::builder()
56 .with_api_key("secret".into())
57 .with_base_url(server.url())
58 .build()
59 .unwrap();
60 let result = client.list_countries(&Default::default()).await.unwrap();
61 assert!(!result.is_empty());
62
63 m.assert_async().await;
64 }
65
66 #[tokio::test]
67 async fn invalid_api_key() {
68 let mut server = mockito::Server::new_async().await;
69 let m = server
70 .mock("GET", "/configuration/countries")
71 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
72 .with_status(401)
73 .with_header("content-type", "application/json")
74 .with_body(include_str!("../../assets/invalid-api-key.json"))
75 .create_async()
76 .await;
77
78 let client = Client::<ReqwestExecutor>::builder()
79 .with_api_key("secret".into())
80 .with_base_url(server.url())
81 .build()
82 .unwrap();
83
84 let err = client
85 .list_countries(&Default::default())
86 .await
87 .unwrap_err();
88 let server_err = err.as_server_error().unwrap();
89 assert_eq!(server_err.status_code, 7);
90
91 m.assert_async().await;
92 }
93
94 #[tokio::test]
95 async fn resource_not_found() {
96 let mut server = mockito::Server::new_async().await;
97 let m = server
98 .mock("GET", "/configuration/countries")
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 client = Client::<ReqwestExecutor>::builder()
107 .with_api_key("secret".into())
108 .with_base_url(server.url())
109 .build()
110 .unwrap();
111
112 let err = client
113 .list_countries(&Default::default())
114 .await
115 .unwrap_err();
116 let server_err = err.as_server_error().unwrap();
117 assert_eq!(server_err.status_code, 34);
118
119 m.assert_async().await;
120 }
121}
122
123#[cfg(all(test, feature = "integration"))]
124mod integration_tests {
125 use crate::Client;
126 use crate::client::reqwest::ReqwestExecutor;
127
128 #[tokio::test]
129 async fn execute() {
130 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
131 let client = Client::<ReqwestExecutor>::new(secret);
132 let result = client.list_countries(&Default::default()).await.unwrap();
133 assert!(!result.is_empty());
134 }
135}