diff --git a/crates/automation/src/documents.rs b/crates/automation/src/documents.rs index 6e2c0a83f5..40aa4ac522 100644 --- a/crates/automation/src/documents.rs +++ b/crates/automation/src/documents.rs @@ -320,6 +320,10 @@ impl Automation { if let Some(mono) = a.get("mono") { let unknown = |c: &Value| ToolError::InvalidArgs(format!("unknown mono compression {c} (ccitt_g4, retain)")); let mono = mono.as_object().ok_or_else(|| ToolError::InvalidArgs("mono must be an object: { compression: ccitt_g4|retain }".into()))?; + // A misspelled key would otherwise leave the preset's setting in place unnoticed. + if let Some(key) = mono.keys().find(|k| *k != "compression") { + return Err(ToolError::InvalidArgs(format!("unknown mono key {key:?} (compression)"))); + } if let Some(c) = mono.get("compression") { settings.mono = match c.as_str() { Some("ccitt_g4" | "ccitt" | "g4") => MonoCompression::CcittG4, diff --git a/crates/automation/tests/it/automation.rs b/crates/automation/tests/it/automation.rs index 8392b6722f..dcd321eddb 100644 --- a/crates/automation/tests/it/automation.rs +++ b/crates/automation/tests/it/automation.rs @@ -6455,9 +6455,9 @@ fn doc_optimize_stores_black_and_white_images_as_ccitt_group_4() { }) .collect(); assert_eq!(filters, [b"CCITTFaxDecode".to_vec()]); - // An unknown compression, one that isn't a name, or a mono that isn't an object is refused, - // not read as the default. - for mono in [json!({ "compression": "jbig2" }), json!({ "compression": false }), json!("retain")] { + // An unknown compression, one that isn't a name, a misspelled key, or a mono that isn't an + // object is refused, not read as the default. + for mono in [json!({ "compression": "jbig2" }), json!({ "compression": false }), json!({ "compresson": "retain" }), json!("retain")] { assert!(matches!(a.call("doc_optimize", &json!({ "doc": doc, "path": "x.pdf", "mono": mono })), Err(ToolError::InvalidArgs(_))), "{mono}"); } }