tmdb_api/tvshow/
watch_providers.rs1use std::borrow::Cow;
2
3use crate::watch_provider::WatchProviderResult;
4
5#[derive(Clone, Debug, Default)]
25pub struct TVShowWatchProviders {
26 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}