synd-persistence 0.4.0

Persistence adapters for syndicationd
Documentation
use crate::sqlite::feed_registry::test_support::*;

#[tokio::test]
async fn blob_store_deduplicates_by_uncompressed_digest() -> anyhow::Result<()> {
    let db = migrated_db().await?;
    let created_at = Utc.with_ymd_and_hms(2026, 6, 7, 12, 0, 0).unwrap();
    let mut tx = db.begin().await?;

    let first = tx
        .put_blob(PutBlobCommand::new(b"same payload".to_vec(), created_at))
        .await?;
    let second = tx
        .put_blob(PutBlobCommand::new(b"same payload".to_vec(), created_at))
        .await?;

    assert_eq!(first, second);
    let row = sqlx::query(
        r#"
        SELECT
            COUNT(*) AS count,
            compression_algo,
            uncompressed_len
        FROM blob
        "#,
    )
    .fetch_one(&mut *tx.tx)
    .await?;

    assert_eq!(row.try_get::<i64, _>("count")?, 1);
    assert_eq!(row.try_get::<String, _>("compression_algo")?, "zstd");
    assert_eq!(row.try_get::<i64, _>("uncompressed_len")?, 12);
    assert_eq!(tx.load_blob(first).await?, b"same payload");
    tx.commit().await?;
    Ok(())
}