tea-session-sqlite 0.1.0

Durable SQLite session store for tea-rs
Documentation
use std::str::FromStr;

use tea_protocol::{
    ProfileId, ProtocolMetadata, ProtocolTimestamp, RecordEnvelope, RecordId, SessionId,
    SessionRecord, SessionSequence,
};
use tea_session::{AppendTransaction, SessionCatalog, SessionName, SessionStore};
use tea_session_sqlite::SqliteSessionStore;

const NOW: &str = "2026-07-24T09:30:12.125Z";

fn session_id() -> SessionId {
    SessionId::from_str("0195a0b1-5e3a-7000-8000-000000000011").unwrap()
}

fn creation() -> RecordEnvelope {
    RecordEnvelope::new(
        RecordId::from_str("0195a0b1-5e4a-7000-8000-000000000011").unwrap(),
        session_id(),
        SessionSequence::new(0),
        ProtocolTimestamp::from_str(NOW).unwrap(),
        None,
        None,
        None,
        ProtocolMetadata::default(),
        SessionRecord::SessionCreated {
            profile_id: ProfileId::from_str("coding").unwrap(),
            metadata: ProtocolMetadata::default(),
        },
    )
    .unwrap()
}

#[tokio::test]
async fn sqlite_catalog_name_and_listing_survive_reopen() {
    let path = format!("/tmp/tea-catalog-{}.sqlite", std::process::id());
    let _ = std::fs::remove_file(&path);
    {
        let store = SqliteSessionStore::open(&path).unwrap();
        store
            .append(AppendTransaction::new(session_id(), None, vec![creation()]))
            .await
            .unwrap();
        store
            .set_session_name(
                session_id(),
                Some(SessionName::new("Persistent CLI").unwrap()),
            )
            .await
            .unwrap();
    }

    let reopened = SqliteSessionStore::open(&path).unwrap();
    let sessions = reopened.list_sessions().await.unwrap();
    assert_eq!(sessions.len(), 1);
    assert_eq!(sessions[0].session_id(), session_id());
    assert_eq!(sessions[0].name().unwrap().as_str(), "Persistent CLI");
    assert_eq!(reopened.schema_version(), 1);
    let _ = std::fs::remove_file(path);
}