tmdb_api/tvshow/episode/
details.rs

1pub type Params<'a> = crate::common::LanguageParams<'a>;
2
3impl<E: crate::client::Executor> crate::Client<E> {
4    /// Get tvshow episode complete details
5    ///
6    /// ```rust
7    /// use tmdb_api::client::Client;
8    /// use tmdb_api::client::reqwest::Client as ReqwestClient;
9    ///
10    /// #[tokio::main]
11    /// async fn main() {
12    ///     let client = Client::<ReqwestClient>::new("this-is-my-secret-token".into());
13    ///     match client.get_tvshow_details(42, &Default::default()).await {
14    ///         Ok(res) => println!("found: {:#?}", res),
15    ///         Err(err) => eprintln!("error: {:?}", err),
16    ///     };
17    /// }
18    /// ```
19    pub async fn get_tvshow_episode_details(
20        &self,
21        tvshow_id: u64,
22        season_number: u64,
23        episode_number: u64,
24        params: &Params<'_>,
25    ) -> crate::Result<crate::tvshow::Episode> {
26        let url = format!("/tv/{tvshow_id}/season/{season_number}/episode/{episode_number}");
27        self.execute(&url, params).await
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use mockito::Matcher;
34
35    use crate::client::Client;
36    use crate::client::reqwest::Client as ReqwestClient;
37
38    #[tokio::test]
39    async fn it_works() {
40        let mut server = mockito::Server::new_async().await;
41        let client = Client::<ReqwestClient>::builder()
42            .with_api_key("secret".into())
43            .with_base_url(server.url())
44            .build()
45            .unwrap();
46
47        let _m = server
48            .mock("GET", "/tv/1399/season/1/episode/1")
49            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
50            .with_status(200)
51            .with_header("content-type", "application/json")
52            .with_body(include_str!("../../../assets/tv-episode-details.json"))
53            .create_async()
54            .await;
55
56        let result = client
57            .get_tvshow_episode_details(1399, 1, 1, &Default::default())
58            .await
59            .unwrap();
60        assert_eq!(result.inner.id, 63056);
61    }
62
63    #[tokio::test]
64    async fn invalid_api_key() {
65        let mut server = mockito::Server::new_async().await;
66        let client = Client::<ReqwestClient>::builder()
67            .with_api_key("secret".into())
68            .with_base_url(server.url())
69            .build()
70            .unwrap();
71
72        let _m = server
73            .mock("GET", "/tv/1399/season/1/episode/1")
74            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
75            .with_status(401)
76            .with_header("content-type", "application/json")
77            .with_body(include_str!("../../../assets/invalid-api-key.json"))
78            .create_async()
79            .await;
80
81        let err = client
82            .get_tvshow_episode_details(1399, 1, 1, &Default::default())
83            .await
84            .unwrap_err();
85        let server_err = err.as_server_error().unwrap();
86        assert_eq!(server_err.status_code, 7);
87    }
88
89    #[tokio::test]
90    async fn resource_not_found() {
91        let mut server = mockito::Server::new_async().await;
92        let client = Client::<ReqwestClient>::builder()
93            .with_api_key("secret".into())
94            .with_base_url(server.url())
95            .build()
96            .unwrap();
97
98        let _m = server
99            .mock("GET", "/tv/1399/season/1/episode/1")
100            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
101            .with_status(404)
102            .with_header("content-type", "application/json")
103            .with_body(include_str!("../../../assets/resource-not-found.json"))
104            .create_async()
105            .await;
106
107        let err = client
108            .get_tvshow_episode_details(1399, 1, 1, &Default::default())
109            .await
110            .unwrap_err();
111        let server_err = err.as_server_error().unwrap();
112        assert_eq!(server_err.status_code, 34);
113    }
114}
115
116#[cfg(all(test, feature = "integration"))]
117mod integration_tests {
118    use crate::client::Client;
119    use crate::client::reqwest::Client as ReqwestClient;
120
121    #[tokio::test]
122    async fn execute() {
123        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
124        let client = Client::<ReqwestClient>::new(secret);
125
126        for tv_id in [1] {
127            let _result = client
128                .get_tvshow_episode_details(tv_id, 1, 1, &Default::default())
129                .await
130                .unwrap();
131        }
132    }
133}