tmdb_api/movie/
credits.rs1use 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 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::Client as ReqwestClient;
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::<ReqwestClient>::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::<ReqwestClient>::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::<ReqwestClient>::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::Client as ReqwestClient;
134
135 #[tokio::test]
136 async fn execute() {
137 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
138 let client = Client::<ReqwestClient>::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::<ReqwestClient>::new(secret);
153
154 let params = super::Params::default().with_language("fr-FR");
155 let result = client.get_movie_credits(550, ¶ms).await.unwrap();
156 assert_eq!(result.id, 550);
157 }
158}