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() ); }