package com.baiyue.lastleg.service; import com.baiyue.lastleg.dto.ContainerPlanProgressDetail; import com.baiyue.lastleg.dto.ContainerPlanProgressSummary; import com.baiyue.lastleg.dto.LastlegOrderRequests; import com.baiyue.lastleg.mapper.LastlegOrderMapper; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; import org.apache.ibatis.session.Configuration; import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class ContainerPlanProgressContractTest { @Test void responseFieldsAndServerAggregateStayFrozen() throws Exception { assertEquals(List.of("sourceContainerBookingId", "containerNo", "overseasWarehouseId", "overseasWarehouseCode", "overseasWarehouseName", "assignmentVersion", "canChangeReceivingWarehouse", "receivingWarehouseLockReason", "totalOrderCount", "inboundCodeCount", "missingInboundCodeCount", "planCount", "plannedInboundCodeCount", "pendingPlanCount", "plannedArrivalAt", "allPlansReady", "blockingReason"), Arrays.stream(ContainerPlanProgressSummary.class.getRecordComponents()) .map(value -> value.getName()).toList()); assertEquals(List.of("orderId", "customerId", "orderNo", "inboundCode", "orderStatus", "planId", "planNo", "planStatus", "planValid", "plannedArrivalAt"), Arrays.stream(ContainerPlanProgressDetail.Item.class.getRecordComponents()) .map(value -> value.getName()).toList()); Select rows = LastlegOrderMapper.class.getMethod("pageContainerProgress", LastlegOrderRequests.ContainerProgressQuery.class, long.class, long.class).getAnnotation(Select.class); String sql = String.join("", rows.value()).toLowerCase(); assertTrue(sql.contains("left join ll_inbound_plan")); assertTrue(sql.contains("o.estimated_warehouse_at")); assertTrue(sql.contains("group by o.source_container_booking_id")); assertFalse(sql.contains("having ")); assertTrue(sql.contains("progress.plannedarrivalat asc")); assertTrue(sql.contains("progress.sourcecontainerbookingid asc")); assertTrue(sql.contains("limit #{limit} offset #{offset}")); } @Test void openApiAndSchemaExposeReadinessAndUnpagedDetail() throws Exception { String openApi = Files.readString(Path.of("src/main/resources/openapi/overseas-business-v1.yaml"), StandardCharsets.UTF_8); String schema = Files.readString(Path.of("src/main/resources/db/lastleg.sql"), StandardCharsets.UTF_8); String deployment = Files.readString(Path.of("../deploy/sql/海外区域统一增量-MySQL8.sql"), StandardCharsets.UTF_8); assertTrue(openApi.contains("/api/platform/v1/last-leg/orders/container-summaries/{sourceContainerBookingId}:")); assertTrue(openApi.contains("ContainerPlanProgressSummary:")); assertTrue(openApi.contains("allPlansReady:")); assertTrue(openApi.contains("返回全部稳定来源柜")); assertTrue(openApi.contains("全部入仓码均已生成有效独立计划的柜仍保留")); assertTrue(openApi.contains("权限 platform:overseas-warehouse:last-mile-order:list")); assertTrue(openApi.contains("权限 platform:overseas-warehouse:last-mile-order:edit")); assertFalse(openApi.contains("platform:overseas-warehouse:order:list")); assertFalse(openApi.contains("platform:overseas-warehouse:order:edit")); assertTrue(openApi.contains("ll_order.estimated_warehouse_at")); assertTrue(schema.contains("idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)")); assertTrue(deployment.contains("idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)")); assertTrue(deployment.contains("assert_container_progress_index_ready")); } @Test void mybatisRendersExecutableProgressSqlWithoutXmlEntities() throws Exception { Select select = LastlegOrderMapper.class.getMethod("pageContainerProgress", LastlegOrderRequests.ContainerProgressQuery.class, long.class, long.class).getAnnotation(Select.class); SqlSource source = new XMLLanguageDriver().createSqlSource(new Configuration(), String.join("", select.value()), Map.class); String sql = source.getBoundSql(Map.of( "q", new LastlegOrderRequests.ContainerProgressQuery(1, 20, null, null, null), "limit", 20L, "offset", 0L)).getSql().replaceAll("\\s+", " ").trim(); assertTrue(sql.contains("source_container_booking_id<>''")); assertTrue(sql.contains("LEFT JOIN ll_inbound_plan")); assertTrue(sql.contains("GROUP BY o.source_container_booking_id")); assertFalse(sql.contains("HAVING ")); assertTrue(!sql.contains("<")); } }