tmdb_api/tvshow/
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_tvshows(
22 &self,
23 tvshow_id: u64,
24 params: &Params<'_>,
25 ) -> crate::Result<PaginatedResult<super::TVShowShort>> {
26 let url = format!("/tv/{tvshow_id}/similar");
27 self.execute(&url, params).await
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use crate::client::Client;
34 use crate::client::reqwest::ReqwestExecutor;
35 use mockito::Matcher;
36
37 #[tokio::test]
38 async fn it_works() {
39 let mut server = mockito::Server::new_async().await;
40 let client = Client::<ReqwestExecutor>::builder()
41 .with_api_key("secret".into())
42 .with_base_url(server.url())
43 .build()
44 .unwrap();
45
46 let _m = server
47 .mock("GET", "/tv/1399/similar")
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/tv-similar.json"))
52 .create_async()
53 .await;
54 let result = client
55 .get_similar_tvshows(1399, &Default::default())
56 .await
57 .unwrap();
58 assert_eq!(result.page, 1);
59 assert_eq!(result.results.len(), 20);
60 assert_eq!(result.total_pages, 2074);
61 assert_eq!(result.total_results, 41463);
62 let item = result.results.first().unwrap();
63 assert_eq!(item.inner.name, "Sunset Vibes");
64 }
65
66 #[tokio::test]
67 async fn invalid_api_key() {
68 let mut server = mockito::Server::new_async().await;
69 let client = Client::<ReqwestExecutor>::builder()
70 .with_api_key("secret".into())
71 .with_base_url(server.url())
72 .build()
73 .unwrap();
74
75 let _m = server
76 .mock("GET", "/tv/1399/similar")
77 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
78 .with_status(401)
79 .with_header("content-type", "application/json")
80 .with_body(include_str!("../../assets/invalid-api-key.json"))
81 .create_async()
82 .await;
83 let err = client
84 .get_similar_tvshows(1399, &Default::default())
85 .await
86 .unwrap_err();
87 let server_err = err.as_server_error().unwrap();
88 assert_eq!(server_err.status_code, 7);
89 }
90
91 #[tokio::test]
92 async fn resource_not_found() {
93 let mut server = mockito::Server::new_async().await;
94 let client = Client::<ReqwestExecutor>::builder()
95 .with_api_key("secret".into())
96 .with_base_url(server.url())
97 .build()
98 .unwrap();
99
100 let _m = server
101 .mock("GET", "/tv/1399/similar")
102 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
103 .with_status(404)
104 .with_header("content-type", "application/json")
105 .with_body(include_str!("../../assets/resource-not-found.json"))
106 .create_async()
107 .await;
108 let err = client
109 .get_similar_tvshows(1399, &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}
116
117#[cfg(all(test, feature = "integration"))]
118mod integration_tests {
119 use crate::client::Client;
120 use crate::client::reqwest::ReqwestExecutor;
121
122 #[tokio::test]
123 async fn execute() {
124 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
125 let client = Client::<ReqwestExecutor>::new(secret);
126 let result = client
127 .get_similar_tvshows(1399, &Default::default())
128 .await
129 .unwrap();
130 assert_eq!(result.page, 1);
131 }
132}