From 4ecad78433bdfcf20792f073924c80d8ba37c251 Mon Sep 17 00:00:00 2001 From: Codex Date: Thu, 10 Sep 2026 11:38:44 -0700 Subject: [PATCH] Seed optional history values from explicit constructors --- crates/oa-desktop/src/forms/history_fields.rs | 4 ++- .../src/forms/history_fields/tests.rs | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/crates/oa-desktop/src/forms/history_fields.rs b/crates/oa-desktop/src/forms/history_fields.rs index 54805bdd..cd2b37fe 100644 --- a/crates/oa-desktop/src/forms/history_fields.rs +++ b/crates/oa-desktop/src/forms/history_fields.rs @@ -120,7 +120,9 @@ fn seed(schema: &'static Value, depth: usize) -> Result { if let Some(options) = alternatives(schema) { if options .iter() - .any(|s| matches_value(s, &json!("NotApplicable"), 0)) + .filter_map(|s| resolve(s).ok()) + .filter_map(|s| s.get("enum").and_then(Value::as_array)) + .any(|values| values.contains(&json!("NotApplicable"))) { return Ok(json!("NotApplicable")); } diff --git a/crates/oa-desktop/src/forms/history_fields/tests.rs b/crates/oa-desktop/src/forms/history_fields/tests.rs index 23b40072..10af0691 100644 --- a/crates/oa-desktop/src/forms/history_fields/tests.rs +++ b/crates/oa-desktop/src/forms/history_fields/tests.rs @@ -752,6 +752,38 @@ fn choose_history_constructor(draft: &mut Draft, path: &str, label: &str) { draft.shape(&path, value).unwrap(); } +#[test] +fn history_optional_uuid_and_text_seed_absence_without_inventing_observations() { + for fact in ["Header/Parent", "Artifact/review/Revision"] { + let side = format!("{FACETS}/0/{fact}/oa"); + let schema = resolve(schema_at(&side).unwrap()).unwrap(); + assert_eq!(seed(schema, 0).unwrap(), json!("NotApplicable")); + let observed_value = alternatives(schema) + .unwrap() + .iter() + .find(|branch| branch_label(branch) == "Observed value") + .unwrap(); + let value = branch_seed(observed_value).unwrap(); + assert_eq!(value, json!({"Value": null})); + assert_eq!( + seed(schema_at(&format!("{side}/Value")).unwrap(), 0).unwrap(), + Value::Null, + "a plain text/UUID shape is not the NotApplicable enum constructor" + ); + if fact == "Header/Parent" { + assert_eq!( + serde_json::from_value::>>(value).unwrap(), + Observed::Value(None) + ); + } else { + assert_eq!( + serde_json::from_value::>>(value).unwrap(), + Observed::Value(None) + ); + } + } +} + #[test] fn history_nested_optional_number_events_switch_absent_present_and_recover_invalid_raw() { let (project, id) = fixture(Some(baseline(vec![])));