feat(db): add catalogue object create/read/list with audit on create

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 09:24:03 +02:00
parent 95357f01dd
commit e0c0187f29
4 changed files with 262 additions and 1 deletions
+77
View File
@@ -0,0 +1,77 @@
use db::{Db, audit, catalog};
use domain::{AuditAction, AuditActor, ObjectInput, Visibility};
use sqlx::PgPool;
fn sample_input(number: &str) -> ObjectInput {
ObjectInput {
object_number: number.into(),
object_name: "vase".into(),
number_of_objects: 1,
brief_description: Some("a small vase".into()),
current_location: Some("shelf A1".into()),
current_owner: None,
recorder: Some("anna".into()),
recording_date: None,
visibility: Visibility::Draft,
}
}
#[sqlx::test]
async fn create_reads_back_and_audits(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, &sample_input("LM-1"))
.await
.unwrap();
tx.commit().await.unwrap();
let obj = catalog::object_by_id(db.pool(), id).await.unwrap().unwrap();
assert_eq!(obj.object_number, "LM-1");
assert_eq!(obj.object_name, "vase");
assert_eq!(obj.number_of_objects, 1);
assert_eq!(obj.brief_description.as_deref(), Some("a small vase"));
assert_eq!(obj.visibility, Visibility::Draft);
let history = audit::history_for(db.pool(), "object", id.to_uuid())
.await
.unwrap();
assert_eq!(history.len(), 1);
assert_eq!(history[0].action, AuditAction::Created);
assert_eq!(history[0].actor, AuditActor::System);
assert!(
history[0]
.changes
.iter()
.any(|c| c.field == "object_number")
);
}
#[sqlx::test]
async fn list_returns_created_objects(pool: PgPool) {
let db = Db::from_pool(pool);
let mut tx = db.pool().begin().await.unwrap();
catalog::create_object(&mut tx, AuditActor::System, &sample_input("LM-1"))
.await
.unwrap();
catalog::create_object(&mut tx, AuditActor::System, &sample_input("LM-2"))
.await
.unwrap();
tx.commit().await.unwrap();
let all = catalog::list_objects(db.pool()).await.unwrap();
assert_eq!(all.len(), 2);
assert_eq!(all[0].object_number, "LM-1");
assert_eq!(all[1].object_number, "LM-2");
}
#[sqlx::test]
async fn object_by_id_missing_is_none(pool: PgPool) {
let db = Db::from_pool(pool);
assert!(
catalog::object_by_id(db.pool(), domain::ObjectId::new())
.await
.unwrap()
.is_none()
);
}