1pub mod card;
2pub mod client;
3pub mod errors;
4pub mod set;
5pub mod types;
6
7#[cfg(test)]
8mod tests {
9 use crate::card::{Card, SearchCardsRequest};
10 use crate::client::{ApiResult, DataEnvelope};
11 use crate::set::{GetSetRequest, SearchSetsRequest};
12 use crate::{card::GetCardRequest, client::Client};
13 use wiremock::matchers::{header, path, query_param};
14 use wiremock::{Mock, MockServer, ResponseTemplate};
15
16 #[tokio::test]
17 async fn get_card_sends_request_with_proper_id() {
18 let mock_server = MockServer::start().await;
19 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
20
21 let test_card_id = "base1-5";
22
23 Mock::given(path(format!("/cards/{}", test_card_id)))
24 .respond_with(ResponseTemplate::new(400))
25 .expect(1)
26 .mount(&mock_server)
27 .await;
28
29 let _result = client.get_card(GetCardRequest::new(test_card_id)).await;
30 }
31
32 #[tokio::test]
33 async fn appends_api_key_to_header() {
34 let mock_server = MockServer::start().await;
35 let api_key = "abc123";
36 let client = Client::with_base_url(mock_server.uri().as_str(), Some(api_key)).unwrap();
37 let test_card_id = "base1-5";
38
39 Mock::given(path(format!("/cards/{}", test_card_id)))
40 .and(header("X-Api-Key", api_key))
41 .respond_with(ResponseTemplate::new(400))
42 .expect(1)
43 .mount(&mock_server)
44 .await;
45
46 let _result = client.get_card(GetCardRequest::new(test_card_id)).await;
47 }
48
49 #[tokio::test]
50 async fn search_cards_sends_request_with_params() {
51 let mock_server = MockServer::start().await;
52 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
53 let query = "name:celebi";
54 let page = 1;
55 let page_size = 250;
56 let order_by = "name,-number";
57
58 Mock::given(path("/cards"))
59 .and(query_param("q", query))
60 .and(query_param("page", page.to_string()))
61 .and(query_param("pageSize", page_size.to_string()))
62 .and(query_param("orderBy", order_by.to_string()))
63 .respond_with(ResponseTemplate::new(400))
64 .expect(1)
65 .mount(&mock_server)
66 .await;
67
68 let _result = client
69 .search_cards(SearchCardsRequest {
70 query: Some(String::from(query)),
71 page: Some(page),
72 page_size: Some(page_size),
73 order_by: Some(String::from(order_by)),
74 })
75 .await;
76 }
77
78 #[tokio::test]
79 async fn get_all_cards_makes_multiple_requests() {
80 let mock_server = MockServer::start().await;
81 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
82 let body = ApiResult::Ok(DataEnvelope {
83 data: vec![Card::default()],
84 total_count: Some(251),
86 });
87
88 let card_response = ResponseTemplate::new(200).set_body_json(body);
89
90 Mock::given(path("/cards"))
91 .respond_with(card_response)
92 .expect(2)
93 .mount(&mock_server)
94 .await;
95
96 let _result = client.get_all_cards().await;
97 }
98
99 #[tokio::test]
100 async fn search_sets_sends_request_with_params() {
101 let mock_server = MockServer::start().await;
102 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
103 let query = "name:base1";
104 let page = 1;
105 let page_size = 250;
106 let order_by = "name,-number";
107
108 Mock::given(path("/sets"))
109 .and(query_param("q", query))
110 .and(query_param("page", page.to_string()))
111 .and(query_param("pageSize", page_size.to_string()))
112 .and(query_param("orderBy", order_by.to_string()))
113 .respond_with(ResponseTemplate::new(400))
114 .expect(1)
115 .mount(&mock_server)
116 .await;
117
118 let _result = client
119 .search_sets(SearchSetsRequest {
120 query: Some(String::from(query)),
121 page: Some(page),
122 page_size: Some(page_size),
123 order_by: Some(String::from(order_by)),
124 })
125 .await;
126 }
127
128 #[tokio::test]
129 async fn get_set_sends_request_with_proper_id() {
130 let mock_server = MockServer::start().await;
131 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
132 let test_set_id = "base1";
133
134 Mock::given(path(format!("/sets/{}", test_set_id)))
135 .respond_with(ResponseTemplate::new(400))
136 .expect(1)
137 .mount(&mock_server)
138 .await;
139
140 let _result = client.get_set(GetSetRequest::new(test_set_id)).await;
141 }
142
143 #[tokio::test]
144 async fn get_all_sets_sends_request_to_correct_url() {
145 let mock_server = MockServer::start().await;
146 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
147
148 Mock::given(path("/sets"))
149 .respond_with(ResponseTemplate::new(200))
150 .expect(1)
151 .mount(&mock_server)
152 .await;
153
154 let _result = client.get_all_sets().await;
155 }
156
157 #[tokio::test]
158 async fn get_all_types_hits_correct_url() {
159 let mock_server = MockServer::start().await;
160 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
161
162 Mock::given(path("/types"))
163 .respond_with(ResponseTemplate::new(200))
164 .expect(1)
165 .mount(&mock_server)
166 .await;
167
168 let _result = client.get_types().await;
169 }
170
171 #[tokio::test]
172 async fn get_all_subtypes_hits_correct_url() {
173 let mock_server = MockServer::start().await;
174 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
175
176 Mock::given(path("/subtypes"))
177 .respond_with(ResponseTemplate::new(200))
178 .expect(1)
179 .mount(&mock_server)
180 .await;
181
182 let _result = client.get_subtypes().await;
183 }
184
185 #[tokio::test]
186 async fn get_all_supertypes_hits_correct_url() {
187 let mock_server = MockServer::start().await;
188 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
189
190 Mock::given(path("/supertypes"))
191 .respond_with(ResponseTemplate::new(200))
192 .expect(1)
193 .mount(&mock_server)
194 .await;
195
196 let _result = client.get_supertypes().await;
197 }
198
199 #[tokio::test]
200 async fn get_all_rarities_hits_correct_url() {
201 let mock_server = MockServer::start().await;
202 let client = Client::with_base_url(mock_server.uri().as_str(), None).unwrap();
203
204 Mock::given(path("/rarities"))
205 .respond_with(ResponseTemplate::new(200))
206 .expect(1)
207 .mount(&mock_server)
208 .await;
209
210 let _result = client.get_rarities().await;
211 }
212}