tmdb_api/movie/
similar.rs1use crate::common::PaginatedResult;
2
3pub type Params<'a> = crate::common::LanguagePageParams<'a>;
4
5impl<E: crate::client::Executor> crate::Client<E> {
6 pub async fn get_similar_movies(
22 &self,
23 movie_id: u64,
24 params: &Params<'_>,
25 ) -> crate::Result<PaginatedResult<super::MovieShort>> {
26 let url = format!("/movie/{movie_id}/similar");
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 client = Client::<ReqwestClient>::builder()
42 .with_api_key("secret".into())
43 .with_base_url(server.url())
44 .build()
45 .unwrap();
46
47 let _m = server
48 .mock("GET", "/movie/42/similar")
49 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
50 .with_status(200)
51 .with_header("content-type", "application/json")
52 .with_body(include_str!("../../assets/movie-similar.json"))
53 .create_async()
54 .await;
55 let result = client
56 .get_similar_movies(42, &Default::default())
57 .await
58 .unwrap();
59 assert_eq!(result.page, 1);
60 assert!(!result.results.is_empty());
61 assert!(result.total_pages > 0);
62 assert!(result.total_results > 0);
63 let item = result.results.first().unwrap();
64 assert_eq!(item.inner.title, "The Asphalt Jungle");
65 }
66
67 #[tokio::test]
68 async fn invalid_api_key() {
69 let mut server = mockito::Server::new_async().await;
70 let client = Client::<ReqwestClient>::builder()
71 .with_api_key("secret".into())
72 .with_base_url(server.url())
73 .build()
74 .unwrap();
75
76 let _m = server
77 .mock("GET", "/movie/42/similar")
78 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
79 .with_status(401)
80 .with_header("content-type", "application/json")
81 .with_body(include_str!("../../assets/invalid-api-key.json"))
82 .create_async()
83 .await;
84 let err = client
85 .get_similar_movies(42, &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
92 #[tokio::test]
93 async fn resource_not_found() {
94 let mut server = mockito::Server::new_async().await;
95 let client = Client::<ReqwestClient>::builder()
96 .with_api_key("secret".into())
97 .with_base_url(server.url())
98 .build()
99 .unwrap();
100
101 let _m = server
102 .mock("GET", "/movie/42/similar")
103 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
104 .with_status(404)
105 .with_header("content-type", "application/json")
106 .with_body(include_str!("../../assets/resource-not-found.json"))
107 .create_async()
108 .await;
109 let err = client
110 .get_similar_movies(42, &Default::default())
111 .await
112 .unwrap_err();
113 let server_err = err.as_server_error().unwrap();
114 assert_eq!(server_err.status_code, 34);
115 }
116}
117
118#[cfg(all(test, feature = "integration"))]
119mod integration_tests {
120 use crate::client::Client;
121 use crate::client::reqwest::Client as ReqwestClient;
122
123 #[tokio::test]
124 async fn execute() {
125 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
126 let client = Client::<ReqwestClient>::new(secret);
127 let result = client
128 .get_similar_movies(106912, &Default::default())
129 .await
130 .unwrap();
131 assert_eq!(result.page, 1);
132 }
133}