1use crate::common::{EntityResults, video::Video};
2
3pub type Params<'a> = crate::common::LanguageParams<'a>;
4
5pub type Response = EntityResults<Vec<Video>>;
6
7impl<E: crate::client::Executor> crate::Client<E> {
8 pub async fn get_movie_videos(
24 &self,
25 movie_id: u64,
26 params: &Params<'_>,
27 ) -> crate::Result<Response> {
28 let url = format!("/movie/{movie_id}/videos");
29 self.execute(&url, params).await
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use crate::client::Client;
36 use crate::client::reqwest::ReqwestExecutor;
37 use mockito::Matcher;
38
39 #[tokio::test]
40 async fn it_works() {
41 let mut server = mockito::Server::new_async().await;
42 let client = Client::<ReqwestExecutor>::builder()
43 .with_api_key("secret".into())
44 .with_base_url(server.url())
45 .build()
46 .unwrap();
47
48 let _m = server
49 .mock("GET", "/movie/550/videos")
50 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
51 .with_status(200)
52 .with_header("content-type", "application/json")
53 .with_body(include_str!("../../assets/movie-videos.json"))
54 .create_async()
55 .await;
56
57 let result = client
58 .get_movie_videos(550, &Default::default())
59 .await
60 .unwrap();
61 assert_eq!(result.id, 550);
62 assert!(!result.results.is_empty());
63 }
64
65 #[tokio::test]
66 async fn invalid_api_key() {
67 let mut server = mockito::Server::new_async().await;
68 let client = Client::<ReqwestExecutor>::builder()
69 .with_api_key("secret".into())
70 .with_base_url(server.url())
71 .build()
72 .unwrap();
73
74 let _m = server
75 .mock("GET", "/movie/550/videos")
76 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
77 .with_status(401)
78 .with_header("content-type", "application/json")
79 .with_body(include_str!("../../assets/invalid-api-key.json"))
80 .create_async()
81 .await;
82
83 let err = client
84 .get_movie_videos(550, &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", "/movie/550/videos")
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
109 let err = client
110 .get_movie_videos(550, &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::ReqwestExecutor;
122
123 #[tokio::test]
124 async fn execute() {
125 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
126 let client = Client::<ReqwestExecutor>::new(secret);
127
128 let result = client
129 .get_movie_videos(550, &Default::default())
130 .await
131 .unwrap();
132 assert_eq!(result.id, 550);
133 assert!(!result.results.is_empty());
134 }
135}