use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use crate::ReleaseId;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct ReleaseDate {
pub release_id: ReleaseId,
#[serde(default)]
pub release_name: Option<String>,
pub date: NaiveDate,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct ReleaseDatesResults {
pub count: u32,
pub offset: u32,
pub limit: u32,
pub release_dates: Vec<ReleaseDate>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deserializes_a_named_release_date() {
let date: ReleaseDate = serde_json::from_str(
r#"{"release_id":9,"release_name":"Advance Monthly Sales for Retail and Food Services","date":"2013-08-13"}"#,
)
.unwrap();
assert_eq!(date.release_id, ReleaseId::new(9));
assert_eq!(
date.release_name.as_deref(),
Some("Advance Monthly Sales for Retail and Food Services")
);
assert_eq!(date.date, NaiveDate::from_ymd_opt(2013, 8, 13).unwrap());
}
#[test]
fn release_date_without_name_defaults_to_none() {
let date: ReleaseDate =
serde_json::from_str(r#"{"release_id":82,"date":"1997-02-10"}"#).unwrap();
assert_eq!(date.release_id, ReleaseId::new(82));
assert!(date.release_name.is_none());
assert_eq!(date.date, NaiveDate::from_ymd_opt(1997, 2, 10).unwrap());
}
#[test]
fn results_carry_pagination() {
let results: ReleaseDatesResults = serde_json::from_str(
r#"{"count":2,"offset":0,"limit":1000,"release_dates":[
{"release_id":9,"release_name":"Advance Monthly Sales","date":"2013-08-13"},
{"release_id":10,"release_name":"Consumer Price Index","date":"2013-08-15"}
]}"#,
)
.unwrap();
assert_eq!(results.count, 2);
assert_eq!(results.release_dates.len(), 2);
assert_eq!(results.release_dates[1].release_id, ReleaseId::new(10));
}
}