tmdb_api/movie/
watch_providers.rs

1use std::collections::HashMap;
2
3use crate::watch_provider::LocatedWatchProvider;
4
5pub type Response = crate::common::EntityResults<HashMap<String, LocatedWatchProvider>>;
6
7impl<E: crate::client::Executor> crate::Client<E> {
8    /// Get a list of watch providers for a movie.
9    ///
10    /// ```rust
11    /// use tmdb_api::client::Client;
12    /// use tmdb_api::client::reqwest::ReqwestExecutor;
13    ///
14    /// #[tokio::main]
15    /// async fn main() {
16    ///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
17    ///     match client.get_movie_watch_providers(1).await {
18    ///         Ok(res) => println!("found: {:#?}", res),
19    ///         Err(err) => eprintln!("error: {:?}", err),
20    ///     };
21    /// }
22    /// ```
23    pub async fn get_movie_watch_providers(&self, movie_id: u64) -> crate::Result<Response> {
24        let url = format!("/movie/{movie_id}/watch/providers");
25        self.execute(&url, &()).await
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use crate::client::Client;
32    use crate::client::reqwest::ReqwestExecutor;
33    use mockito::Matcher;
34
35    #[tokio::test]
36    async fn it_works() {
37        let mut server = mockito::Server::new_async().await;
38        let client = Client::<ReqwestExecutor>::builder()
39            .with_api_key("secret".into())
40            .with_base_url(server.url())
41            .build()
42            .unwrap();
43
44        let _m = server
45            .mock("GET", "/movie/550/watch/providers")
46            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
47            .with_status(200)
48            .with_header("content-type", "application/json")
49            .with_body(include_str!("../../assets/movie-watch-providers.json"))
50            .create_async()
51            .await;
52
53        let result = client.get_movie_watch_providers(550).await.unwrap();
54        assert_eq!(result.id, 550);
55        assert!(!result.results.is_empty());
56    }
57
58    #[tokio::test]
59    async fn invalid_api_key() {
60        let mut server = mockito::Server::new_async().await;
61        let client = Client::<ReqwestExecutor>::builder()
62            .with_api_key("secret".into())
63            .with_base_url(server.url())
64            .build()
65            .unwrap();
66
67        let _m = server
68            .mock("GET", "/movie/550/watch/providers")
69            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
70            .with_status(401)
71            .with_header("content-type", "application/json")
72            .with_body(include_str!("../../assets/invalid-api-key.json"))
73            .create_async()
74            .await;
75
76        let err = client.get_movie_watch_providers(550).await.unwrap_err();
77        let server_err = err.as_server_error().unwrap();
78        assert_eq!(server_err.status_code, 7);
79    }
80
81    #[tokio::test]
82    async fn resource_not_found() {
83        let mut server = mockito::Server::new_async().await;
84        let client = Client::<ReqwestExecutor>::builder()
85            .with_api_key("secret".into())
86            .with_base_url(server.url())
87            .build()
88            .unwrap();
89
90        let _m = server
91            .mock("GET", "/movie/550/watch/providers")
92            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
93            .with_status(404)
94            .with_header("content-type", "application/json")
95            .with_body(include_str!("../../assets/resource-not-found.json"))
96            .create_async()
97            .await;
98
99        let err = client.get_movie_watch_providers(550).await.unwrap_err();
100        let server_err = err.as_server_error().unwrap();
101        assert_eq!(server_err.status_code, 34);
102    }
103}
104
105#[cfg(all(test, feature = "integration"))]
106mod integration_tests {
107    use crate::client::Client;
108    use crate::client::reqwest::ReqwestExecutor;
109
110    #[tokio::test]
111    async fn execute() {
112        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
113        let client = Client::<ReqwestExecutor>::new(secret);
114
115        let result = client.get_movie_watch_providers(550).await.unwrap();
116        assert_eq!(result.id, 550);
117        assert!(!result.results.is_empty());
118    }
119}