use sashiko::db::Database;
use sashiko::settings::DatabaseSettings;
use std::sync::Arc;
async fn setup_db() -> Arc<Database> {
let settings = DatabaseSettings {
url: ":memory:".to_string(),
token: String::new(),
};
let db = Database::new(&settings).await.unwrap();
db.migrate().await.unwrap();
Arc::new(db)
}
#[tokio::test]
async fn test_singleton_root_overwrite_prevention() {
let db = setup_db().await;
let root_id = "root_msg";
let t1 = db.ensure_thread_for_message(root_id, 1000).await.unwrap();
db.create_message(
"msg_2",
t1,
Some(root_id),
"Author",
"[PATCH 2/3] Part 2",
1010,
"body",
"",
"",
None,
None,
)
.await
.unwrap();
let ps_id = db
.create_patchset(
t1,
Some(root_id), "msg_2",
"[PATCH 2/3] Part 2",
"Author",
1010,
3,
0,
"",
"",
None,
2,
None,
true,
None,
None,
)
.await
.unwrap()
.unwrap();
db.create_patch(ps_id, "msg_2", 2, "diff").await.unwrap();
let ps_id_root = db
.create_patchset(
t1,
Some(root_id), root_id,
"[PATCH] Singleton Root",
"Author",
1000, 1, 0,
"",
"",
None,
1,
None,
true,
None,
None,
)
.await
.unwrap()
.unwrap();
assert_eq!(ps_id, ps_id_root, "Root should merge into existing set");
db.create_patch(ps_id, root_id, 1, "diff").await.unwrap();
let details = db
.get_patchset_details(ps_id, None, None)
.await
.unwrap()
.unwrap();
let total = details["total_parts"].as_u64().unwrap();
let received = details["received_parts"].as_u64().unwrap();
assert_eq!(received, 2, "Should have 2 patches");
assert_eq!(total, 3, "Total parts should remain 3, not downgraded to 1");
}