package com.baiyue.lastleg.trucking; import org.junit.jupiter.api.Test; import java.nio.file.Files; import java.nio.file.Path; import java.nio.charset.StandardCharsets; import static org.junit.jupiter.api.Assertions.assertTrue; class UsTruckOrderSchemaContractTest { @Test void baselineContainsOrderAndImmutableHistoryTables() throws Exception { String sql; try (var input = getClass().getResourceAsStream("/db/lastleg.sql")) { sql = new String(input.readAllBytes(), StandardCharsets.UTF_8); } assertTrue(sql.contains("CREATE TABLE IF NOT EXISTS ll_us_truck_order")); assertTrue(sql.contains("CREATE TABLE IF NOT EXISTS ll_us_truck_order_status_history")); assertTrue(sql.contains("CREATE TABLE IF NOT EXISTS ll_us_truck_order_pallet")); assertTrue(sql.contains("pallet_count INT NOT NULL DEFAULT 0")); assertTrue(sql.contains("received_pallet_count INT NOT NULL DEFAULT 0")); assertTrue(sql.contains("allocated_pallet_count INT NOT NULL DEFAULT 0")); assertTrue(sql.contains("CREATE TABLE IF NOT EXISTS ll_us_truck_order_operation")); assertTrue(sql.contains("UNIQUE KEY uk_ll_us_truck_operation_key(customer_id,order_id,idempotency_key)")); assertTrue(sql.contains("operation_type VARCHAR(64) NOT NULL")); assertTrue(sql.contains("idempotency_key VARCHAR(255) NULL COMMENT '操作幂等键'")); assertTrue(sql.contains("UNIQUE KEY uk_ll_us_truck_order_key(customer_id,idempotency_key)")); assertTrue(sql.contains("KEY idx_ll_us_truck_history(customer_id,order_id,created_at)")); } @Test void unifiedInitializationContainsOperationLedgerAndHistoryColumns() throws Exception { String sql = Files.readString(Path.of("..", "deploy", "sql", "海外区域统一增量-MySQL8.sql"), StandardCharsets.UTF_8); String lower = sql.toLowerCase(); String normalized = lower.replaceAll("\\s+", ""); assertTrue(lower.contains("create table ll_us_truck_order_operation")); assertTrue(normalized.contains("uk_ll_us_truck_operation_key(customer_id,order_id,idempotency_key)")); String history = tableBlock(lower, "ll_us_truck_order_status_history"); assertTrue(history.contains("operation_type varchar(64)")); assertTrue(history.contains("idempotency_key varchar(255)")); org.junit.jupiter.api.Assertions.assertFalse(lower.contains("alter table ll_us_truck_order_status_history")); } private static String tableBlock(String sql, String table) { int start = sql.indexOf("create table " + table + " ("); int end = sql.indexOf(';', start); return start < 0 || end < 0 ? "" : sql.substring(start, end); } @Test void newTruckDemandFieldsExistAndRemovedInputsAreAbsentInBothBaselines() throws Exception { String baseline; try (var input = getClass().getResourceAsStream("/db/lastleg.sql")) { baseline = new String(input.readAllBytes(), StandardCharsets.UTF_8); } String unified = Files.readString(Path.of("..", "deploy", "sql", "海外区域统一增量-MySQL8.sql"), StandardCharsets.UTF_8); for (String sql : java.util.List.of(baseline, unified)) { String normalized = sql.toLowerCase().replace("create table if not exists", "create table"); String block = tableBlock(normalized, "ll_us_truck_order"); for (String column : java.util.List.of("vehicle_type", "origin_contact_name", "origin_contact_phone", "destination_contact_name", "destination_contact_phone", "pickup_at", "delivery_at")) assertTrue(block.contains(column)); for (String removed : java.util.List.of("transport_type", "container_type", "requested_date")) org.junit.jupiter.api.Assertions.assertFalse(block.contains(removed)); } } }