mod tests {
use serde::Deserialize;
use crate::{
error::Error,
jolpica::{
resource::Filters,
response::{Position, QualifyingResult, RaceResult, SprintResult},
tests::util::JOLPICA_MP,
time::{
QualifyingTime, RaceTime, deserialize_buggy_race_time, duration_hms_ms, duration_m_s_ms,
duration_millis,
},
},
};
use crate::jolpica::tests::assets::*;
use crate::tests::asserts::*;
use shadow_asserts::assert_eq;
#[derive(Deserialize, PartialEq, Clone, Debug)]
struct Proxy {
#[serde(flatten, rename = "Time", default, deserialize_with = "deserialize_buggy_race_time")]
time: Option<RaceTime>,
}
impl Proxy {
fn new(time: RaceTime) -> Self {
Self { time: Some(time) }
}
fn none() -> Self {
Self { time: None }
}
}
#[test]
fn deserialize_race_time() {
assert_eq!(
serde_json::from_str::<RaceTime>(r#"{"millis": "7373700", "time": "2:02:53.7"}"#).unwrap(),
RaceTime::lead(duration_millis(7373700))
);
assert_eq!(
serde_json::from_str::<Proxy>(r#"{"millis": "7373700", "time": "2:02:53.7"}"#).unwrap(),
Proxy::new(RaceTime::lead(duration_millis(7373700)))
);
}
#[test]
fn deserialize_buggy_race_time_workarounds() {
assert_eq!(
serde_json::from_str::<Proxy>(r#"{"millis": "1779513", "time": "+-1:57:34.853"}"#).unwrap(),
Proxy::none()
);
assert_eq!(duration_millis(10046000), duration_hms_ms(2, 47, 26, 0));
assert_eq!(
serde_json::from_str::<Proxy>(r#"{"millis": "10046000", "time": "2:47"}"#).unwrap(),
Proxy::new(RaceTime::lead(duration_millis(10046000)))
);
}
#[test]
fn deserialize_buggy_race_time_workarounds_error_not_using_deserialize_with() {
let result = serde_json::from_str::<RaceTime>(r#"{"millis": "10046000", "time": "2:47"}"#);
assert!(matches!(result, Err(serde_json::Error { .. })));
let err_msg = format!("{}", result.unwrap_err());
assert_true!(err_msg.contains("Invalid duration: \"2:47\""));
}
#[test]
fn deserialize_buggy_race_time_workarounds_error_does_not_match_within_60s() {
let result = serde_json::from_str::<Proxy>(r#"{"millis": "10046000", "time": "2:49"}"#);
assert!(matches!(result, Err(serde_json::Error { .. })));
let err_msg = format!("{}", result.unwrap_err());
assert_true!(err_msg.contains("Buggy delta 'time: 2:49' does not match 'millis: 10046000' to within 60s"));
}
#[test]
fn sprint_result_buggy_time() {
assert_true!(SPRINT_RESULT_2024_5_P20.time.is_none());
assert_eq!(
serde_json::from_str::<SprintResult>(SPRINT_RESULT_2024_5_P20_STR).unwrap(),
*SPRINT_RESULT_2024_5_P20
);
}
#[test]
#[ignore]
fn get_sprint_result_buggy_time() {
let result = JOLPICA_MP.get_sprint_result(Filters::new().season(2024).round(5).driver_id("alonso".into()));
assert_eq!(result.unwrap().sprint_result(), &*SPRINT_RESULT_2024_5_P20);
}
#[test]
fn race_result_buggy_time() {
assert_true!(RACE_RESULT_2023_3_P15.time.is_none());
assert_eq!(serde_json::from_str::<RaceResult>(RACE_RESULT_2023_3_P15_STR).unwrap(), *RACE_RESULT_2023_3_P15);
assert_true!(RACE_RESULT_1950_5_P1.time.is_some());
assert_eq!(serde_json::from_str::<RaceResult>(RACE_RESULT_1950_5_P1_STR).unwrap(), *RACE_RESULT_1950_5_P1);
assert_true!(RACE_RESULT_1998_8_P1.time.is_some());
assert_eq!(serde_json::from_str::<RaceResult>(RACE_RESULT_1998_8_P1_STR).unwrap(), *RACE_RESULT_1998_8_P1);
}
#[test]
#[ignore]
fn get_race_result_buggy_time() {
let result = JOLPICA_MP.get_race_result(Filters::new().season(2023).round(3).finish_pos(15));
assert_eq!(result.unwrap().race_result(), &*RACE_RESULT_2023_3_P15);
let result = JOLPICA_MP.get_race_result(Filters::new().season(1950).round(5).finish_pos(1));
assert_eq!(result.unwrap().race_result(), &*RACE_RESULT_1950_5_P1);
let result = JOLPICA_MP.get_race_result(Filters::new().season(1998).round(8).finish_pos(1));
assert_eq!(result.unwrap().race_result(), &*RACE_RESULT_1998_8_P1);
}
#[test]
fn qualifying_result_2023_4_p3() {
assert_eq!(QUALIFYING_RESULT_2023_4_P3.q1, Some(QualifyingTime::Time(duration_m_s_ms(1, 41, 131))));
let result = serde_json::from_str::<QualifyingResult>(QUALIFYING_RESULT_2023_4_P3_STR);
assert_eq!(result.unwrap(), *QUALIFYING_RESULT_2023_4_P3);
}
#[test]
#[ignore]
fn get_qualifying_result_2023_4_p3() {
let result = JOLPICA_MP.get_qualifying_result(Filters::new().season(2023).round(4).driver_id("perez".into()));
assert_eq!(result.unwrap().qualifying_result(), &*QUALIFYING_RESULT_2023_4_P3);
}
#[test]
fn race_result_1998_8_p1() {
assert_eq!(RACE_RESULT_1998_8_P1.time, Some(RaceTime::lead(duration_millis(5685000))));
let result = serde_json::from_str::<RaceResult>(RACE_RESULT_1998_8_P1_STR);
assert_eq!(result.unwrap(), *RACE_RESULT_1998_8_P1);
}
#[test]
#[ignore]
fn get_race_result_1998_8_p1() {
let result = JOLPICA_MP.get_race_result(Filters::new().season(1998).round(8).finish_pos(1));
assert_eq!(result.unwrap().race_result(), &*RACE_RESULT_1998_8_P1);
}
#[test]
#[ignore]
fn get_qualifying_result_by_qualifying_pos_filter() {
assert!(matches!(
JOLPICA_MP.get_qualifying_result(Filters::new().season(2023).round(4).qualifying_pos(1)),
Err(Error::TooMany)
));
}
#[test]
#[ignore]
fn get_race_result_by_finish_pos_filter_for_non_finishing() {
assert_eq!(RACE_RESULT_2023_4_P20.position, 20);
assert_eq!(RACE_RESULT_2023_4_P20.position_text, Position::R);
assert!(matches!(
JOLPICA_MP.get_race_result(Filters::new().season(2023).round(4).finish_pos(20)),
Err(Error::NotFound)
));
}
#[test]
fn race_result_2020_9_p1_workaround() {
assert_eq!(
serde_json::from_str::<Proxy>(r#"{"millis": "8375059", "time": "2:19:35.060"}"#).unwrap(),
Proxy::new(RaceTime::lead(duration_millis(8375060)))
);
let result = serde_json::from_str::<RaceResult>(RACE_RESULT_2020_9_P1_STR);
assert_eq!(result.unwrap(), *RACE_RESULT_2020_9_P1);
}
#[test]
fn race_result_2020_9_p1_error_not_using_deserialize_with() {
let result = serde_json::from_str::<RaceTime>(r#"{"millis": "8375059", "time": "2:19:35.060"}"#);
assert!(matches!(result, Err(serde_json::Error { .. })));
let err_msg = format!("{}", result.unwrap_err());
assert!(err_msg.contains("Non-delta 'time: 2:19:35.060' must match 'millis: 8375059'"));
}
#[test]
#[ignore]
fn get_race_result_2020_9_p1() {
let result = JOLPICA_MP.get_race_result(Filters::new().season(2020).round(9).finish_pos(1));
assert_eq!(result.unwrap().race_result(), &*RACE_RESULT_2020_9_P1);
}
}