refactor(db): delete_object via rows_affected; test update/delete-missing and field clearing
This commit is contained in:
@@ -234,15 +234,15 @@ pub async fn delete_object(
|
|||||||
actor: AuditActor,
|
actor: AuditActor,
|
||||||
id: ObjectId,
|
id: ObjectId,
|
||||||
) -> Result<bool, sqlx::Error> {
|
) -> Result<bool, sqlx::Error> {
|
||||||
if object_by_id(&mut *conn, id).await?.is_none() {
|
let result = sqlx::query("DELETE FROM object WHERE id = $1")
|
||||||
return Ok(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlx::query("DELETE FROM object WHERE id = $1")
|
|
||||||
.bind(id.to_uuid())
|
.bind(id.to_uuid())
|
||||||
.execute(&mut *conn)
|
.execute(&mut *conn)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
if result.rows_affected() == 0 {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
|
||||||
audit::record(
|
audit::record(
|
||||||
&mut *conn,
|
&mut *conn,
|
||||||
&NewAuditEvent {
|
&NewAuditEvent {
|
||||||
|
|||||||
@@ -81,17 +81,70 @@ async fn no_op_update_records_no_audit(pool: PgPool) {
|
|||||||
#[sqlx::test]
|
#[sqlx::test]
|
||||||
async fn update_missing_returns_false(pool: PgPool) {
|
async fn update_missing_returns_false(pool: PgPool) {
|
||||||
let db = Db::from_pool(pool);
|
let db = Db::from_pool(pool);
|
||||||
|
let missing = domain::ObjectId::new();
|
||||||
|
|
||||||
let mut tx = db.pool().begin().await.unwrap();
|
let mut tx = db.pool().begin().await.unwrap();
|
||||||
let updated = catalog::update_object(
|
let updated = catalog::update_object(&mut tx, AuditActor::System, missing, &base())
|
||||||
&mut tx,
|
|
||||||
AuditActor::System,
|
|
||||||
domain::ObjectId::new(),
|
|
||||||
&base(),
|
|
||||||
)
|
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
tx.commit().await.unwrap();
|
tx.commit().await.unwrap();
|
||||||
assert!(!updated);
|
assert!(!updated);
|
||||||
|
|
||||||
|
let history = audit::history_for(db.pool(), "object", missing.to_uuid())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert!(
|
||||||
|
history.is_empty(),
|
||||||
|
"updating a missing object records no audit"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
async fn delete_missing_returns_false(pool: PgPool) {
|
||||||
|
let db = Db::from_pool(pool);
|
||||||
|
let mut tx = db.pool().begin().await.unwrap();
|
||||||
|
let deleted = catalog::delete_object(&mut tx, AuditActor::System, domain::ObjectId::new())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
tx.commit().await.unwrap();
|
||||||
|
assert!(!deleted);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
async fn clearing_a_field_is_audited(pool: PgPool) {
|
||||||
|
let db = Db::from_pool(pool);
|
||||||
|
let mut tx = db.pool().begin().await.unwrap();
|
||||||
|
let id = catalog::create_object(&mut tx, AuditActor::System, &base())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
tx.commit().await.unwrap();
|
||||||
|
|
||||||
|
let mut cleared = base();
|
||||||
|
cleared.current_location = None;
|
||||||
|
|
||||||
|
let mut tx = db.pool().begin().await.unwrap();
|
||||||
|
catalog::update_object(&mut tx, AuditActor::System, id, &cleared)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
tx.commit().await.unwrap();
|
||||||
|
|
||||||
|
let history = audit::history_for(db.pool(), "object", id.to_uuid())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let update = history.last().unwrap();
|
||||||
|
let loc = update
|
||||||
|
.changes
|
||||||
|
.iter()
|
||||||
|
.find(|c| c.field == "current_location")
|
||||||
|
.expect("location change recorded");
|
||||||
|
assert!(
|
||||||
|
loc.before.is_some(),
|
||||||
|
"cleared field should have before = Some"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
loc.after.is_none(),
|
||||||
|
"cleared field should have after = None"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[sqlx::test]
|
#[sqlx::test]
|
||||||
|
|||||||
Reference in New Issue
Block a user