use bson::Document;
use crate::doc::DatabaseDocument;
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct Webpage {
pub route: String,
pub view: String,
#[serde(flatten)]
pub context: Document,
}
impl DatabaseDocument for Webpage {
const COLLECTION_NAME: &'static str = "pages";
type QueryData = String;
fn gen_query(route: &Self::QueryData) -> Document {
doc! { "route" => route }
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_page() -> Webpage {
Webpage {
route: "index".to_string(),
view: "page".to_string(),
context: doc! { "title" => "Website" },
}
}
#[test]
fn test_to_bson() {
let page = make_page();
let encoded = page.to_bson();
let expected = doc! {
"route" => &page.route,
"view" => &page.view,
"title" => "Website",
};
assert_eq!(
expected, encoded,
"Expected encoded webpage to equal BSON value"
);
}
#[test]
fn test_from_bson() {
let expected = make_page();
let doc: Document = doc! {
"route" => &expected.route,
"view" => &expected.view,
"title" => "Website",
};
let decoded = Webpage::from_bson(doc);
assert!(decoded.is_ok(), "Expected decoding to succeed");
assert_eq!(
expected,
decoded.unwrap(),
"Expected decoded BSON to equal original Webpage"
);
}
}