1use crate::common::PaginatedResult;
2
3pub type Params<'a> = crate::common::LanguagePageParams<'a>;
4
5#[derive(Debug, Deserialize, Serialize)]
6pub struct MovieList {
7 pub id: u64,
8 pub name: String,
9 #[serde(deserialize_with = "crate::util::empty_string::deserialize")]
10 pub description: Option<String>,
11 pub list_type: String,
12 #[serde(deserialize_with = "crate::util::empty_string::deserialize")]
13 pub poster_path: Option<String>,
14 pub iso_639_1: String,
15 pub item_count: u64,
16 pub favorite_count: u64,
17}
18
19impl<E: crate::client::Executor> crate::Client<E> {
20 pub async fn get_movie_lists(
36 &self,
37 movie_id: u64,
38 params: &Params<'_>,
39 ) -> crate::Result<PaginatedResult<MovieList>> {
40 let url = format!("/movie/{movie_id}/lists");
41 self.execute(&url, params).await
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use mockito::Matcher;
48
49 use crate::client::Client;
50 use crate::client::reqwest::Client as ReqwestClient;
51
52 #[tokio::test]
53 async fn it_works() {
54 let mut server = mockito::Server::new_async().await;
55 let _m = server
56 .mock("GET", "/movie/550/lists")
57 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
58 .with_status(200)
59 .with_header("content-type", "application/json")
60 .with_body(include_str!("../../assets/movie-lists.json"))
61 .create_async()
62 .await;
63
64 let client = Client::<ReqwestClient>::builder()
65 .with_api_key("secret".into())
66 .with_base_url(server.url())
67 .build()
68 .unwrap();
69
70 let result = client
71 .get_movie_lists(550, &Default::default())
72 .await
73 .unwrap();
74 assert_eq!(result.page, 1);
75 assert_eq!(result.results.len(), 20);
76 }
77
78 #[tokio::test]
79 async fn invalid_api_key() {
80 let mut server = mockito::Server::new_async().await;
81 let _m = server
82 .mock("GET", "/movie/550/lists")
83 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
84 .with_status(401)
85 .with_header("content-type", "application/json")
86 .with_body(include_str!("../../assets/invalid-api-key.json"))
87 .create_async()
88 .await;
89
90 let client = Client::<ReqwestClient>::builder()
91 .with_api_key("secret".into())
92 .with_base_url(server.url())
93 .build()
94 .unwrap();
95
96 let err = client
97 .get_movie_lists(550, &Default::default())
98 .await
99 .unwrap_err();
100 let server_err = err.as_server_error().unwrap();
101 assert_eq!(server_err.status_code, 7);
102 }
103
104 #[tokio::test]
105 async fn resource_not_found() {
106 let mut server = mockito::Server::new_async().await;
107 let _m = server
108 .mock("GET", "/movie/550/lists")
109 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
110 .with_status(404)
111 .with_header("content-type", "application/json")
112 .with_body(include_str!("../../assets/resource-not-found.json"))
113 .create_async()
114 .await;
115
116 let client = Client::<ReqwestClient>::builder()
117 .with_api_key("secret".into())
118 .with_base_url(server.url())
119 .build()
120 .unwrap();
121
122 let err = client
123 .get_movie_lists(550, &Default::default())
124 .await
125 .unwrap_err();
126 let server_err = err.as_server_error().unwrap();
127 assert_eq!(server_err.status_code, 34);
128 }
129}
130
131#[cfg(all(test, feature = "integration"))]
132mod integration_tests {
133 use crate::client::Client;
134 use crate::client::reqwest::Client as ReqwestClient;
135
136 #[tokio::test]
137 async fn execute() {
138 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
139 let client = Client::<ReqwestClient>::new(secret);
140 let result = client
141 .get_movie_lists(550, &Default::default())
142 .await
143 .unwrap();
144 assert_eq!(result.page, 1);
145 }
146}