//! `export.pdf` `include_properties` (SPEC 16): the frontmatter appears as //! drawn page text only when the parameter asks for it. //! //! Exports store text as glyph id runs inside compressed streams; the shared //! `common::pdf::page_text` reader recovers what is actually drawn, so the //! assertions are on real page text, not raw file bytes. mod common; use common::pdf::page_text; use std::path::Path; use common::{seed, temp_vault}; use notescraft_engine::{Registry, Session, register_core}; use serde_json::json; fn fixture(name: &str) -> (common::TempVault, Session, Registry) { let note = "---\ncolor: blue\nsize: 10\n---\n# T\n\nBody\n"; let vault = temp_vault(name); seed(vault.path(), &[("Note.md", note)]); let session = Session::open(vault.path()).unwrap_or_else(|error| panic!("open: {error}")); let mut registry = Registry::new(); register_core(&mut registry).unwrap_or_else(|error| panic!("register: {error}")); (vault, session, registry) } /// The exported file's drawn text. fn drawn(vault: &Path, value: &serde_json::Value) -> String { let pdf = Path::new(value["path"].as_str().unwrap_or_default()); let bytes = std::fs::read(vault.join(pdf)).unwrap_or_else(|error| panic!("read {}: {error}", pdf.display())); assert!(!bytes.is_empty(), "the export produced a file"); page_text(&bytes) } /// The keys of the frontmatter are drawn only with `include_properties`. #[test] fn frontmatter_is_drawn_only_when_asked_for() { let (vault, mut session, registry) = fixture("export-props-on"); let result = registry.run("export.pdf", &mut session, &json!({ "path": "Note.md", "include_properties": true })); let value = result.unwrap_or_else(|error| panic!("{error:?}")); let text = drawn(vault.path(), &value); assert!(text.contains("color"), "the key is rendered as a property row: {text}"); assert!(text.contains("blue"), "and its value too"); assert!(text.contains("size"), "the other key is rendered too"); } /// Without the parameter (or with false) the frontmatter stays hidden. #[test] fn frontmatter_is_hidden_without_the_param() { let (vault, mut session, registry) = fixture("export-props-off"); let result = registry.run("export.pdf", &mut session, &json!({ "path": "Note.md" })); let value = result.unwrap_or_else(|error| panic!("{error:?}")); let text = drawn(vault.path(), &value); assert!(!text.contains("color"), "no property row without `include_properties`: {text}"); assert!(!text.contains("size"), "and none of the other keys either"); } /// A boolean that is not a truth value does not turn the option on; the /// registry validates the parameter kind first. #[test] fn a_bad_param_type_is_refused() { let (_vault, mut session, registry) = fixture("export-props-bad"); let result = registry.run("export.pdf", &mut session, &json!({ "path": "Note.md", "include_properties": "yes" })); assert!(result.is_err(), "a string is not a bool: {result:?}"); }