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 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}