use prov_graph::meta::{Mapping, Value};
use prov_views::{Grain, Grouping, ViewSpec, views_from};
const DECLARED: &str = "\
daily:
label: Daily
icon: calendar
group: [date_of_document, created, updated]
by: year
under: '[Daily](id:abc1234)'
nest: year
people:
label: People
icon: person.2
group: people
places:
label: Places
icon: mappin.and.ellipse
group: places
tags:
label: Tags
icon: tag
group: tags
audience:
label: Audience
icon: eye
group: audience
";
fn parse_block(yaml: &str) -> Value {
let mut config = Mapping::new();
config.insert(
"views".into(),
prov_graph::meta::parse_value(yaml, prov_graph::Format::Yaml).expect("the fixture parses"),
);
Value::Mapping(config)
}
#[test]
fn all_five_diaryx_facets_express_as_declared_views() {
let config = parse_block(DECLARED);
let views = views_from(config.as_mapping().unwrap());
assert_eq!(
views.iter().map(|v| v.name.as_str()).collect::<Vec<_>>(),
["daily", "people", "places", "tags", "audience"],
"every facet expresses, in declaration order"
);
let daily = &views[0];
assert_eq!(
daily.group,
Grouping {
keys: vec![
"date_of_document".into(),
"created".into(),
"updated".into()
],
by: Some(Grain::Year),
}
);
assert_eq!(daily.under.as_deref(), Some("[Daily](id:abc1234)"));
assert_eq!(daily.nest, Some(Grain::Year));
for (view, key) in views[1..]
.iter()
.zip(["people", "places", "tags", "audience"])
{
assert_eq!(view.group, Grouping::field(key), "{key}");
assert_eq!(view.group.by, None, "{key} does not cut");
assert_eq!(view.under, None, "{key} is unscoped, as the app's was");
}
}
#[test]
fn the_five_survive_a_round_trip_with_nothing_dropped() {
let config = parse_block(DECLARED);
let views = views_from(config.as_mapping().unwrap());
for view in &views {
let back = ViewSpec::parse(&view.name, &Value::Mapping(view.to_mapping()))
.expect("a declared view re-reads as one");
assert_eq!(&back, view, "{} lost something", view.name);
}
}
#[test]
fn the_retired_date_token_is_now_an_ordinary_field_name() {
let config = parse_block("legacy:\n group: date\n");
let views = views_from(config.as_mapping().unwrap());
assert_eq!(views.len(), 1);
assert_eq!(views[0].group, Grouping::field("date"));
let mut doc = Mapping::new();
doc.insert(
"date_of_document".into(),
Value::String("2026-07-24".into()),
);
assert!(
views[0].group.keys_of(&Value::Mapping(doc)).is_empty(),
"it reads the field it names, and no chain behind it"
);
}