summaryrefslogtreecommitdiff
path: root/rust/scraper/src
diff options
context:
space:
mode:
authorGravatar Anshul Gupta <ansg191@yahoo.com> 2022-08-17 13:39:12 -0700
committerGravatar Anshul Gupta <ansg191@yahoo.com> 2022-08-17 13:39:12 -0700
commit7f8e8ae189ec3e64bb9acc8273ff5388b3c80f03 (patch)
tree43200e61d6c7679ae3179a600855a34550091d3d /rust/scraper/src
parentb9fdefb4dc46e549e690c30d3d335314755438dc (diff)
downloadtouchpad-7f8e8ae189ec3e64bb9acc8273ff5388b3c80f03.tar.gz
touchpad-7f8e8ae189ec3e64bb9acc8273ff5388b3c80f03.tar.zst
touchpad-7f8e8ae189ec3e64bb9acc8273ff5388b3c80f03.zip
Finishes adding tests for TouchpadLiveClient
Diffstat (limited to 'rust/scraper/src')
-rw-r--r--rust/scraper/src/touchpad/mod.rs124
1 files changed, 112 insertions, 12 deletions
diff --git a/rust/scraper/src/touchpad/mod.rs b/rust/scraper/src/touchpad/mod.rs
index 32e54c5..d263dbe 100644
--- a/rust/scraper/src/touchpad/mod.rs
+++ b/rust/scraper/src/touchpad/mod.rs
@@ -108,8 +108,13 @@ impl<'a> TouchpadLiveClient<'a> {
.get(format!("{}/meets/{}/swimmerEventMap", &self.url, id))
.send()
.await?
- .json::<HashMap<u32, Vec<u32>>>()
- .map_err(|e| e.into());
+ .json()
+ .map_err(|e| e.into())
+ .map_ok(|x: HashMap<String, Vec<u32>>| x
+ .into_iter()
+ .filter_map(|(k, v)| Some((k.parse::<u32>().ok()?, v)))
+ .collect()
+ );
let events = get_events(self.client.clone(), &self.url, id);
@@ -124,7 +129,7 @@ impl<'a> TouchpadLiveClient<'a> {
let (events, times) = {
let events = get_events(self.client.clone(), &self.url, meet_id);
- let event = get_event(self.client.clone(), "individual", &self.url, meet_id, ev_id);
+ let event = get_event(self.client.clone(), &self.url, "individual", meet_id, ev_id);
future::try_join(events, event)
}.await?;
@@ -158,16 +163,12 @@ async fn get_event(client: Client, base_url: &str, tp: &str, meet_id: u32, ev_id
.await?)
}
-fn events_to_map<I: IntoIterator<Item=EventsResponse>>(events: I) -> HashMap<u32, EventsResponse> {
- events.into_iter().map(|ev| (ev.id, ev)).collect()
-}
-
fn process_swimmers(
swimmers: Vec<ParticipantResponse>,
swimmer_map: &HashMap<u32, Vec<u32>>,
events: Vec<EventsResponse>,
) -> Vec<v1::Swimmer> {
- let event_map = events_to_map(events);
+ let event_map: HashMap<_, _> = events.into_iter().map(|ev| (ev.id, ev)).collect();
let mut proto_swimmers = Vec::with_capacity(swimmers.len());
for swimmer in swimmers {
@@ -187,9 +188,7 @@ fn process_swimmers(
}
}
- if gender == v1::Gender::Unspecified {
- continue;
- } else {
+ if gender != v1::Gender::Unspecified {
proto_swimmers.push(v1::Swimmer {
id: swimmer.id,
name: swimmer.name,
@@ -208,7 +207,7 @@ fn create_individual_event_proto(
) -> Result<v1::Event, TouchpadLiveError> {
let ev_id = event.id;
- let proto_times = times
+ let proto_times = times
.into_iter()
.filter_map(|t| Some(v1::individual_event::IndividualEventTime {
swimmer_id: t.swimmer_id?,
@@ -311,4 +310,105 @@ mod tests {
Ok(())
}
+
+ #[tokio::test]
+ async fn test_swimmers() -> Result<(), TouchpadLiveError> {
+ let url = mockito::server_url();
+
+ let client = TouchpadLiveClient::new_with_url(url);
+
+ let _m1 = mock("GET", "/meets/1/participants")
+ .with_status(200)
+ .with_body(r#"[{"id":1,"name":"Brandon Anderson"},{"id":2,"name":"Kade Baker"},{"id":3,"name":"Sydney Berryman"}]"#)
+ .create();
+ let _m2 = mock("GET", "/meets/1/swimmerEventMap")
+ .with_status(200)
+ .with_body(r#"{"1":[],"2":[1],"3":[2]}"#)
+ .create();
+ let _m3 = mock("GET", "/meets/1/events")
+ .with_status(200)
+ .with_body(r#"[{"age_hi":6,"age_low":0,"ageGroup":"6 & Under","day":"Saturday","distance":25,"eventNumber":"8","gender":"Male","id":1,"relay":false,"rounds":1,"session":1,"sponsor":" ","status":80,"stroke":"Fly"},{"age_hi":8,"age_low":7,"ageGroup":"7-8","day":"Saturday","distance":25,"eventNumber":"9","gender":"Female","id":2,"relay":false,"rounds":1,"session":1,"sponsor":" ","status":80,"stroke":"Fly"}]"#)
+ .create();
+
+ let swimmers = client.swimmers(1).await?;
+
+ assert_eq!(swimmers.as_slice(), &[
+ v1::Swimmer {
+ id: 2,
+ name: "Kade Baker".to_string(),
+ gender: v1::Gender::Male as i32,
+ },
+ v1::Swimmer {
+ id: 3,
+ name: "Sydney Berryman".to_string(),
+ gender: v1::Gender::Female as i32,
+ },
+ ]);
+
+ Ok(())
+ }
+
+ #[tokio::test]
+ async fn test_individual_event() -> Result<(), TouchpadLiveError> {
+ let url = mockito::server_url();
+
+ let client = TouchpadLiveClient::new_with_url(url);
+
+ let _m1 = mock("GET", "/meets/1/events")
+ .with_status(200)
+ .with_body(r#"[{"age_hi":6,"age_low":0,"ageGroup":"6 & Under","day":"Saturday","distance":25,"eventNumber":"8","gender":"Male","id":1,"relay":false,"rounds":1,"session":1,"sponsor":" ","status":80,"stroke":"Fly"}]"#)
+ .create();
+ let _m2 = mock("GET", "/meets/1/individual/1")
+ .with_status(200)
+ .with_body(r#"[{"age":6,"eventID":1,"finalFormattedTime":"26.37","finalsHeat":1,"finalsLane":4,"finalsPoints":5.0,"finalsRank":1,"finalsSplits":[],"finalsSplitsLap":[],"finalsTime":2637,"firstName":"Rocco","formattedSeedTime":"32.87Y","heat":0,"lane":0,"lastName":"Vena","prelimFormattedTime":"--:--.--","prelimPoints":0.0,"prelimRank":0,"prelimSplits":[],"prelimSplitsLap":[],"prelimTime":0,"seedCourse":"Y","seedTime":3287,"seedTime2Compare":3287,"swimmerID":1,"teamID":1,"teamName":"Park Paseo Northstars"},{"age":5,"eventID":1,"finalFormattedTime":"40.63","finalsHeat":1,"finalsLane":5,"finalsPoints":3.0,"finalsRank":2,"finalsSplits":[],"finalsSplitsLap":[],"finalsTime":4063,"firstName":"Ivan","formattedSeedTime":"38.56Y","heat":0,"lane":0,"lastName":"Liu","prelimFormattedTime":"--:--.--","prelimPoints":0.0,"prelimRank":0,"prelimSplits":[],"prelimSplitsLap":[],"prelimTime":0,"seedCourse":"Y","seedTime":3856,"seedTime2Compare":3856,"swimmerID":2,"teamID":1,"teamName":"Park Paseo Northstars"}]"#)
+ .create();
+
+ let event = client.individual_event(1, 1).await?;
+
+ assert_eq!(event, v1::Event {
+ id: 1,
+ meet_id: 1,
+ event_num: 8,
+ age_lo: 0,
+ age_hi: 6,
+ distance: 25,
+ stroke: v1::Stroke::Fly as i32,
+ gender: v1::Gender::Male as i32,
+ is_relay: false,
+ event: Some(v1::event::Event::Individual(v1::IndividualEvent {
+ times: vec![
+ v1::individual_event::IndividualEventTime {
+ swimmer_id: 1,
+ time: Some(v1::EventTime {
+ event_id: 1,
+ team_id: 1,
+ heat: 1,
+ lane: 4,
+ result: v1::EventTimeResult::Ok as i32,
+ time: Some(std::time::Duration::from_millis(26370).into()),
+ seed: Some(std::time::Duration::from_millis(32870).into()),
+ rank: 1,
+ points: 5.0,
+ }),
+ },
+ v1::individual_event::IndividualEventTime {
+ swimmer_id: 2,
+ time: Some(v1::EventTime {
+ event_id: 1,
+ team_id: 1,
+ heat: 1,
+ lane: 5,
+ result: v1::EventTimeResult::Ok as i32,
+ time: Some(std::time::Duration::from_millis(40630).into()),
+ seed: Some(std::time::Duration::from_millis(38560).into()),
+ rank: 2,
+ points: 3.0,
+ }),
+ },
+ ]
+ })),
+ });
+
+ Ok(())
+ }
} \ No newline at end of file