1use crate::common::EntityResults;
2use crate::common::video::Video;
3
4pub type Params<'a> = crate::common::LanguageParams<'a>;
5
6pub type Response = EntityResults<Vec<Video>>;
7
8impl<E: crate::client::Executor> crate::Client<E> {
9 pub async fn get_movie_videos(
25 &self,
26 movie_id: u64,
27 params: &Params<'_>,
28 ) -> crate::Result<Response> {
29 let url = format!("/movie/{movie_id}/videos");
30 self.execute(&url, params).await
31 }
32}
33
34#[cfg(test)]
35mod tests {
36 use mockito::Matcher;
37
38 use crate::client::Client;
39 use crate::client::reqwest::Client as ReqwestClient;
40
41 #[tokio::test]
42 async fn it_works() {
43 let mut server = mockito::Server::new_async().await;
44 let client = Client::<ReqwestClient>::builder()
45 .with_api_key("secret".into())
46 .with_base_url(server.url())
47 .build()
48 .unwrap();
49
50 let _m = server
51 .mock("GET", "/movie/550/videos")
52 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
53 .with_status(200)
54 .with_header("content-type", "application/json")
55 .with_body(include_str!("../../assets/movie-videos.json"))
56 .create_async()
57 .await;
58
59 let result = client
60 .get_movie_videos(550, &Default::default())
61 .await
62 .unwrap();
63 assert_eq!(result.id, 550);
64 assert!(!result.results.is_empty());
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/550/videos")
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
85 let err = client
86 .get_movie_videos(550, &Default::default())
87 .await
88 .unwrap_err();
89 let server_err = err.as_server_error().unwrap();
90 assert_eq!(server_err.status_code, 7);
91 }
92
93 #[tokio::test]
94 async fn resource_not_found() {
95 let mut server = mockito::Server::new_async().await;
96 let client = Client::<ReqwestClient>::builder()
97 .with_api_key("secret".into())
98 .with_base_url(server.url())
99 .build()
100 .unwrap();
101
102 let _m = server
103 .mock("GET", "/movie/550/videos")
104 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
105 .with_status(404)
106 .with_header("content-type", "application/json")
107 .with_body(include_str!("../../assets/resource-not-found.json"))
108 .create_async()
109 .await;
110
111 let err = client
112 .get_movie_videos(550, &Default::default())
113 .await
114 .unwrap_err();
115 let server_err = err.as_server_error().unwrap();
116 assert_eq!(server_err.status_code, 34);
117 }
118}
119
120#[cfg(all(test, feature = "integration"))]
121mod integration_tests {
122 use crate::client::Client;
123 use crate::client::reqwest::Client as ReqwestClient;
124
125 #[tokio::test]
126 async fn execute() {
127 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
128 let client = Client::<ReqwestClient>::new(secret);
129
130 let result = client
131 .get_movie_videos(550, &Default::default())
132 .await
133 .unwrap();
134 assert_eq!(result.id, 550);
135 assert!(!result.results.is_empty());
136 }
137}