#![cfg(feature = "sqlite")]
use autumn_web::config::DatabaseConfig;
use autumn_web::db::{RuntimeConnection, create_pool};
use autumn_web::reexports::{diesel, diesel_async};
use diesel_async::RunQueryDsl as _;
use diesel_async::pooled_connection::deadpool::Pool;
type SqlitePool = Pool<RuntimeConnection>;
#[tokio::test]
async fn pooled_sqlite_connections_enforce_foreign_keys() {
let tmp = tempfile::TempDir::new().expect("temp dir");
let db_path = tmp.path().join("fk.db");
let url = format!("sqlite://{}", db_path.display());
let config = DatabaseConfig {
url: Some(url),
primary_pool_size: Some(4),
..Default::default()
};
let pool: SqlitePool = create_pool(&config)
.expect("sqlite pool builds via build_sqlite_pool")
.expect("a url is configured");
{
let mut conn = pool.get().await.expect("checkout a sqlite connection");
diesel::sql_query("CREATE TABLE parent (id INTEGER PRIMARY KEY)")
.execute(&mut *conn)
.await
.expect("create parent table");
diesel::sql_query(
"CREATE TABLE child (id INTEGER PRIMARY KEY, parent_id INTEGER \
REFERENCES parent(id))",
)
.execute(&mut *conn)
.await
.expect("create child table");
}
let mut conn = pool.get().await.expect("checkout a second connection");
let result = diesel::sql_query("INSERT INTO child (id, parent_id) VALUES (1, 999)")
.execute(&mut *conn)
.await;
let err = result.expect_err("orphan insert must be rejected when foreign_keys is ON");
let message = err.to_string();
assert!(
message.to_ascii_uppercase().contains("FOREIGN KEY"),
"expected a foreign-key constraint violation, got: {message}"
);
diesel::sql_query("INSERT INTO parent (id) VALUES (1)")
.execute(&mut *conn)
.await
.expect("insert parent row");
diesel::sql_query("INSERT INTO child (id, parent_id) VALUES (2, 1)")
.execute(&mut *conn)
.await
.expect("valid child insert is accepted");
}