use code_kb_core::{
Workspace, find_julie_extract_binary, find_references_scoped, open_read_only, safe_tempdir,
scan_workspace,
};
use std::fs;
fn scanned_repo(files: &[(&str, &str)]) -> (tempfile::TempDir, std::path::PathBuf) {
find_julie_extract_binary().expect("julie-extract binary must be present for tests");
let temp_dir = safe_tempdir();
let root = temp_dir.path().to_path_buf();
for (path, content) in files {
let full = root.join(path);
fs::create_dir_all(full.parent().unwrap()).unwrap();
fs::write(full, content).unwrap();
}
let db_path = root.join(".code-kb").join("artifact.db");
scan_workspace(&Workspace::new(root), &db_path, true).expect("scan failed");
(temp_dir, db_path)
}
#[test]
fn find_references_reports_type_usages_of_a_struct() {
let (_repo, db_path) = scanned_repo(&[
(
"src/config.rs",
"pub struct Config {\n pub path: String,\n}\n",
),
(
"src/loader.rs",
"use crate::config::Config;\n\npub fn load(existing: &Config) -> String {\n existing.path.clone()\n}\n",
),
]);
let conn = open_read_only(&db_path).unwrap();
let refs = find_references_scoped(&conn, "Config", "callers", 20, false, None).unwrap();
let type_usage = refs
.iter()
.find(|r| r.kind == "type_usage")
.unwrap_or_else(|| panic!("expected a type_usage reference, got {refs:?}"));
assert_eq!(type_usage.from_symbol_name, "load");
assert_eq!(type_usage.path, "src/loader.rs");
assert_eq!(type_usage.start_line, Some(3));
}
#[test]
fn find_references_reports_member_accesses_of_a_field() {
let (_repo, db_path) = scanned_repo(&[
(
"src/config.rs",
"pub struct Config {\n pub path: String,\n}\n",
),
(
"src/loader.rs",
"use crate::config::Config;\n\npub fn load(existing: &Config) -> String {\n existing.path.clone()\n}\n",
),
]);
let conn = open_read_only(&db_path).unwrap();
let refs = find_references_scoped(&conn, "path", "callers", 20, false, None).unwrap();
let access = refs
.iter()
.find(|r| r.kind == "member_access")
.unwrap_or_else(|| panic!("expected a member_access reference, got {refs:?}"));
assert_eq!(access.from_symbol_name, "load");
assert_eq!(access.start_line, Some(4));
}