mod adopt;
mod convert;
mod create;
pub(crate) mod delete;
mod duplicate;
pub(crate) mod maintain;
mod recycle;
mod rename;
mod reparent;
mod retitle;
mod save;
mod separate;
pub use create::Created;
pub use delete::Diagnosis;
pub use reparent::Reparented;
pub use save::ContentState;
#[cfg(all(test, feature = "yaml"))]
mod support;
#[cfg(all(test, feature = "yaml"))]
mod properties;
#[cfg(all(test, feature = "yaml"))]
mod tests {
use super::support::*;
use crate::identity::Trigger;
use std::path::{Path, PathBuf};
#[test]
fn scan_ids_rebuilds_the_id_map_from_frontmatter() {
let dir = tempdir("scan-ids");
write(
&dir,
"index.md",
"---\ntitle: Root\nid: aaaaaaa\n---\nbody\n",
);
write(
&dir,
"sub/child.md",
"---\ntitle: Child\nid: bbbbbbb\n---\nbody\n",
);
write(&dir, "sub/plain.md", "---\ntitle: Plain\n---\nbody\n");
let mut ids = block_on(ws(&dir).scan_ids()).unwrap();
ids.sort_by(|a, b| a.0.0.cmp(&b.0.0));
assert_eq!(
ids,
vec![
(
prov_graph::identity::Id("aaaaaaa".into()),
PathBuf::from("index.md")
),
(
prov_graph::identity::Id("bbbbbbb".into()),
PathBuf::from("sub/child.md")
),
]
);
}
#[test]
fn config_pointer_resolves_and_reads_a_setting() {
let dir = tempdir("config");
write(
&dir,
"index.md",
"---\ntitle: Root\nconfig: prov.yaml\n---\n",
);
write(
&dir,
"prov.yaml",
"title: prov config\npart_of: index.md\nlink_format: plain_relative\n",
);
let ws = ws(&dir);
assert_eq!(
block_on(ws.config_path(Path::new("index.md"))).unwrap(),
Some(PathBuf::from("prov.yaml"))
);
let value = block_on(ws.config_get(Path::new("index.md"), "link_format")).unwrap();
assert_eq!(
value.and_then(|v| v.as_str().map(str::to_owned)),
Some("plain_relative".into())
);
assert!(
block_on(ws.config_get(Path::new("index.md"), "missing"))
.unwrap()
.is_none()
);
write(&dir, "bare.md", "---\ntitle: Bare\n---\n");
assert!(
block_on(ws.config_path(Path::new("bare.md")))
.unwrap()
.is_none()
);
}
#[test]
fn register_is_idempotent_and_policy_gated() {
let dir = tempdir("id-register");
write(&dir, "a.md", "---\ntitle: A\n---\n");
let mut w = id_ws(&dir);
let first = block_on(w.register(Path::new("a.md"), Trigger::Link)).unwrap();
let again = block_on(w.register(Path::new("a.md"), Trigger::Link)).unwrap();
assert_eq!(first, again, "idempotent");
assert!(prov_graph::identity::verify(first.as_str()));
write(&dir, "b.md", "---\ntitle: B\n---\n");
let err = block_on(w.register(Path::new("b.md"), Trigger::Create)).unwrap_err();
assert!(err.to_string().contains("does not register"), "{err}");
}
}