tmdb_api/movie/
lists.rs

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    /// Get the lists that a movie has been added to.
21    ///
22    /// ```rust
23    /// use tmdb_api::client::Client;
24    /// use tmdb_api::client::reqwest::Client as ReqwestClient;
25    ///
26    /// #[tokio::main]
27    /// async fn main() {
28    ///     let client = Client::<ReqwestClient>::new("this-is-my-secret-token".into());
29    ///     match client.get_movie_lists(42, &Default::default()).await {
30    ///         Ok(res) => println!("found: {:#?}", res),
31    ///         Err(err) => eprintln!("error: {:?}", err),
32    ///     };
33    /// }
34    /// ```
35    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}