bcode_session 0.0.1-alpha.0

Session lifecycle and attachment management for bcode
use super::*;

#[tokio::test]
async fn occupancy_initialization_preserves_existing_rows_and_uses_filtered_epoch() {
    let temp = tempfile::tempdir().unwrap();
    let db = crate::db_connection::init_turso_local_with_retry(&temp.path().join("schema.db"))
        .await
        .unwrap();
    db.create_table("events")
        .column(schema_column("event_seq", DataType::Int, false))
        .primary_key("event_seq")
        .column(schema_column("event_type", DataType::Text, false))
        .execute(&*db)
        .await
        .unwrap();
    db.create_table("projection_checkpoints")
        .column(schema_column("projection_name", DataType::Text, false))
        .primary_key("projection_name")
        .column(schema_column("last_event_seq", DataType::Int, false))
        .column(schema_column("projection_version", DataType::Int, false))
        .column(schema_column("updated_at_ms", DataType::Int, false))
        .execute(&*db)
        .await
        .unwrap();
    for (seq, kind) in [
        (2, "model_changed"),
        (8, "context_compacted"),
        (13, "other"),
    ] {
        db.insert("events")
            .value("event_seq", seq)
            .value("event_type", kind)
            .execute(&*db)
            .await
            .unwrap();
    }
    InitializeOccupancy.execute(&*db).await.unwrap();
    let row = db
        .select("context_occupancy_projection")
        .execute_first(&*db)
        .await
        .unwrap()
        .unwrap();
    assert_eq!(row.get("context_epoch"), Some(DatabaseValue::Int64(8)));
    let checkpoint = db
        .select("projection_checkpoints")
        .execute_first(&*db)
        .await
        .unwrap()
        .unwrap();
    assert_eq!(
        checkpoint.get("last_event_seq"),
        Some(DatabaseValue::Int64(13))
    );
    db.update("context_occupancy_projection")
        .value("schema_version", 99)
        .execute(&*db)
        .await
        .unwrap();
    InitializeOccupancy.execute(&*db).await.unwrap();
    let row = db
        .select("context_occupancy_projection")
        .execute_first(&*db)
        .await
        .unwrap()
        .unwrap();
    assert_eq!(row.get("schema_version"), Some(DatabaseValue::Int64(99)));
    db.close().await.unwrap();
}