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::Client as ReqwestClient;
13    ///
14    /// #[tokio::main]
15    /// async fn main() {
16    ///     let client = Client::<ReqwestClient>::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 mockito::Matcher;
32
33    use crate::client::Client;
34    use crate::client::reqwest::Client as ReqwestClient;
35
36    #[tokio::test]
37    async fn it_works() {
38        let mut server = mockito::Server::new_async().await;
39        let client = Client::<ReqwestClient>::builder()
40            .with_api_key("secret".into())
41            .with_base_url(server.url())
42            .build()
43            .unwrap();
44
45        let _m = server
46            .mock("GET", "/movie/550/watch/providers")
47            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
48            .with_status(200)
49            .with_header("content-type", "application/json")
50            .with_body(include_str!("../../assets/movie-watch-providers.json"))
51            .create_async()
52            .await;
53
54        let result = client.get_movie_watch_providers(550).await.unwrap();
55        assert_eq!(result.id, 550);
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", "/movie/550/watch/providers")
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_movie_watch_providers(550).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", "/movie/550/watch/providers")
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_movie_watch_providers(550).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::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_movie_watch_providers(550).await.unwrap();
117        assert_eq!(result.id, 550);
118        assert!(!result.results.is_empty());
119    }
120}