test(order): guard cross-role fulfillment split uniqueness

This commit is contained in:
2026-08-11 09:28:23 +08:00
parent e6eba04eda
commit 22cebaaa7a
2 changed files with 25 additions and 2 deletions
@@ -17,16 +17,35 @@ class OrderParentChildSqlContractTest {
assertThat(sql)
.contains("source_order_id BIGINT UNSIGNED NOT NULL")
.contains("KEY idx_order_split_source (tenant_id,source_order_id,split_role)")
.contains("DROP INDEX uk_order_split_child")
.contains("uk_order_split_child_role")
.contains("UNIQUE KEY `uk_order_split_child_role` (`tenant_id`,`child_order_id`,`split_role`)")
.contains("NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id")
.contains("实装台账必须由来源订单自身承接")
.contains("订单履约分片来源、子片与角色不可修改")
.contains("MODIFY source_order_id BIGINT UNSIGNED NOT NULL")
.contains("MODIFY request_hash CHAR(64) NOT NULL")
.contains("UPDATE ord_order_fulfillment_split")
.contains("SHA2(CONCAT('LEGACY:', tenant_id, ':', id), 256)");
assertThat(sql).doesNotContain("UNIQUE KEY uk_order_split_child (tenant_id,child_order_id)");
assertThat(sql.lastIndexOf("DROP PROCEDURE IF EXISTS phase3_order_add_column"))
.isGreaterThan(sql.lastIndexOf("CALL phase3_order_add_column"));
assertThat(sql.lastIndexOf("DROP PROCEDURE IF EXISTS phase3_order_add_index"))
.isGreaterThan(sql.lastIndexOf("CALL phase3_order_add_index"));
}
@Test
void baselineAllowsOneChildAcrossDifferentRolesButRejectsDuplicateRole() throws Exception {
String baseline = read(resolve("order/src/main/resources/db/order.sql"));
assertThat(baseline)
.contains("UNIQUE KEY uk_order_split_child_role (tenant_id, child_order_id, split_role)")
.contains("CREATE TRIGGER trg_order_fulfillment_split_insert")
.contains("NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id")
.contains("NEW.split_role='REMAINDER'")
.doesNotContain("UNIQUE KEY uk_order_split_child (tenant_id, child_order_id)");
}
@Test
void unifiedEntryContainsTheExactOrderBlockBeforeFirstleg() throws Exception {
String unified = read(resolve("deploy/sql/头程数据库统一增量-MySQL8.sql"));
@@ -36,10 +36,14 @@ class OrderFulfillmentSplitContractTest {
.contains("source_order_id BIGINT UNSIGNED NOT NULL")
.contains("MODIFY source_order_id BIGINT UNSIGNED NOT NULL")
.contains("MODIFY request_hash CHAR(64) NOT NULL")
.contains("idx_order_split_source");
.contains("idx_order_split_source")
.contains("uk_order_split_child_role")
.contains("NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id");
assertThat(baseline)
.contains("source_order_id BIGINT UNSIGNED NOT NULL")
.contains("KEY idx_order_split_source (tenant_id, source_order_id, split_role)");
.contains("KEY idx_order_split_source (tenant_id, source_order_id, split_role)")
.contains("UNIQUE KEY uk_order_split_child_role (tenant_id, child_order_id, split_role)")
.doesNotContain("UNIQUE KEY uk_order_split_child (tenant_id, child_order_id)");
}
@Test