#[path = "common/harness.rs"]
mod harness;
use harness::TestHarness;
#[cfg(feature = "metrics")]
use macrame::metrics::CommandKind;
use macrame::error::DbError;
use macrame::prelude::*;
const TS: &str = "2026-01-01T00:00:00.000000Z";
const OPEN: &str = "9999-12-31T23:59:59.999999Z";
const N: usize = 40;
#[cfg(feature = "metrics")]
fn turns_for(snap: ¯ame::metrics::MetricsSnapshot, kind: CommandKind) -> u64 {
snap.kinds.iter().find(|k| k.kind == kind).unwrap().turns
}
#[cfg(feature = "metrics")]
fn over_budget_for(snap: ¯ame::metrics::MetricsSnapshot, kind: CommandKind) -> u64 {
snap.kinds.iter().find(|k| k.kind == kind).unwrap().over_budget
}
fn random_pairs(n: usize) -> Vec<EdgeAssertion> {
let mut s: u64 = 20250911;
let mut rng = move || {
s ^= s << 13;
s ^= s >> 7;
s ^= s << 17;
(s >> 11) as usize % n
};
let mut seen = std::collections::HashSet::new();
let mut out = Vec::with_capacity(n);
while out.len() < n {
let a = rng();
let b = rng();
if a != b && seen.insert((a, b)) {
out.push(
EdgeAssertion::new(format!("c{a:03}"), format!("c{b:03}"), "RELATES")
.valid_from(TS)
.valid_to(OPEN),
);
}
}
out
}
async fn seeded(harness: &TestHarness, concepts: usize) -> Database {
let db = Database::open(&harness.db_path).await.unwrap();
let all: Vec<_> = (0..concepts)
.map(|i| ConceptUpsert::new(format!("c{i:03}"), "T").valid_from(TS))
.collect();
db.write_concepts(all).await.unwrap();
db
}
async fn current_rows(db: &Database) -> Vec<(String, String, String, String, String)> {
let mut rows = db
.read_conn()
.query(
"SELECT source_id, target_id, edge_type, valid_from, valid_to
FROM links_current ORDER BY source_id, target_id, branch_id",
(),
)
.await
.unwrap();
let mut out = Vec::new();
while let Some(row) = rows.next().await.unwrap() {
out.push((
row.get(0).unwrap(),
row.get(1).unwrap(),
row.get(2).unwrap(),
row.get(3).unwrap(),
row.get(4).unwrap(),
));
}
out
}
#[tokio::test]
async fn a_deferred_bulk_maintains_the_same_projection_the_shipped_path_does() {
let edges = random_pairs(N);
let h1 = TestHarness::new();
let db1 = seeded(&h1, N).await;
db1.bulk_import(edges.clone()).await.unwrap();
let shipped = current_rows(&db1).await;
db1.close().await.unwrap();
let h2 = TestHarness::new();
let db2 = seeded(&h2, N).await;
db2.bulk_import_deferred(edges).await.unwrap();
let deferred = current_rows(&db2).await;
assert_eq!(
macrame::integrity::audit_current(db2.read_conn()).await.unwrap(),
0,
"the deferred load left the projection drifting from the ledger"
);
assert_eq!(shipped, deferred, "both paths maintain the same belief");
let g = db2.load_subgraph("c000", 1, TS, 1 << 20).await.unwrap();
assert!(g.node_count() >= 1, "the rebuilt projection answers reads");
db2.close().await.unwrap();
}
#[tokio::test]
async fn a_write_after_a_deferred_bulk_is_mirrored_again() {
let h = TestHarness::new();
let db = seeded(&h, N).await;
db.bulk_import_deferred(random_pairs(N - 1)).await.unwrap();
db.assert_edge(
EdgeAssertion::new("c000", "c001", "NEWTYPE").valid_from(TS).valid_to(OPEN),
)
.await
.unwrap();
assert_eq!(
macrame::integrity::audit_current(db.read_conn()).await.unwrap(),
0,
"a post-window write must reach links_current through the mirror"
);
db.close().await.unwrap();
}
#[tokio::test]
async fn a_failed_deferred_bulk_still_rebuilds_and_restores() {
let h = TestHarness::new();
let db = seeded(&h, N).await;
db.assert_edge(
EdgeAssertion::new("c000", "c001", "EARLY").valid_from(TS).valid_to(OPEN),
)
.await
.unwrap();
let mut edges = random_pairs(N);
edges.push(
EdgeAssertion::new("c000", "c001", "EARLY").valid_from("2027-01-01T00:00:00.000000Z").valid_to(OPEN),
);
let err = db.bulk_import_deferred(edges).await.unwrap_err();
assert_eq!(err.written, 0);
assert!(
!err.was_cancelled(),
"the stop is the load's own failure, not the caller's"
);
let cause: DbError = err.into();
assert!(
matches!(cause, DbError::SingleOpenViolation { .. }),
"the single-open refusal is the cause, got {cause:?}"
);
assert_eq!(
macrame::integrity::audit_current(db.read_conn()).await.unwrap(),
0,
"the failure path rebuilt before it reported"
);
db.close().await.unwrap();
}
#[tokio::test]
async fn an_empty_deferred_bulk_touches_nothing() {
let h = TestHarness::new();
let db = seeded(&h, 4).await;
let written = db.bulk_import_deferred(Vec::new()).await.unwrap();
assert_eq!(written, 0);
#[cfg(feature = "metrics")]
{
let m = db.metrics();
assert_eq!(turns_for(&m, CommandKind::LinksCurrentMirror), 0);
assert_eq!(turns_for(&m, CommandKind::RebuildCurrent), 0);
}
db.close().await.unwrap();
}
#[cfg(feature = "metrics")]
#[tokio::test]
async fn the_toggle_is_attributed_and_exempt() {
let h = TestHarness::new();
let db = seeded(&h, N).await;
db.bulk_import_deferred(random_pairs(N)).await.unwrap();
let m = db.metrics();
assert_eq!(turns_for(&m, CommandKind::LinksCurrentMirror), 2);
assert_eq!(over_budget_for(&m, CommandKind::LinksCurrentMirror), 0);
assert!(turns_for(&m, CommandKind::ShadowSwap) >= 1);
db.close().await.unwrap();
}