runledger-postgres 0.5.0

PostgreSQL persistence layer for the Runledger durable job and workflow system
Documentation
use chrono::{TimeZone, Utc};
use runledger_core::jobs::WorkflowType;
use runledger_postgres::jobs::{
    WorkflowRunListFilter, get_latest_workflow_run_by_type, list_workflow_runs,
};
use runledger_test_support::{setup_ephemeral_pool, teardown_ephemeral_pool};
use serde_json::json;
use sqlx::types::Uuid;

#[tokio::test]
async fn workflow_run_reads_break_created_at_ties_by_id_desc() {
    let (pool, database) = setup_ephemeral_pool("postgres_workflow_ordering", 4).await;
    let workflow_type = "workflow.test.ordering";
    let created_at = Utc
        .with_ymd_and_hms(2026, 6, 18, 12, 0, 0)
        .single()
        .expect("valid timestamp");
    let older_id = Uuid::from_u128(1);
    let newer_id = Uuid::from_u128(2);

    sqlx::query(
        "INSERT INTO workflow_runs (
            id,
            workflow_type,
            metadata,
            started_at,
            created_at,
            updated_at
         )
         VALUES
            ($1, $2, $3::jsonb, $4, $4, $4),
            ($5, $2, $6::jsonb, $4, $4, $4)",
    )
    .bind(older_id)
    .bind(workflow_type)
    .bind(json!({"order": "older"}))
    .bind(created_at)
    .bind(newer_id)
    .bind(json!({"order": "newer"}))
    .execute(&pool)
    .await
    .expect("insert tied workflow runs");

    let runs = list_workflow_runs(
        &pool,
        &WorkflowRunListFilter {
            organization_id: None,
            status: None,
            workflow_type: Some(workflow_type),
            limit: 2,
            offset: 0,
        },
    )
    .await
    .expect("list workflow runs");
    assert_eq!(
        runs.into_iter().map(|run| run.id).collect::<Vec<_>>(),
        vec![newer_id, older_id]
    );

    let second_page = list_workflow_runs(
        &pool,
        &WorkflowRunListFilter {
            organization_id: None,
            status: None,
            workflow_type: Some(workflow_type),
            limit: 1,
            offset: 1,
        },
    )
    .await
    .expect("list workflow runs second page");
    assert_eq!(second_page[0].id, older_id);

    let latest = get_latest_workflow_run_by_type(&pool, None, WorkflowType::new(workflow_type))
        .await
        .expect("load latest workflow run")
        .expect("latest workflow run exists");
    assert_eq!(latest.id, newer_id);

    teardown_ephemeral_pool(pool, database).await;
}