diff options
author | 2022-08-17 13:39:12 -0700 | |
---|---|---|
committer | 2022-08-17 13:39:12 -0700 | |
commit | 7f8e8ae189ec3e64bb9acc8273ff5388b3c80f03 (patch) | |
tree | 43200e61d6c7679ae3179a600855a34550091d3d /rust/scraper/src | |
parent | b9fdefb4dc46e549e690c30d3d335314755438dc (diff) | |
download | touchpad-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.rs | 124 |
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 |