relay-knowledge 1.1.17

Graph-database-based knowledge graph project.
Documentation
use std::{
    fs,
    path::PathBuf,
    sync::atomic::{AtomicU64, Ordering},
    time::{SystemTime, UNIX_EPOCH},
};

use super::{remove, status, upsert};
use crate::{
    domain::CodeRepositoryRegistration,
    env::{EnvironmentConfig, PlatformKind},
    paths::RuntimePaths,
};

static TEMP_DIR_COUNTER: AtomicU64 = AtomicU64::new(0);

#[tokio::test]
async fn repository_lifecycle_preserves_alias_and_removes_catalog_routing() {
    let store = partitioned_store("repository-lifecycle");
    let registration = CodeRepositoryRegistration::new(
        "repo-id",
        "fixture-alias",
        "/tmp/fixture",
        Vec::new(),
        Vec::new(),
    )
    .expect("registration should validate");

    let registered = upsert(&store, registration)
        .await
        .expect("repository should register in control and shard stores");
    assert_eq!(registered.alias, "fixture-alias");
    assert_eq!(
        status(&store, "fixture-alias".to_owned())
            .await
            .expect("repository status should load")
            .expect("registered repository should exist")
            .alias,
        "fixture-alias"
    );

    let removed = remove(&store, "fixture-alias".to_owned(), 10)
        .await
        .expect("repository removal should succeed");
    assert!(removed.is_some());
    assert!(
        status(&store, "fixture-alias".to_owned())
            .await
            .expect("removed repository lookup should succeed")
            .is_none()
    );
}

fn partitioned_store(name: &str) -> super::super::PartitionedSqliteKnowledgeStore {
    let root = unique_temp_dir(name);
    let environment = EnvironmentConfig::from_pairs(
        PlatformKind::current(),
        [(
            "RELAY_KNOWLEDGE_HOME",
            root.to_str().expect("temp root should be UTF-8"),
        )],
    )
    .expect("environment should parse");
    let paths =
        RuntimePaths::resolve(&environment.platform, &environment.paths).expect("paths resolve");
    super::super::PartitionedSqliteKnowledgeStore::open(paths.database_file(), paths)
        .expect("store should open")
}

fn unique_temp_dir(name: &str) -> PathBuf {
    let nanos = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .expect("clock should be after epoch")
        .as_nanos();
    let sequence = TEMP_DIR_COUNTER.fetch_add(1, Ordering::Relaxed);
    let path = std::env::temp_dir().join(format!(
        "relay-knowledge-partitioned-{name}-{}-{nanos}-{sequence}",
        std::process::id()
    ));
    let _ = fs::remove_dir_all(&path);
    path
}