pokemon_tcg_sdk/
lib.rs

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            // greater than the single page size
85            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}