gobby-code 1.3.3

Fast Rust CLI for Gobby's code index — AST-aware search, symbol navigation, and dependency graph
Documentation
use std::collections::BTreeMap;

use super::support::*;
use super::*;

#[test]
fn codewiki_onboarding_ranks_modules_from_graph_analytics() {
    let input = CodewikiInput {
        leading_chunks: std::collections::BTreeMap::new(),
        files: vec![
            "src/main.rs".to_string(),
            "src/lib.rs".to_string(),
            "src/api/handler.rs".to_string(),
            "src/domain/service.rs".to_string(),
            "src/storage/repo.rs".to_string(),
        ],
        graph_edges: vec![
            CodewikiGraphEdge::import(
                test_component_id("src/api/handler.rs", "handle", "function"),
                test_component_id("src/domain/service.rs", "Service", "class"),
            ),
            CodewikiGraphEdge::import(
                test_component_id("src/domain/service.rs", "Service", "class"),
                test_component_id("src/storage/repo.rs", "Repo", "class"),
            ),
        ],
        graph_availability: CodewikiGraphAvailability::Available,
        symbols: vec![
            test_symbol("src/main.rs", "main", "function", 1, "fn main()"),
            test_symbol("src/lib.rs", "Client", "class", 1, "pub struct Client;"),
            test_symbol(
                "src/api/handler.rs",
                "handle",
                "function",
                1,
                "pub fn handle()",
            ),
            test_symbol(
                "src/domain/service.rs",
                "Service",
                "class",
                1,
                "pub struct Service;",
            ),
            test_symbol(
                "src/storage/repo.rs",
                "Repo",
                "class",
                1,
                "pub struct Repo;",
            ),
        ],
    };

    let docs = generate_hierarchical_docs(&input, None)
        .into_iter()
        .collect::<BTreeMap<_, _>>();
    let onboarding = docs
        .get("code/_onboarding.md")
        .expect("onboarding page renders");

    assert!(onboarding.contains("type: code_onboarding"));
    assert!(!onboarding.contains("degraded: true"));
    assert!(onboarding.contains("[[code/files/src/main.rs|src/main.rs]]"));
    assert!(onboarding.contains("[[code/files/src/lib.rs|src/lib.rs]]"));
    assert!(onboarding.contains("`pub struct Client;`"));
    assert!(onboarding.contains("## Recommended Reading Order"));

    let domain = onboarding
        .find("[[code/modules/src/domain|src/domain]]")
        .expect("domain module is recommended");
    let api = onboarding
        .find("[[code/modules/src/api|src/api]]")
        .expect("api module is recommended");
    let storage = onboarding
        .find("[[code/modules/src/storage|src/storage]]")
        .expect("storage module is recommended");
    assert!(domain < api);
    assert!(domain < storage);
}

#[test]
fn codewiki_onboarding_keeps_entry_points_without_degrading_when_graph_analytics_unavailable() {
    let input = CodewikiInput {
        leading_chunks: std::collections::BTreeMap::new(),
        files: vec!["src/main.rs".to_string(), "src/lib.rs".to_string()],
        graph_edges: Vec::new(),
        graph_availability: CodewikiGraphAvailability::Unavailable,
        symbols: vec![
            test_symbol("src/main.rs", "main", "function", 1, "fn main()"),
            test_symbol("src/lib.rs", "Client", "class", 1, "pub struct Client;"),
        ],
    };

    let docs = generate_hierarchical_docs(&input, None)
        .into_iter()
        .collect::<BTreeMap<_, _>>();
    let onboarding = docs
        .get("code/_onboarding.md")
        .expect("onboarding page renders");

    // Graph availability is informational only: the reading order is omitted
    // when analytics can't run, but Entry Points remain and the page does not
    // degrade.
    assert!(!onboarding.contains("degraded: true"));
    assert!(!onboarding.contains("graph-analytics-unavailable"));
    assert!(onboarding.contains("## Entry Points"));
    assert!(!onboarding.contains("## Structural Start Points"));
    assert!(!onboarding.contains("## Recommended Reading Order"));
    assert!(onboarding.contains("[[code/files/src/main.rs|src/main.rs]]"));
    assert!(onboarding.contains("[[code/files/src/lib.rs|src/lib.rs]]"));
}

#[test]
fn codewiki_onboarding_available_empty_reading_order_is_not_unavailable() {
    let input = CodewikiInput {
        leading_chunks: std::collections::BTreeMap::new(),
        files: vec!["src/lib.rs".to_string()],
        graph_edges: Vec::new(),
        graph_availability: CodewikiGraphAvailability::Available,
        symbols: vec![test_symbol(
            "src/lib.rs",
            "Client",
            "class",
            1,
            "pub struct Client;",
        )],
    };

    let docs = generate_hierarchical_docs(&input, None)
        .into_iter()
        .collect::<BTreeMap<_, _>>();
    let onboarding = docs
        .get("code/_onboarding.md")
        .expect("onboarding page renders");

    assert!(!onboarding.contains("degraded: true"));
    assert!(!onboarding.contains("- graph-analytics-unavailable"));
}