#[path = "helpers/mod.rs"]
mod helpers;
use helpers::{build_app, call_vault_trace, sign_token};
async fn build_trace_test_state_with_links(n: usize) -> (helpers::TestEnv, String, Vec<String>) {
let env = build_app().await;
let token = sign_token(&env.state);
let mut ids: Vec<String> = Vec::with_capacity(n);
for i in 0..n {
let title = format!("TraceParallelNote {i}");
let body = format!("vault_trace_parallel_seed_{i} test content");
let nid = env.write_note_with_h1(&title, &body).await;
ids.push(nid.to_string());
}
for i in 0..n {
let src = &ids[i];
let dst = &ids[(i + 1) % n];
env.state
.search
.upsert_link("main", src, dst)
.await
.expect("upsert_link cycle");
}
(env, token, ids)
}
#[tokio::test]
async fn vault_trace_parallel_seeds_returns_same_as_serial() {
let (env, token, ids) = build_trace_test_state_with_links(3).await;
let resp = call_vault_trace(
env.app.clone(),
&token,
"vault_trace_parallel_seed",
"main",
20,
)
.await
.expect("vault_trace parallèle 3 seeds doit retourner 200");
let entries = resp["entries"]
.as_array()
.expect("entries doit être un tableau JSON");
let returned_ids: std::collections::HashSet<&str> =
entries.iter().filter_map(|e| e["path"].as_str()).collect();
assert!(
returned_ids.contains(ids[1].as_str()),
"parallel vault_trace doit retourner ids[1] dans le lineage de ids[0] — returned={returned_ids:?}, ids={ids:?}"
);
assert!(
returned_ids.contains(ids[2].as_str()),
"parallel vault_trace doit retourner ids[2] dans le lineage de ids[1] — returned={returned_ids:?}, ids={ids:?}"
);
assert_eq!(
entries.len(),
3,
"3 seeds traversés en parallèle doivent retourner exactement 3 entries (cycle) — entries={entries:?}"
);
}
#[tokio::test]
async fn vault_trace_ulid_fast_path_unaffected() {
let env = build_app().await;
let token = sign_token(&env.state);
let id_src = env
.write_note_with_h1("TraceFastPathSource", "contenu source ulid fast path")
.await;
let id_child = env
.write_note_with_h1("TraceFastPathChild", "contenu enfant ulid fast path")
.await;
env.state
.search
.upsert_link("main", &id_src.to_string(), &id_child.to_string())
.await
.expect("upsert_link src → child");
let resp = call_vault_trace(env.app.clone(), &token, &id_src.to_string(), "main", 10)
.await
.expect("vault_trace ULID fast-path doit retourner 200");
let entries = resp["entries"]
.as_array()
.expect("entries doit être un tableau JSON");
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())),
"ULID fast-path : id_child manquant dans vault_trace — paths={paths:?}"
);
}