tmdb_api/movie/
watch_providers.rs1use 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 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::Client as ReqwestClient;
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::<ReqwestClient>::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::<ReqwestClient>::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::<ReqwestClient>::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::Client as ReqwestClient;
109
110 #[tokio::test]
111 async fn execute() {
112 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
113 let client = Client::<ReqwestClient>::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}