tmdb_api/movie/
credits.rs1use 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 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, ¶ms).await.unwrap();
154 assert_eq!(result.id, 550);
155 }
156}