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