graphile_worker 0.13.3

High performance Rust/PostgreSQL job queue (also suitable for getting jobs generated by PostgreSQL triggers/functions out into a different work queue)
Documentation
use super::*;

#[tokio::test]
async fn sqlx_pool_exercises_get_and_fail_helpers() {
    with_test_db(|test_db| async move {
        test_db
            .worker_utils()
            .migrate()
            .await
            .expect("Failed to migrate");

        let task_details = get_tasks_details(
            &test_db.test_pool,
            &graphile_worker::Schema::default(),
            vec![
                "sqlx_fetch_no_queue".to_string(),
                "sqlx_fetch_queue".to_string(),
            ],
        )
        .await
        .expect("Failed to get task details");

        let now = Utc::now();
        let no_queue_spec = JobSpecBuilder::new().priority(1).run_at(now).build();
        add_job(
            &test_db.test_pool,
            &graphile_worker::Schema::default(),
            "sqlx_fetch_no_queue",
            json!({ "kind": "no_queue" }),
            no_queue_spec,
            false,
        )
        .await
        .expect("Failed to add no-queue job");

        let queue_spec = JobSpecBuilder::new()
            .priority(5)
            .run_at(now)
            .queue_name("sqlx_fetch_queue")
            .flags(vec!["allowed".to_string()])
            .build();
        add_job(
            &test_db.test_pool,
            &graphile_worker::Schema::default(),
            "sqlx_fetch_queue",
            json!({ "kind": "queue" }),
            queue_spec,
            false,
        )
        .await
        .expect("Failed to add queued job");

        let skip_flags = vec!["blocked".to_string()];
        let first_job = get_job(
            &test_db.test_pool,
            &task_details,
            &graphile_worker::Schema::default(),
            "sqlx-worker-one",
            &skip_flags,
            Some(now + chrono::Duration::seconds(1)),
        )
        .await
        .expect("SQLx get_job should succeed")
        .expect("A job should be fetched");
        assert_eq!(first_job.task_identifier(), "sqlx_fetch_no_queue");

        fail_jobs(
            &test_db.test_pool,
            &[FailedJob {
                job: &first_job,
                error: "retry no queue",
            }],
            &graphile_worker::Schema::default(),
            "sqlx-worker-one",
        )
        .await
        .expect("SQLx fail_jobs should handle jobs without queues");

        let batch = batch_get_jobs(
            &test_db.test_pool,
            &task_details,
            &graphile_worker::Schema::default(),
            "sqlx-worker-two",
            &skip_flags,
            10,
            Some(now + chrono::Duration::seconds(1)),
        )
        .await
        .expect("SQLx batch_get_jobs should succeed");
        assert_eq!(batch.len(), 1);
        assert_eq!(batch[0].task_identifier(), "sqlx_fetch_queue");

        fail_jobs(
            &test_db.test_pool,
            &[FailedJob {
                job: &batch[0],
                error: "retry queue",
            }],
            &graphile_worker::Schema::default(),
            "sqlx-worker-two",
        )
        .await
        .expect("SQLx fail_jobs should handle queued jobs");
    })
    .await;
}