1
use super::{DB_POOL, DBError, get_connection, test_pool_is_set};
2
use sqlx::PgPool;
3
use tokio::sync::OnceCell;
4

            
5
/// Context for keeping environment intact
6
static CONTEXT: OnceCell<()> = OnceCell::const_new();
7

            
8
3
async fn setup() {
9
3
    CONTEXT
10
3
        .get_or_init(|| async {
11
            #[cfg(feature = "testlog")]
12
1
            let _ = env_logger::builder()
13
1
                .is_test(true)
14
1
                .filter_level(log::LevelFilter::Trace)
15
1
                .try_init();
16
2
        })
17
3
        .await;
18
3
}
19

            
20
#[sqlx::test(migrator = "server::db::MIGRATOR")]
21
async fn migrations_create_schema_without_seed(pool: PgPool) -> sqlx::Result<()> {
22
    setup().await;
23

            
24
    let mut conn = pool.acquire().await?;
25

            
26
    // The migration set is DDL-only: it creates the `config` table but no
27
    // longer seeds it (seeding moved to `bootstrap::seed`). So a freshly
28
    // migrated DB has the table present and empty.
29
    let config_rows: i64 = sqlx::query_scalar("SELECT count(*) FROM config")
30
        .fetch_one(&mut *conn)
31
        .await?;
32
    assert_eq!(config_rows, 0, "migration set must not seed config rows");
33

            
34
    Ok(())
35
}
36

            
37
#[sqlx::test(migrator = "server::db::MIGRATOR")]
38
async fn the_installed_pool_is_an_owned_handle(pool: PgPool) -> anyhow::Result<()> {
39
    setup().await;
40
    DB_POOL.set(Some(pool));
41
    assert!(test_pool_is_set());
42

            
43
    let mut conn = get_connection().await?;
44
    let one: i32 = sqlx::query_scalar("SELECT 1").fetch_one(&mut *conn).await?;
45
    assert_eq!(one, 1);
46

            
47
    Ok(())
48
}
49

            
50
#[sqlx::test(migrator = "server::db::MIGRATOR")]
51
async fn a_closed_installed_pool_reports_pool_closed(pool: PgPool) -> anyhow::Result<()> {
52
    setup().await;
53
    DB_POOL.set(Some(pool.clone()));
54
    pool.close().await;
55

            
56
    let outcome = get_connection().await;
57
    assert!(
58
        matches!(outcome, Err(DBError::Sqlx(sqlx::Error::PoolClosed))),
59
        "{outcome:?}"
60
    );
61

            
62
    Ok(())
63
}
64

            
65
#[tokio::test]
66
1
async fn a_missing_test_pool_is_an_error() {
67
1
    let outcome = get_connection().await;
68
1
    assert!(
69
1
        matches!(outcome, Err(DBError::TestPoolUnset)),
70
1
        "{outcome:?}"
71
1
    );
72
1
}