use ff_backend_sqlite::SqliteBackend;
use ff_core::engine_error::BackendError;
use serial_test::serial;
#[tokio::test]
#[serial(ff_dev_mode)]
async fn refuses_without_ff_dev_mode() {
unsafe {
std::env::remove_var("FF_DEV_MODE");
}
let err = SqliteBackend::new(":memory:")
.await
.expect_err("must refuse without FF_DEV_MODE");
assert!(matches!(err, BackendError::RequiresDevMode));
let rendered = err.to_string();
assert!(
rendered.contains("SqliteBackend requires FF_DEV_MODE=1"),
"unexpected render: {rendered}"
);
assert!(
rendered.contains("docs/dev-harness.md"),
"render missing docs URL: {rendered}"
);
}
#[tokio::test]
#[serial(ff_dev_mode)]
async fn accepts_with_ff_dev_mode() {
unsafe {
std::env::set_var("FF_DEV_MODE", "1");
}
let _backend = SqliteBackend::new(":memory:")
.await
.expect("must accept under FF_DEV_MODE=1");
}
#[tokio::test]
#[serial(ff_dev_mode)]
async fn two_news_same_path_share_handle() {
unsafe {
std::env::set_var("FF_DEV_MODE", "1");
}
let uri = "file:rfc-023-dedup?mode=memory&cache=shared";
let a = SqliteBackend::new(uri).await.expect("a");
let b = SqliteBackend::new(uri).await.expect("b");
drop(a);
use ff_core::engine_backend::EngineBackend;
assert_eq!(b.backend_label(), "sqlite");
}
#[tokio::test]
#[serial(ff_dev_mode)]
async fn memory_shared_cache_survives_pool_cycle() {
unsafe {
std::env::set_var("FF_DEV_MODE", "1");
}
let backend = SqliteBackend::new_with_tuning(":memory:", 4, true)
.await
.expect("construct");
let pool = backend.pool_for_test();
sqlx::query("CREATE TABLE f1 (v INTEGER)")
.execute(pool)
.await
.expect("create");
sqlx::query("INSERT INTO f1 VALUES (42)")
.execute(pool)
.await
.expect("insert");
for _ in 0..8 {
let _c = pool.acquire().await.expect("acquire");
}
let v: (i64,) = sqlx::query_as("SELECT v FROM f1")
.fetch_one(pool)
.await
.expect("select");
assert_eq!(v.0, 42);
}
#[tokio::test]
#[serial(ff_dev_mode)]
async fn distinct_memory_uris_are_distinct() {
unsafe {
std::env::set_var("FF_DEV_MODE", "1");
}
let a = SqliteBackend::new("file:rfc-023-dist-a?mode=memory&cache=shared")
.await
.expect("a");
let b = SqliteBackend::new("file:rfc-023-dist-b?mode=memory&cache=shared")
.await
.expect("b");
drop(a);
use ff_core::engine_backend::EngineBackend;
assert_eq!(b.backend_label(), "sqlite");
}