tmdb_api/tvshow/
keywords.rs1use crate::common::EntityResults;
4use crate::common::keyword::Keyword;
5
6pub type Response = EntityResults<Vec<Keyword>>;
7
8impl<E: crate::client::Executor> crate::Client<E> {
9 pub async fn get_tvshow_keywords(&self, tvshow_id: u64) -> crate::Result<Response> {
25 let url = format!("/tv/{tvshow_id}/keywords");
26 self.execute(&url, &()).await
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use mockito::Matcher;
33
34 use crate::Client;
35 use crate::client::reqwest::Client as ReqwestClient;
36
37 #[tokio::test]
38 async fn it_works() {
39 let mut server = mockito::Server::new_async().await;
40 let client = Client::<ReqwestClient>::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/keywords")
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-keywords.json"))
52 .create_async()
53 .await;
54
55 let result = client.get_tvshow_keywords(1399).await.unwrap();
56 assert!(!result.results.is_empty());
57 }
58
59 #[tokio::test]
60 async fn invalid_api_key() {
61 let mut server = mockito::Server::new_async().await;
62 let client = Client::<ReqwestClient>::builder()
63 .with_api_key("secret".into())
64 .with_base_url(server.url())
65 .build()
66 .unwrap();
67
68 let _m = server
69 .mock("GET", "/tv/1399/keywords")
70 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
71 .with_status(401)
72 .with_header("content-type", "application/json")
73 .with_body(include_str!("../../assets/invalid-api-key.json"))
74 .create_async()
75 .await;
76
77 let err = client.get_tvshow_keywords(1399).await.unwrap_err();
78 let server_err = err.as_server_error().unwrap();
79 assert_eq!(server_err.status_code, 7);
80 }
81
82 #[tokio::test]
83 async fn resource_not_found() {
84 let mut server = mockito::Server::new_async().await;
85 let client = Client::<ReqwestClient>::builder()
86 .with_api_key("secret".into())
87 .with_base_url(server.url())
88 .build()
89 .unwrap();
90
91 let _m = server
92 .mock("GET", "/tv/1399/keywords")
93 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
94 .with_status(404)
95 .with_header("content-type", "application/json")
96 .with_body(include_str!("../../assets/resource-not-found.json"))
97 .create_async()
98 .await;
99
100 let err = client.get_tvshow_keywords(1399).await.unwrap_err();
101 let server_err = err.as_server_error().unwrap();
102 assert_eq!(server_err.status_code, 34);
103 }
104}
105
106#[cfg(all(test, feature = "integration"))]
107mod integration_tests {
108 use crate::Client;
109 use crate::client::reqwest::Client as ReqwestClient;
110
111 #[tokio::test]
112 async fn execute() {
113 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
114 let client = Client::<ReqwestClient>::new(secret);
115
116 let result = client.get_tvshow_keywords(1399).await.unwrap();
117 assert!(!result.results.is_empty());
118 }
119}