headgate-testkit 0.1.4

A policy-aware distributed job queue with PostgreSQL, MySQL, and Redis backends.
Documentation
use headgate_testkit::MysqlTestDatabase;
use mysql_async::prelude::*;

#[tokio::test]
async fn mysql_test_databases_migrate_isolate_parallel_tests_and_cleanup() {
    let Ok(url) = std::env::var("HG_TEST_MYSQL") else {
        eprintln!("HG_TEST_MYSQL not set; skipping MySQL test-database helper");
        return;
    };
    let (left, right) = tokio::join!(
        MysqlTestDatabase::create(&url),
        MysqlTestDatabase::create(&url)
    );
    let left = left.expect("left database");
    let right = right.expect("right database");
    assert_ne!(left.database(), right.database());

    let left_pool = mysql_async::Pool::new(left.opts());
    let right_pool = mysql_async::Pool::new(right.opts());
    let mut left_conn = left_pool.get_conn().await.unwrap();
    let mut right_conn = right_pool.get_conn().await.unwrap();
    let left_installed: Option<u64> = left_conn
        .query_first(
            "SELECT count(*) FROM information_schema.tables
              WHERE table_schema = DATABASE() AND table_name = 'headgate_job'",
        )
        .await
        .unwrap();
    let right_installed: Option<u64> = right_conn
        .query_first(
            "SELECT count(*) FROM information_schema.tables
              WHERE table_schema = DATABASE() AND table_name = 'headgate_job'",
        )
        .await
        .unwrap();
    assert_eq!(left_installed, Some(1));
    assert_eq!(right_installed, Some(1));
    left_conn
        .query_drop("INSERT INTO headgate_queue_state(queue) VALUES ('only-left')")
        .await
        .unwrap();
    let right_count: Option<u64> = right_conn
        .query_first("SELECT count(*) FROM headgate_queue_state WHERE queue = 'only-left'")
        .await
        .unwrap();
    assert_eq!(
        right_count,
        Some(0),
        "parallel databases cannot see each other"
    );

    drop(left_conn);
    let _ = left_pool.disconnect().await;
    left.cleanup().await.expect("cleanup left");
    let still_live: Option<u64> = right_conn
        .query_first(
            "SELECT count(*) FROM information_schema.tables
              WHERE table_schema = DATABASE() AND table_name = 'headgate_job'",
        )
        .await
        .unwrap();
    assert_eq!(
        still_live,
        Some(1),
        "cleaning one test cannot drop its sibling"
    );
    drop(right_conn);
    let _ = right_pool.disconnect().await;
    right.cleanup().await.expect("cleanup right");
}