relay-knowledge 1.1.16

Graph-database-based knowledge graph project.
Documentation
use std::time::{SystemTime, UNIX_EPOCH};

use super::*;

#[test]
fn root_search_walks_up_to_git_marker() {
    let root = temp_root("git-marker");
    let nested = root.join("src").join("module");
    fs::create_dir_all(root.join(".git")).expect("git marker should create");
    fs::create_dir_all(&nested).expect("nested dir should create");

    let discovered = discover_repository_root(&nested)
        .expect("search should succeed")
        .expect("root should be found");

    assert_eq!(discovered, root);
    let _ = fs::remove_dir_all(discovered);
}

#[test]
fn root_search_walks_up_to_knowledge_contract_directory() {
    let root = temp_root("knowledge-marker");
    let nested = root.join("docs").join("architecture");
    fs::create_dir_all(root.join(crate::project::AGENT_CONTRACT_DIR_NAME))
        .expect("knowledge directory should create");
    fs::write(
        root.join(crate::project::KNOWLEDGE_MAP_RELATIVE_PATH),
        "schema_version: 3",
    )
    .expect("knowledge marker should write");
    fs::create_dir_all(&nested).expect("nested dir should create");

    let discovered = discover_repository_root(&nested)
        .expect("search should succeed")
        .expect("root should be found");

    assert_eq!(discovered, root);
    let _ = fs::remove_dir_all(discovered);
}

#[test]
fn root_search_falls_back_to_nearest_agents_file() {
    let root = temp_root("agents-marker");
    let nested = root.join("src").join("module");
    fs::create_dir_all(&nested).expect("nested dir should create");
    fs::write(
        root.join("AGENTS.md"),
        "Knowledge map: knowledge/knowledge-map.yaml",
    )
    .expect("agents should write");

    let discovered = discover_repository_root(&nested)
        .expect("search should succeed")
        .expect("root should be found");

    assert_eq!(discovered, root);
    let _ = fs::remove_dir_all(discovered);
}

#[test]
fn nested_agents_file_fallback_keeps_nearest_scope() {
    let root = temp_root("nested-agents-marker");
    let scoped = root.join("src");
    let nested = scoped.join("module");
    fs::create_dir_all(&nested).expect("nested dir should create");
    fs::write(root.join("AGENTS.md"), "Workspace instructions.").expect("root agents write");
    fs::write(scoped.join("AGENTS.md"), "Scoped instructions.").expect("scoped agents write");

    let discovered = discover_repository_root(&nested)
        .expect("search should succeed")
        .expect("root should be found");

    assert_eq!(discovered, scoped);
    let _ = fs::remove_dir_all(root);
}

#[test]
fn scoped_agents_file_does_not_override_git_root() {
    let root = temp_root("scoped-agents");
    let nested = root.join("src").join("module");
    fs::create_dir_all(root.join(".git")).expect("git marker should create");
    fs::create_dir_all(&nested).expect("nested dir should create");
    fs::write(nested.join("AGENTS.md"), "Scoped instructions.")
        .expect("scoped agents should write");

    let discovered = discover_repository_root(&nested)
        .expect("search should succeed")
        .expect("root should be found");

    assert_eq!(discovered, root);
    let _ = fs::remove_dir_all(discovered);
}

#[test]
fn missing_markers_return_none() {
    let root = temp_root("missing-marker");
    let nested = root.join("src");
    fs::create_dir_all(&nested).expect("nested dir should create");

    let discovered = discover_repository_root(&nested).expect("search should succeed");

    assert_eq!(discovered, None);
    let _ = fs::remove_dir_all(root);
}

#[test]
fn missing_start_directory_returns_error() {
    let root = temp_root("missing-start");
    let missing = root.join("missing");
    fs::create_dir_all(&root).expect("root should create");

    let error = discover_repository_root(&missing).expect_err("missing start should fail");

    assert!(matches!(
        error,
        RepositoryRootDiscoveryError::StartUnavailable { .. }
    ));
    let _ = fs::remove_dir_all(root);
}

fn temp_root(label: &str) -> PathBuf {
    std::env::temp_dir().join(format!(
        "relay-knowledge-root-{label}-{}",
        SystemTime::now()
            .duration_since(UNIX_EPOCH)
            .expect("time should work")
            .as_nanos()
    ))
}