tmdb_api/movie/
credits.rs

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