tmdb_api/tvshow/
watch_providers.rs

1use std::borrow::Cow;
2
3use crate::watch_provider::WatchProviderResult;
4
5/// Get a list of watch providers for a TV show.
6///
7/// ```rust
8/// use tmdb_api::prelude::Command;
9/// use tmdb_api::client::Client;
10/// use tmdb_api::client::reqwest::ReqwestExecutor;
11/// use tmdb_api::tvshow::watch_providers::TVShowWatchProviders;
12///
13/// #[tokio::main]
14/// async fn main() {
15///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
16///     let cmd = TVShowWatchProviders::new(1);
17///     let result = cmd.execute(&client).await;
18///     match result {
19///         Ok(res) => println!("found: {:#?}", res),
20///         Err(err) => eprintln!("error: {:?}", err),
21///     };
22/// }
23/// ```
24#[derive(Clone, Debug, Default)]
25pub struct TVShowWatchProviders {
26    /// ID of the movie.
27    pub tv_id: u64,
28}
29
30impl TVShowWatchProviders {
31    pub fn new(tv_id: u64) -> Self {
32        Self { tv_id }
33    }
34}
35
36impl crate::prelude::Command for TVShowWatchProviders {
37    type Output = WatchProviderResult;
38
39    fn path(&self) -> Cow<'static, str> {
40        Cow::Owned(format!("/tv/{}/watch/providers", self.tv_id))
41    }
42
43    fn params(&self) -> Vec<(&'static str, Cow<'_, str>)> {
44        Vec::new()
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::TVShowWatchProviders;
51    use crate::client::Client;
52    use crate::client::reqwest::ReqwestExecutor;
53    use crate::prelude::Command;
54    use mockito::Matcher;
55
56    #[tokio::test]
57    async fn it_works() {
58        let mut server = mockito::Server::new_async().await;
59        let client = Client::<ReqwestExecutor>::builder()
60            .with_api_key("secret".into())
61            .with_base_url(server.url())
62            .build()
63            .unwrap();
64
65        let _m = server
66            .mock("GET", "/tv/1399/watch/providers")
67            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
68            .with_status(200)
69            .with_header("content-type", "application/json")
70            .with_body(include_str!("../../assets/tv-watch-providers.json"))
71            .create_async()
72            .await;
73
74        let result = TVShowWatchProviders::new(1399)
75            .execute(&client)
76            .await
77            .unwrap();
78        assert_eq!(result.id, 1399);
79        assert!(!result.results.is_empty());
80    }
81
82    #[tokio::test]
83    async fn invalid_api_key() {
84        let mut server = mockito::Server::new_async().await;
85        let client = Client::<ReqwestExecutor>::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", "/tv/1399/watch/providers")
93            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
94            .with_status(401)
95            .with_header("content-type", "application/json")
96            .with_body(include_str!("../../assets/invalid-api-key.json"))
97            .create_async()
98            .await;
99
100        let err = TVShowWatchProviders::new(1399)
101            .execute(&client)
102            .await
103            .unwrap_err();
104        let server_err = err.as_server_error().unwrap();
105        assert_eq!(server_err.status_code, 7);
106    }
107
108    #[tokio::test]
109    async fn resource_not_found() {
110        let mut server = mockito::Server::new_async().await;
111        let client = Client::<ReqwestExecutor>::builder()
112            .with_api_key("secret".into())
113            .with_base_url(server.url())
114            .build()
115            .unwrap();
116
117        let _m = server
118            .mock("GET", "/tv/1399/watch/providers")
119            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
120            .with_status(404)
121            .with_header("content-type", "application/json")
122            .with_body(include_str!("../../assets/resource-not-found.json"))
123            .create_async()
124            .await;
125
126        let err = TVShowWatchProviders::new(1399)
127            .execute(&client)
128            .await
129            .unwrap_err();
130        let server_err = err.as_server_error().unwrap();
131        assert_eq!(server_err.status_code, 34);
132    }
133}
134
135#[cfg(all(test, feature = "integration"))]
136mod integration_tests {
137    use super::TVShowWatchProviders;
138    use crate::client::Client;
139    use crate::client::reqwest::ReqwestExecutor;
140    use crate::prelude::Command;
141
142    #[tokio::test]
143    async fn execute() {
144        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
145        let client = Client::<ReqwestExecutor>::new(secret);
146
147        let result = TVShowWatchProviders::new(1399)
148            .execute(&client)
149            .await
150            .unwrap();
151        assert_eq!(result.id, 1399);
152    }
153}