use crate::Url;
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
derive_more::AsRef,
derive_more::Display,
derive_more::From,
derive_more::FromStr,
derive_more::Into,
serde::Serialize,
serde::Deserialize,
)]
pub struct AgendaItemUrl(Url);
#[cfg(test)]
mod tests {
use pretty_assertions::assert_eq;
use super::AgendaItemUrl;
#[test]
fn from_str() {
assert_eq!(
AgendaItemUrl(
"https://oparl.example.org/agendaitem/15569"
.parse()
.expect("value must be a parseable url")
),
"https://oparl.example.org/agendaitem/15569"
.parse()
.expect("value must be a parseable id")
);
}
}
#[cfg(test)]
mod serde_tests {
use pretty_assertions::assert_eq;
use serde_json::json;
use super::AgendaItemUrl;
#[test]
fn serialize() {
assert_eq!(
json!(AgendaItemUrl(
"https://oparl.example.org/agendaitem/15569"
.parse()
.expect("value must be a parseable url")
)),
json!("https://oparl.example.org/agendaitem/15569")
);
}
#[test]
fn deserialize_good() {
let deserialized: AgendaItemUrl =
serde_json::from_value(json!("https://oparl.example.org/agendaitem/15569"))
.expect("value must be deserializable as AgendaItemId");
assert_eq!(
deserialized,
AgendaItemUrl(
"https://oparl.example.org/agendaitem/15569"
.parse()
.expect("value must be a parseable url")
)
);
}
#[test]
fn deserialize_bad() {
assert!(serde_json::from_value::<AgendaItemUrl>(json!("xyzabcd")).is_err());
assert!(serde_json::from_value::<AgendaItemUrl>(json!(true)).is_err());
assert!(serde_json::from_value::<AgendaItemUrl>(json!(123)).is_err());
}
}