#[path = "helpers/mod.rs"]
mod helpers;
use helpers::{build_app, call_vault_trace, sign_token};
#[tokio::test]
async fn vault_trace_accepts_text_query_and_returns_trace_entries() {
let env = build_app().await;
let token = sign_token(&env.state);
let id_a = env
.write_note_with_h1(
"Architecture Gradatum",
"Description complète de l'architecture du système.",
)
.await;
let id_b = env
.write_note_with_h1(
"Notes Voisines XYZ",
"Document lié à l'architecture du projet.",
)
.await;
env.state
.search
.upsert_link("main", &id_b.to_string(), &id_a.to_string())
.await
.expect("upsert_link B → A");
let resp = call_vault_trace(env.app.clone(), &token, "architecture", "main", 10)
.await
.expect("vault_trace textuel doit réussir");
let entries = resp["entries"].as_array().expect("entries array");
assert!(
!entries.is_empty(),
"vault_trace textuel retourne 0 entrées — resp={resp}"
);
}
#[tokio::test]
async fn vault_trace_ulid_still_works_after_m4_patch() {
let env = build_app().await;
let token = sign_token(&env.state);
let id_a = env.write_note_with_h1("Note A", "Contenu A").await;
let id_b = env.write_note_with_h1("Note B", "Contenu B").await;
env.state
.search
.upsert_link("main", &id_a.to_string(), &id_b.to_string())
.await
.expect("upsert_link A → B");
let resp = call_vault_trace(env.app.clone(), &token, &id_a.to_string(), "main", 10)
.await
.expect("vault_trace ULID doit réussir");
let entries = resp["entries"].as_array().expect("entries array");
let paths: Vec<&str> = entries.iter().filter_map(|e| e["path"].as_str()).collect();
assert!(
paths.iter().any(|p| p.contains(&id_b.to_string())),
"enfant id_b manquant dans vault_trace ULID — paths={paths:?}"
);
}
#[tokio::test]
async fn vault_trace_text_query_no_match_returns_empty() {
let env = build_app().await;
let token = sign_token(&env.state);
let resp = call_vault_trace(
env.app.clone(),
&token,
"requete totalement inexistante xyzzy",
"main",
10,
)
.await
.expect("vault_trace sans match doit réussir HTTP 200");
let entries = resp["entries"].as_array().expect("entries array");
assert!(
entries.is_empty(),
"vault_trace sans match doit retourner [] — resp={resp}"
);
}
#[tokio::test]
async fn vault_trace_resolves_title_to_lineage() {
let env = build_app().await;
let token = sign_token(&env.state);
let id_root = env
.write_note_with_h1("Mon Titre Exact", "body root note")
.await;
let id_child = env.write_note_with_h1("Note Enfant Y", "lien enfant").await;
env.state
.search
.upsert_link("main", &id_root.to_string(), &id_child.to_string())
.await
.expect("upsert_link root → child");
let resp = call_vault_trace(env.app.clone(), &token, "Mon Titre Exact", "main", 10)
.await
.expect("vault_trace titre exact doit réussir");
let entries = resp["entries"].as_array().expect("entries array");
let paths: Vec<&str> = entries.iter().filter_map(|e| e["path"].as_str()).collect();
assert!(
paths.iter().any(|p| p.contains(&id_child.to_string())),
"enfant via titre exact manquant — paths={paths:?}"
);
}