use toolpath::v1::Graph;
use toolpath_convo::ConversationProvider;
use toolpath_cursor::{CursorConvo, DeriveConfig, derive_path, session_to_view};
#[test]
fn real_cursor_db_round_trips_when_present() {
let mgr = CursorConvo::new();
if !mgr.io().exists() {
eprintln!("note: no Cursor user-data directory; skipping live test");
return;
}
if !mgr.resolver().db_exists() {
eprintln!("note: Cursor user-data exists but no state.vscdb yet; skipping");
return;
}
let ids = match ConversationProvider::list_conversations(&mgr, "") {
Ok(ids) => ids,
Err(e) => {
eprintln!("note: could not list composers from real DB: {e}; skipping");
return;
}
};
eprintln!("note: {} composers found in real DB", ids.len());
if ids.is_empty() {
return;
}
let mut sessions_checked = 0usize;
for id in &ids {
let Ok(session) = mgr.read_session(id) else {
continue;
};
let view = session_to_view(&session);
assert_eq!(view.id, *id, "view.id should equal composer id");
assert_eq!(view.provider_id.as_deref(), Some("cursor"));
assert_eq!(view.session_ids, vec![id.clone()]);
for turn in &view.turns {
assert!(!turn.id.is_empty(), "every turn carries a bubble id");
}
let path = derive_path(&session, &DeriveConfig::default());
assert!(path.path.id.starts_with("path-cursor-"));
let graph = Graph::from_path(path);
let json = graph.to_json().expect("graph should serialize");
let _back = Graph::from_json(&json).expect("graph should round-trip");
sessions_checked += 1;
}
eprintln!("note: validated {sessions_checked} live composers");
}