tmdb_api/movie/
videos.rs

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    /// Get a list of translations that have been created for a movie.
10    ///
11    /// ```rust
12    /// use tmdb_api::client::Client;
13    /// use tmdb_api::client::reqwest::Client as ReqwestClient;
14    ///
15    /// #[tokio::main]
16    /// async fn main() {
17    ///     let client = Client::<ReqwestClient>::new("this-is-my-secret-token".into());
18    ///     match client.get_movie_translations(1).await {
19    ///         Ok(res) => println!("found: {:#?}", res),
20    ///         Err(err) => eprintln!("error: {:?}", err),
21    ///     };
22    /// }
23    /// ```
24    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}