relay-knowledge 1.1.16

Graph-database-based knowledge graph project.
Documentation
//! Text-only topic extraction tests.

use crate::{
    code::SnapshotBuild,
    domain::{CodeIndexSnapshot, CodeParseStatus, CodeRepositoryRegistration},
};

use super::super::super::text::MAX_TEXT_FILE_BYTES;
use super::super::parse_indexed_file;

#[test]
fn oversized_markdown_text_only_files_keep_late_heading_symbols() {
    let padding = "x".repeat(MAX_TEXT_FILE_BYTES + 128);
    let source = format!("# Intro\n\n{padding}\n## Late Heading\n");
    let snapshot = parse_source_snapshot("docs/spec.md", source.as_bytes());

    assert_eq!(snapshot.files[0].parse_status, CodeParseStatus::TextOnly);
    assert!(
        snapshot
            .symbols
            .iter()
            .any(|symbol| symbol.kind == "heading" && symbol.name == "Late Heading")
    );
    assert!(
        !snapshot
            .chunks
            .iter()
            .any(|chunk| chunk.content.contains("Late Heading")),
        "late heading coverage must not rely on the truncated text chunk"
    );
}

#[test]
fn oversized_knowledge_map_text_only_files_keep_late_topic_symbols() {
    let padding = "x".repeat(MAX_TEXT_FILE_BYTES + 128);
    let source = format!("schema_version: 1\ntopics:\n  # {padding}\n  - id: oversized-topic\n");
    let snapshot = parse_source_snapshot(".knowledge/knowledge-map.yaml", source.as_bytes());

    assert_eq!(snapshot.files[0].parse_status, CodeParseStatus::TextOnly);
    assert!(snapshot.symbols.iter().any(|symbol| {
        symbol.kind == "knowledge_map_topic" && symbol.name == "oversized-topic"
    }));
    assert!(
        !snapshot
            .chunks
            .iter()
            .any(|chunk| chunk.content.contains("oversized-topic")),
        "late topic coverage must not rely on the truncated text chunk"
    );
}

#[test]
fn oversized_knowledge_map_text_only_files_ignore_nested_sequence_ids() {
    let padding = "x".repeat(MAX_TEXT_FILE_BYTES + 128);
    let source = format!(
        "schema_version: 1\ntopics:\n  - id: real-topic\n    related:\n      # {padding}\n      - id: nested-topic\n"
    );
    let snapshot = parse_source_snapshot(".knowledge/knowledge-map.yaml", source.as_bytes());

    assert_eq!(snapshot.files[0].parse_status, CodeParseStatus::TextOnly);
    assert!(
        snapshot
            .symbols
            .iter()
            .any(|symbol| symbol.kind == "knowledge_map_topic" && symbol.name == "real-topic")
    );
    assert!(
        !snapshot
            .symbols
            .iter()
            .any(|symbol| symbol.kind == "knowledge_map_topic" && symbol.name == "nested-topic")
    );
}

#[test]
fn text_only_topic_scan_preserves_valid_lines_after_invalid_utf8() {
    let snapshot = parse_source_snapshot("docs/spec.md", b"\xFF\n## Late Heading\n");

    assert_eq!(snapshot.files[0].parse_status, CodeParseStatus::TextOnly);
    assert!(
        snapshot
            .symbols
            .iter()
            .any(|symbol| symbol.kind == "heading" && symbol.name == "Late Heading")
    );
}

#[test]
fn knowledge_map_scan_preserves_facts_after_an_invalid_utf8_line() {
    let snapshot = parse_source_snapshot(
        ".knowledge/knowledge-map.yaml",
        b"schema_version: 1\n# \xFF\ntopics:\n  - id: retained-topic\n",
    );

    assert!(
        snapshot.symbols.iter().any(|symbol| {
            symbol.kind == "knowledge_map_topic" && symbol.name == "retained-topic"
        })
    );
}

#[test]
fn knowledge_map_scan_isolates_a_syntactically_significant_invalid_utf8_line() {
    let snapshot = parse_source_snapshot(
        ".knowledge/knowledge-map.yaml",
        b"schema_version: 1\n\xFF: [\ntopics:\n  - id: retained-topic\n",
    );

    assert!(
        snapshot.symbols.iter().any(|symbol| {
            symbol.kind == "knowledge_map_topic" && symbol.name == "retained-topic"
        })
    );
}

fn parse_source_snapshot(path: &str, source: &[u8]) -> CodeIndexSnapshot {
    let registration =
        CodeRepositoryRegistration::new("repo", "alias", "/tmp/repo", Vec::new(), Vec::new())
            .expect("registration should validate");
    let mut build = SnapshotBuild::new(
        &registration,
        "commit".to_owned(),
        "tree".to_owned(),
        true,
        1,
        0,
    );
    parse_indexed_file(&mut build, path, source).expect("file should parse");
    build.finish()
}