diff --git a/crates/engine/src/cmd/page.rs b/crates/engine/src/cmd/page.rs index fefd8c73..2835deff 100644 --- a/crates/engine/src/cmd/page.rs +++ b/crates/engine/src/cmd/page.rs @@ -94,7 +94,7 @@ pub fn specs() -> Vec { ok() }), spec!("page.duplicate", "Duplicate page", "{id?}", true, |s, p| { - let src = id(p, "id").unwrap_or(s.page()?); + let src = page_target(s, "page.duplicate", p)?; let doc = s.doc_mut()?; let name = format!("Copy of {}", doc.get(src)?.name); let np = doc.add_page(&name); diff --git a/crates/engine/src/page_target_tests.rs b/crates/engine/src/page_target_tests.rs index fd88685d..348ffdf3 100644 --- a/crates/engine/src/page_target_tests.rs +++ b/crates/engine/src/page_target_tests.rs @@ -61,3 +61,13 @@ fn page_commands_still_work_on_pages() { assert!(!s.doc().unwrap().contains(second)); assert!(s.execute("page.delete", &json!({"id": first})).is_err(), "the last ordinary page stays"); } + +#[test] +fn page_duplicate_rejects_a_frame() { + let mut s = Session::new(); + let f = id_of(&ex(&mut s, "frame.create", json!({"x": 0, "y": 0, "width": 100, "height": 100}))); + let pages = s.doc().unwrap().pages.clone(); + let err = s.execute("page.duplicate", &json!({"id": f})).expect_err("duplicate refuses a layer"); + assert!(err.to_string().contains("is not a page"), "{err}"); + assert_eq!(s.doc().unwrap().pages, pages, "no page was added"); +}