tmdb_api/movie/
release_dates.rs1use std::borrow::Cow;
2
3use crate::common::release_date::LocatedReleaseDates;
4
5#[derive(Clone, Debug, Default)]
25pub struct MovieReleaseDates {
26 pub movie_id: u64,
28}
29
30impl MovieReleaseDates {
31 pub fn new(movie_id: u64) -> Self {
32 Self { movie_id }
33 }
34}
35
36#[derive(Debug, Deserialize, Serialize)]
37pub struct MovieReleaseDatesResult {
38 pub id: u64,
39 pub results: Vec<LocatedReleaseDates>,
40}
41
42impl crate::prelude::Command for MovieReleaseDates {
43 type Output = MovieReleaseDatesResult;
44
45 fn path(&self) -> Cow<'static, str> {
46 Cow::Owned(format!("/movie/{}/release_dates", self.movie_id))
47 }
48
49 fn params(&self) -> Vec<(&'static str, Cow<'_, str>)> {
50 Vec::new()
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::MovieReleaseDates;
57 use crate::client::Client;
58 use crate::client::reqwest::ReqwestExecutor;
59 use crate::prelude::Command;
60 use mockito::Matcher;
61
62 #[tokio::test]
63 async fn it_works() {
64 let mut server = mockito::Server::new_async().await;
65 let client = Client::<ReqwestExecutor>::builder()
66 .with_api_key("secret".into())
67 .with_base_url(server.url())
68 .build()
69 .unwrap();
70
71 let _m = server
72 .mock("GET", "/movie/550/release_dates")
73 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
74 .with_status(200)
75 .with_header("content-type", "application/json")
76 .with_body(include_str!("../../assets/movie-release-dates.json"))
77 .create_async()
78 .await;
79
80 let result = MovieReleaseDates::new(550).execute(&client).await.unwrap();
81 assert_eq!(result.id, 550);
82 assert!(!result.results.is_empty());
83 }
84
85 #[tokio::test]
86 async fn invalid_api_key() {
87 let mut server = mockito::Server::new_async().await;
88 let client = Client::<ReqwestExecutor>::builder()
89 .with_api_key("secret".into())
90 .with_base_url(server.url())
91 .build()
92 .unwrap();
93
94 let _m = server
95 .mock("GET", "/movie/550/release_dates")
96 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
97 .with_status(401)
98 .with_header("content-type", "application/json")
99 .with_body(include_str!("../../assets/invalid-api-key.json"))
100 .create_async()
101 .await;
102
103 let err = MovieReleaseDates::new(550)
104 .execute(&client)
105 .await
106 .unwrap_err();
107 let server_err = err.as_server_error().unwrap();
108 assert_eq!(server_err.status_code, 7);
109 }
110
111 #[tokio::test]
112 async fn resource_not_found() {
113 let mut server = mockito::Server::new_async().await;
114 let client = Client::<ReqwestExecutor>::builder()
115 .with_api_key("secret".into())
116 .with_base_url(server.url())
117 .build()
118 .unwrap();
119
120 let _m = server
121 .mock("GET", "/movie/550/release_dates")
122 .match_query(Matcher::UrlEncoded("api_key".into(), "secret".into()))
123 .with_status(404)
124 .with_header("content-type", "application/json")
125 .with_body(include_str!("../../assets/resource-not-found.json"))
126 .create_async()
127 .await;
128
129 let err = MovieReleaseDates::new(550)
130 .execute(&client)
131 .await
132 .unwrap_err();
133 let server_err = err.as_server_error().unwrap();
134 assert_eq!(server_err.status_code, 34);
135 }
136}
137
138#[cfg(all(test, feature = "integration"))]
139mod integration_tests {
140 use super::MovieReleaseDates;
141 use crate::client::Client;
142 use crate::client::reqwest::ReqwestExecutor;
143 use crate::prelude::Command;
144
145 #[tokio::test]
146 async fn execute() {
147 let secret = std::env::var("TMDB_TOKEN_V3").unwrap();
148 let client = Client::<ReqwestExecutor>::new(secret);
149
150 let result = MovieReleaseDates::new(550).execute(&client).await.unwrap();
151 assert_eq!(result.id, 550);
152 }
153}