lepiter-core 0.7.0

core parser and lazy index api for lepiter knowledge bases
Documentation
use std::path::PathBuf;

use anyhow::Result;
use lepiter_core::{KnowledgeBase, Node, render_page_to_text};

fn fixtures_dir() -> PathBuf {
    PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("tests")
        .join("fixtures")
        .join("corpus")
}

fn first_page_id(index: &lepiter_core::KnowledgeBaseIndex) -> Option<String> {
    index.sorted_pages().first().map(|m| m.id.clone())
}

#[test]
fn golden_parse_page_has_content() -> Result<()> {
    let index = KnowledgeBase::open(fixtures_dir())?;
    let Some(id) = first_page_id(&index) else {
        panic!("expected at least one page in checked-in fixture corpus");
    };
    let page = index.load_page(&id)?;
    assert!(!page.content.is_empty());
    Ok(())
}

#[test]
fn corpus_parse_does_not_panic_and_preserves_unknown() -> Result<()> {
    let index = KnowledgeBase::open(fixtures_dir())?;
    let mut saw_unknown = false;
    let mut parsed_pages = 0usize;

    for id in index.pages.keys() {
        let page = index.load_page(id)?;
        parsed_pages += 1;
        for node in page.content {
            if matches!(node, Node::Unknown { .. }) {
                saw_unknown = true;
                break;
            }
        }
    }

    assert!(
        parsed_pages > 0,
        "expected at least one page in fixture corpus"
    );
    assert!(
        saw_unknown,
        "expected checked-in fixtures to include unknown node types"
    );
    Ok(())
}

#[test]
fn render_smoke_test() -> Result<()> {
    let index = KnowledgeBase::open(fixtures_dir())?;
    let Some(id) = first_page_id(&index) else {
        panic!("expected at least one page in checked-in fixture corpus");
    };
    let page = index.load_page(&id)?;
    let rendered = render_page_to_text(&page);
    assert!(!rendered.trim().is_empty());
    Ok(())
}