tmdb_api/movie/
credits.rs

1use crate::{
2    client::Executor,
3    common::credits::{Cast, Crew},
4};
5
6pub type Params<'a> = crate::common::LanguageParams<'a>;
7
8#[derive(Debug, Deserialize)]
9pub struct GetMovieCreditsResponse {
10    pub id: u64,
11    pub cast: Vec<Cast>,
12    pub crew: Vec<Crew>,
13}
14
15impl<E: Executor> crate::Client<E> {
16    /// List changes for a movie
17    ///
18    /// ```rust
19    /// use tmdb_api::client::Client;
20    /// use tmdb_api::client::reqwest::ReqwestExecutor;
21    ///
22    /// #[tokio::main]
23    /// async fn main() {
24    ///     let client = Client::<ReqwestExecutor>::new("this-is-my-secret-token".into());
25    ///     match client.get_movie_credits(42, &Default::default()).await {
26    ///         Ok(res) => println!("found: {:#?}", res),
27    ///         Err(err) => eprintln!("error: {:?}", err),
28    ///     };
29    /// }
30    /// ```
31    pub async fn get_movie_credits(
32        &self,
33        movie_id: u64,
34        params: &Params<'_>,
35    ) -> crate::Result<GetMovieCreditsResponse> {
36        let url = format!("/movie/{movie_id}/credits");
37        self.execute(&url, params).await
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use mockito::Matcher;
44
45    use crate::client::Client;
46    use crate::client::reqwest::ReqwestExecutor;
47
48    #[tokio::test]
49    async fn it_works() {
50        let mut server = mockito::Server::new_async().await;
51        let m = server
52            .mock("GET", "/movie/3/credits")
53            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
54            .with_status(200)
55            .with_header("content-type", "application/json")
56            .with_body(include_str!("../../assets/movie-credits.json"))
57            .create_async()
58            .await;
59
60        let client = Client::<ReqwestExecutor>::builder()
61            .with_api_key("secret".into())
62            .with_base_url(server.url())
63            .build()
64            .unwrap();
65        let result = client
66            .get_movie_credits(3, &Default::default())
67            .await
68            .unwrap();
69        assert_eq!(result.id, 550);
70
71        m.assert_async().await;
72    }
73
74    #[tokio::test]
75    async fn invalid_api_key() {
76        let mut server = mockito::Server::new_async().await;
77        let m = server
78            .mock("GET", "/movie/1/credits")
79            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
80            .with_status(401)
81            .with_header("content-type", "application/json")
82            .with_body(include_str!("../../assets/invalid-api-key.json"))
83            .create_async()
84            .await;
85
86        let client = Client::<ReqwestExecutor>::builder()
87            .with_api_key("secret".into())
88            .with_base_url(server.url())
89            .build()
90            .unwrap();
91
92        let err = client
93            .get_movie_credits(1, &Default::default())
94            .await
95            .unwrap_err();
96        let server_err = err.as_server_error().unwrap();
97        assert_eq!(server_err.status_code, 7);
98
99        m.assert_async().await;
100    }
101
102    #[tokio::test]
103    async fn resource_not_found() {
104        let mut server = mockito::Server::new_async().await;
105        let m = server
106            .mock("GET", "/movie/1/credits")
107            .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
108            .with_status(404)
109            .with_header("content-type", "application/json")
110            .with_body(include_str!("../../assets/resource-not-found.json"))
111            .create_async()
112            .await;
113
114        let client = Client::<ReqwestExecutor>::builder()
115            .with_api_key("secret".into())
116            .with_base_url(server.url())
117            .build()
118            .unwrap();
119        let err = client
120            .get_movie_credits(1, &Default::default())
121            .await
122            .unwrap_err();
123        let server_err = err.as_server_error().unwrap();
124        assert_eq!(server_err.status_code, 34);
125
126        m.assert_async().await;
127    }
128}
129
130#[cfg(all(test, feature = "integration"))]
131mod integration_tests {
132    use crate::client::Client;
133    use crate::client::reqwest::ReqwestExecutor;
134
135    #[tokio::test]
136    async fn execute() {
137        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
138        let client = Client::<ReqwestExecutor>::new(secret);
139
140        for i in [550, 299641] {
141            let result = client
142                .get_movie_credits(i, &Default::default())
143                .await
144                .unwrap();
145            assert_eq!(result.id, i);
146        }
147    }
148
149    #[tokio::test]
150    async fn execute_fr() {
151        let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
152        let client = Client::<ReqwestExecutor>::new(secret);
153
154        let params = super::Params::default().with_language("fr-FR");
155        let result = client.get_movie_credits(550, &params).await.unwrap();
156        assert_eq!(result.id, 550);
157    }
158}