From 6de4a0a65e7701726917018ae9e020387e8c0234 Mon Sep 17 00:00:00 2001 From: Xiaoyang Han Date: Thu, 8 Oct 2026 00:18:18 +0800 Subject: [PATCH] test(mst2): cover FK and capability truncate barriers separately The exact f3e native run passed 2346 tests and failed one expectation: PostgreSQL FK preflight rejects plain prepare-page TRUNCATE before the install-capability trigger. Preserve plain FK rejection, add CASCADE to reach the unchanged capability guard, and prove all prepare mappings and seals survive. Existing identity assertions and actual installation/finalize remain. No production code changes. --- ...ative_metadata_install_capability_tests.rs | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/jupiter/storage/native_metadata_install_capability_tests.rs b/src/jupiter/storage/native_metadata_install_capability_tests.rs index cd2759ef..9cbc21e6 100644 --- a/src/jupiter/storage/native_metadata_install_capability_tests.rs +++ b/src/jupiter/storage/native_metadata_install_capability_tests.rs @@ -241,6 +241,19 @@ async fn install_capability_freezes_every_identity_member_anchor_and_truncate_pa .await .unwrap() .unwrap(); + let member_count_before = + scalar(&first, "SELECT count(*) FROM mst2_metadata_prepare_page").await; + let seal_count_before = scalar(&first, "SELECT count(*) FROM mst2_metadata_install_seal").await; + let restrict_error = first + .execute_unprepared("TRUNCATE mst2_metadata_prepare_page") + .await + .expect_err("plain truncate must preserve foreign-key protection"); + assert!( + restrict_error + .to_string() + .contains("cannot truncate a table referenced in a foreign key constraint"), + "{restrict_error}" + ); assert_eq!( first.execute_raw(statement( "UPDATE mst2_metadata_prepare SET verification_revision=verification_revision WHERE prepare_id=$1", @@ -311,11 +324,19 @@ async fn install_capability_freezes_every_identity_member_anchor_and_truncate_pa "UPDATE mst2_metadata_install_seal SET members_digest=decode(repeat('ff',32),'hex')".into(), "DELETE FROM mst2_metadata_install_seal".into(), "TRUNCATE mst2_metadata_install_seal".into(), - "TRUNCATE mst2_metadata_prepare_page".into(), + "TRUNCATE mst2_metadata_prepare_page CASCADE".into(), "TRUNCATE mst2_metadata_prepare CASCADE".into(), ] { assert_guard(&first, &sql).await; } + assert_eq!( + scalar(&first, "SELECT count(*) FROM mst2_metadata_prepare_page").await, + member_count_before + ); + assert_eq!( + scalar(&first, "SELECT count(*) FROM mst2_metadata_install_seal").await, + seal_count_before + ); assert_eq!( mst2_metadata_prepare::Entity::find_by_id(intent.prepare_id().to_owned()) .one(&first)