This commit is contained in:
2026-08-08 12:16:01 +08:00
parent 08f71cf17e
commit d30e975eed
3 changed files with 191 additions and 2 deletions
@@ -158,6 +158,15 @@ class SmartLoadingSqlContractTest {
.isEqualTo(1);
assertThat(count(unified, "SELECT 'PASS' AS migration_status"))
.isEqualTo(1);
int relocation = unified.indexOf("CALL unified_relocate_inbound_loading_permissions();");
int assertion = unified.indexOf("CALL assert_phase3_smart_loading_schema();");
assertThat(relocation).isGreaterThan(0);
assertThat(assertion).isGreaterThan(relocation);
assertThat(unified.substring(relocation, assertion))
.contains("tmp_phase3_inbound_role_grant")
.contains("DROP TEMPORARY TABLE IF EXISTS tmp_phase3_inbound_role_grant")
.contains("5102121, 0, 'PLATFORM'")
.contains("5102129, 0, 'PLATFORM'");
}
@Test
@@ -180,6 +189,13 @@ class SmartLoadingSqlContractTest {
.contains("KEY idx_loading_pick_status (tenant_id, status, updated_at)");
}
@Test
@DisplayName("迁移拒绝缺列错类型和混合拣货表型")
void shouldRejectMalformedLegacyPickTaskShapes() throws Exception {
assertMalformedShapeGuards(migration());
assertMalformedShapeGuards(unifiedMigration());
}
private static String migration() throws Exception {
return new ClassPathResource("db/phase3-smart-loading-schema.sql")
.getContentAsString(StandardCharsets.UTF_8);
@@ -213,6 +229,27 @@ class SmartLoadingSqlContractTest {
return matcher.results().map(result -> result.group(1)).collect(Collectors.toSet());
}
private static void assertMalformedShapeGuards(String sql) {
assertThat(sql)
.containsAnyOf("source_total_columns = 11", "source_total = 11")
.containsAnyOf("source_smart_columns = 11", "source_smart = 11")
.containsAnyOf("source_total_columns = 12", "source_total = 12")
.containsAnyOf("source_inbound_columns = 12", "source_inbound = 12")
.contains("column_name = 'version'")
.contains("column_name = 'remark'")
.contains("column_name = 'updated_by'")
.contains("column_name = 'updated_by_name'")
.contains("column_name = 'created_at'")
.contains("column_name = 'updated_at'")
.contains("LOWER(column_type) = 'int'")
.contains("LOWER(column_type) = 'int unsigned'")
.contains("LOWER(extra) LIKE '%on update current_timestamp%'")
.contains("uk_loading_pick_tenant_inbound")
.contains("idx_loading_pick_status")
.contains("referenced_table_name = 'fl_inbound_order'")
.contains("字段签名未知或混合");
}
private static int count(String value, String token) {
return (value.length() - value.replace(token, "").length()) / token.length();
}