switchy_database 0.5.0

Switchy database package
#![cfg(all(feature = "sqlite-sqlx", feature = "schema"))]

use std::sync::Arc;
use switchy_database::{
    Database,
    schema::{Column, DataType},
    sqlx::sqlite::SqliteSqlxDatabase,
};

#[tokio::test]
async fn typed_foreign_keys_enforce_constraints_and_preserve_metadata() {
    let pool = sqlx::sqlite::SqlitePoolOptions::new()
        .max_connections(1)
        .connect("sqlite::memory:")
        .await
        .unwrap();
    let db = SqliteSqlxDatabase::new(Arc::new(switchy_async::sync::Mutex::new(pool)));
    db.sqlite_foreign_keys(false).await.unwrap();
    db.sqlite_foreign_keys(true).await.unwrap();
    let column = |name: &str| Column {
        name: name.into(),
        data_type: DataType::BigInt,
        nullable: false,
        auto_increment: false,
        default: None,
    };
    db.create_table("parent")
        .column(column("id"))
        .primary_key("id")
        .execute(&db)
        .await
        .unwrap();
    db.create_table("child")
        .column(column("parent_id"))
        .foreign_key_column("parent_id", "parent", "id")
        .execute(&db)
        .await
        .unwrap();
    assert!(db.column_exists("parent", "id").await.unwrap());
    assert!(!db.column_exists("parent", "missing").await.unwrap());
    assert!(
        db.insert("child")
            .value("parent_id", 1_i64)
            .execute(&db)
            .await
            .is_err()
    );
    db.insert("parent")
        .value("id", 1_i64)
        .execute(&db)
        .await
        .unwrap();
    db.insert("child")
        .value("parent_id", 1_i64)
        .execute(&db)
        .await
        .unwrap();
    assert_eq!(db.sqlite_foreign_key_check().await.unwrap(), []);
    db.close().await.unwrap();
}