#[path = "common/harness.rs"]
mod harness;
use harness::TestHarness;
use macrame::prelude::*;
const TS: &str = "2026-01-01T00:00:00.000000Z";
const OPEN: &str = "9999-12-31T23:59:59.999999Z";
const INSERT: &str = "INSERT INTO concepts \
(id, title, content, valid_from, valid_to, recorded_at, retired) \
VALUES ('probe','P','','2026-01-01T00:00:00.000000Z', \
'9999-12-31T23:59:59.999999Z','2026-01-01T00:00:00.000000Z',0)";
async fn db(harness: &TestHarness) -> Database {
Database::open_with_cadence(&harness.db_path, None)
.await
.unwrap()
}
#[tokio::test]
async fn a_diagnostic_connection_reads_and_explains() {
let harness = TestHarness::new();
let db = db(&harness).await;
db.write_concepts(vec![ConceptUpsert::new("a", "A")
.content("body")
.valid_from(TS)])
.await
.unwrap();
let conn = db.diagnostic_conn().await.unwrap();
let mut rows = conn
.query("SELECT COUNT(*) FROM concepts", ())
.await
.unwrap();
let n: i64 = rows.next().await.unwrap().unwrap().get(0).unwrap();
assert_eq!(
n, 1,
"the diagnostic connection sees the actor's committed write"
);
conn.query("EXPLAIN QUERY PLAN SELECT * FROM links_current", ())
.await
.expect("EXPLAIN QUERY PLAN must work on a diagnostic connection");
db.close().await.unwrap();
}
#[tokio::test]
async fn both_read_paths_refuse_a_write() {
let harness = TestHarness::new();
let db = db(&harness).await;
let diag = db.diagnostic_conn().await.unwrap();
assert!(
diag.execute(INSERT, ()).await.is_err(),
"a read-only connection accepted an INSERT"
);
assert!(
db.read_conn().execute(INSERT, ()).await.is_err(),
"query_only stopped refusing writes"
);
db.close().await.unwrap();
}
#[tokio::test]
async fn turning_the_pragma_off_rescues_the_reader_and_not_the_diagnostic() {
let harness = TestHarness::new();
let db = db(&harness).await;
let diag = db.diagnostic_conn().await.unwrap();
db.read_conn()
.execute("PRAGMA query_only = OFF", ())
.await
.unwrap();
db.read_conn().execute(INSERT, ()).await.expect(
"query_only is a guardrail: turning it off must restore writes, \
and §4.7 invariant 2 depends on that being true",
);
db.read_conn()
.execute("PRAGMA query_only = ON", ())
.await
.unwrap();
diag.execute("PRAGMA query_only = OFF", ()).await.unwrap();
let err = diag
.execute(
"INSERT INTO concepts \
(id, title, content, valid_from, valid_to, recorded_at, retired) \
VALUES ('probe2','P','','2026-01-01T00:00:00.000000Z', \
'9999-12-31T23:59:59.999999Z','2026-01-01T00:00:00.000000Z',0)",
(),
)
.await
.expect_err(
"SQLITE_OPEN_READ_ONLY was defeated by a PRAGMA, so diagnostic_conn() \
is a guardrail and not a boundary",
);
assert!(
err.to_string().contains("readonly"),
"refused for the wrong reason: {err}"
);
db.close().await.unwrap();
}
#[tokio::test]
async fn each_diagnostic_connection_is_the_callers_own() {
let harness = TestHarness::new();
let db = db(&harness).await;
let a = db.diagnostic_conn().await.unwrap();
let b = db.diagnostic_conn().await.unwrap();
a.execute("PRAGMA query_only = ON", ()).await.unwrap();
let mut rows = b.query("PRAGMA query_only", ()).await.unwrap();
let v: i64 = rows.next().await.unwrap().unwrap().get(0).unwrap();
assert_eq!(
v, 0,
"the two diagnostic connections share per-connection state"
);
db.close().await.unwrap();
}
#[tokio::test]
async fn the_handle_reports_the_file_it_opened() {
let harness = TestHarness::new();
let db = db(&harness).await;
assert_eq!(db.path(), harness.db_path.as_path());
db.close().await.unwrap();
}
#[test]
fn the_missing_file_error_names_the_file_and_the_reason() {
let err = macrame::DbError::DiagnosticConn {
path: r"C:\somewhere\nope.db".to_string(),
reason: "the file does not exist, and a read-only open cannot create it".into(),
};
let text = err.to_string();
assert!(text.contains("nope.db"), "does not name the file: {text}");
assert!(text.contains("read-only"), "does not say why: {text}");
assert!(
!text.contains("node"),
"reads as an error about a node, which is D-069's defect: {text}"
);
}
#[tokio::test]
async fn a_diagnostic_connection_opened_after_a_write_sees_it() {
let harness = TestHarness::new();
let db = db(&harness).await;
db.write_concepts(vec![
ConceptUpsert::new("a", "A").content("x").valid_from(TS),
ConceptUpsert::new("b", "B").content("y").valid_from(TS),
])
.await
.unwrap();
db.assert_edge(
EdgeAssertion::new("a", "b", "LINKS")
.valid_from(TS)
.valid_to(OPEN),
)
.await
.unwrap();
let conn = db.diagnostic_conn().await.unwrap();
let mut rows = conn
.query("SELECT COUNT(*) FROM links_current", ())
.await
.unwrap();
let n: i64 = rows.next().await.unwrap().unwrap().get(0).unwrap();
assert_eq!(n, 1);
db.close().await.unwrap();
}