external-agent-sessions/src/ledger_tests.rs
85 lines
use super::CompletedExternalAgentSessionImport;use super::ImportedExternalAgentSessionLedger;use super::record_completed_session_imports;use codex_protocol::ThreadId;use sha2::Digest;use sha2::Sha256;use tempfile::TempDir;#[test]fn empty_ledger_does_not_read_source() { let root = TempDir::new().expect("tempdir"); let missing_source = root.path().join("missing-session.jsonl"); assert!( !ImportedExternalAgentSessionLedger::default() .contains_current_source(&missing_source) .expect("empty ledger cannot contain sources") );}#[test]fn completed_imports_do_not_read_source_files() { let root = TempDir::new().expect("tempdir"); let codex_home = root.path().join("codex-home"); let source_path = root.path().join("session.jsonl"); let contents = b"session contents"; std::fs::write(&source_path, contents).expect("source"); let source_path = std::fs::canonicalize(&source_path).expect("canonical source"); std::fs::remove_file(&source_path).expect("remove source"); let imported_thread_id = ThreadId::new(); record_completed_session_imports( &codex_home, vec![CompletedExternalAgentSessionImport { source_path: source_path.clone(), source_content_sha256: format!("{:x}", Sha256::digest(contents)), imported_thread_id, }], ) .expect("record completed imports"); let ledger = super::load_import_ledger(&codex_home).expect("ledger"); assert_eq!(ledger.records.len(), 1); assert_eq!(ledger.records[0].source_path, source_path); assert_eq!(ledger.records[0].imported_thread_id, imported_thread_id); assert_eq!(ledger.records[0].source_modified_at, None);}#[test]fn completed_import_refreshes_existing_record_metadata() { let root = TempDir::new().expect("tempdir"); let codex_home = root.path().join("codex-home"); let source_path = root.path().join("session.jsonl"); let contents = b"session contents"; std::fs::write(&source_path, contents).expect("source"); let source_path = std::fs::canonicalize(source_path).expect("canonical source"); let content_sha256 = format!("{:x}", Sha256::digest(contents)); let first_thread_id = ThreadId::new(); let second_thread_id = ThreadId::new(); record_completed_session_imports( &codex_home, vec![CompletedExternalAgentSessionImport { source_path: source_path.clone(), source_content_sha256: content_sha256.clone(), imported_thread_id: first_thread_id, }], ) .expect("record first import"); record_completed_session_imports( &codex_home, vec![CompletedExternalAgentSessionImport { source_path: source_path.clone(), source_content_sha256: content_sha256, imported_thread_id: second_thread_id, }], ) .expect("record replacement import"); let ledger = super::load_import_ledger(&codex_home).expect("ledger"); assert_eq!(ledger.records.len(), 1); assert_eq!(ledger.records[0].source_path, source_path); assert_eq!(ledger.records[0].imported_thread_id, second_thread_id); assert!(ledger.records[0].source_modified_at.is_some());}