1use crate::client::Executor;
2
3pub type Params<'a> = crate::common::LanguageParams<'a>;
4
5impl<E: Executor> crate::Client<E> {
6 pub async fn get_latest_movie(&self, params: &Params<'_>) -> crate::Result<super::Movie> {
22 self.execute("/movie/latest", params).await
23 }
24}
25
26#[cfg(test)]
27mod tests {
28 use mockito::Matcher;
29
30 use crate::client::Client;
31 use crate::client::reqwest::Client as ReqwestClient;
32
33 #[tokio::test]
34 async fn it_works() {
35 let mut server = mockito::Server::new_async().await;
36 let _m = server
37 .mock("GET", "/movie/latest")
38 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
39 .with_status(200)
40 .with_header("content-type", "application/json")
41 .with_body(include_str!("../../assets/movie-latest.json"))
42 .create_async()
43 .await;
44
45 let client = Client::<ReqwestClient>::builder()
46 .with_api_key("secret".into())
47 .with_base_url(server.url())
48 .build()
49 .unwrap();
50 let result = client.get_latest_movie(&Default::default()).await.unwrap();
51 assert_eq!(result.inner.id, 1236474);
52 }
53
54 #[tokio::test]
55 async fn invalid_api_key() {
56 let mut server = mockito::Server::new_async().await;
57 let _m = server
58 .mock("GET", "/movie/latest")
59 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
60 .with_status(401)
61 .with_header("content-type", "application/json")
62 .with_body(include_str!("../../assets/invalid-api-key.json"))
63 .create_async()
64 .await;
65
66 let client = Client::<ReqwestClient>::builder()
67 .with_api_key("secret".into())
68 .with_base_url(server.url())
69 .build()
70 .unwrap();
71
72 let err = client
73 .get_latest_movie(&Default::default())
74 .await
75 .unwrap_err();
76 let server_err = err.as_server_error().unwrap();
77 assert_eq!(server_err.status_code, 7);
78 }
79
80 #[tokio::test]
81 async fn resource_not_found() {
82 let mut server = mockito::Server::new_async().await;
83
84 let _m = server
85 .mock("GET", "/movie/latest")
86 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
87 .with_status(404)
88 .with_header("content-type", "application/json")
89 .with_body(include_str!("../../assets/resource-not-found.json"))
90 .create_async()
91 .await;
92
93 let client = Client::<ReqwestClient>::builder()
94 .with_api_key("secret".into())
95 .with_base_url(server.url())
96 .build()
97 .unwrap();
98
99 let err = client
100 .get_latest_movie(&Default::default())
101 .await
102 .unwrap_err();
103 let server_err = err.as_server_error().unwrap();
104 assert_eq!(server_err.status_code, 34);
105 }
106}
107
108#[cfg(all(test, feature = "integration"))]
109mod integration_tests {
110 use crate::client::Client;
111 use crate::client::reqwest::Client as ReqwestClient;
112
113 #[tokio::test]
114 async fn execute() {
115 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
116 let client = Client::<ReqwestClient>::new(secret);
117 let _result = client.get_latest_movie(&Default::default()).await.unwrap();
118 }
119}