package com.baiyue.lastleg.inboundplan; import com.baiyue.lastleg.inboundplan.dto.ManualInboundPlanRequest; import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class TailPlanCommandOpenApiContractTest { @Test void previewDocumentsTheOriginalResourceRetrySeparatelyFromItsCurrentSnapshot() throws Exception { try (var stream = getClass().getClassLoader().getResourceAsStream("openapi/overseas-business-v1.yaml")) { java.util.Map document = new org.yaml.snakeyaml.Yaml().load(stream); var components = (java.util.Map) document.get("components"); var schemas = (java.util.Map) components.get("schemas"); var preview = (java.util.Map) schemas.get("ContainerInboundPlanPreview"); var properties = (java.util.Map) preview.get("properties"); var retry = (java.util.Map) properties.get("resourceRetry"); org.junit.jupiter.api.Assertions.assertEquals(true, retry.get("nullable")); org.junit.jupiter.api.Assertions.assertEquals(java.util.List.of("idempotencyKey", "snapshotVersion", "snapshotHash"), retry.get("required")); assertTrue(properties.containsKey("snapshotVersion") && properties.containsKey("snapshotHash")); } } @Test void platformPreviewUsesTheCoordinatorThatCanRestorePendingResources() { var controller = new com.baiyue.lastleg.inboundplan.controller.InboundPlanController(); var coordinator = org.mockito.Mockito.mock(com.baiyue.lastleg.inboundplan.service.ContainerInboundPlanConversionCoordinator.class); var principal = org.mockito.Mockito.mock(com.baiyue.common.security.AuthenticatedUser.class); var expected = org.mockito.Mockito.mock(com.baiyue.lastleg.inboundplan.dto.ContainerInboundPlanPreviewResponse.class); org.springframework.test.util.ReflectionTestUtils.setField(controller, "containerConversion", coordinator); org.mockito.Mockito.when(principal.tenantId()).thenReturn(0L); org.mockito.Mockito.when(principal.appCode()).thenReturn("PLATFORM"); org.mockito.Mockito.when(coordinator.preview("BOOKING-1")).thenReturn(expected); org.junit.jupiter.api.Assertions.assertSame(expected, controller.previewContainer(principal, "BOOKING-1").data()); } @Test void exposesOnlyLatestManualPlanHoldAndEightRowNodeContracts() throws Exception { try (var stream = getClass().getClassLoader() .getResourceAsStream("openapi/overseas-business-v1.yaml")) { assertTrue(stream != null); String api = new String(stream.readAllBytes(), StandardCharsets.UTF_8); assertTrue(api.contains("/api/platform/v1/last-leg/inbound-plans/manual:")); assertFalse(api.contains("/api/platform/v1/last-leg/inbound-plans/convert:")); assertFalse(api.contains("plannedWarehouseId")); assertFalse(api.contains("plannedWarehouseCode")); assertFalse(api.contains("plannedWarehouseName")); int manualSchemaStart = api.indexOf(" ManualInboundPlanRequest:"); int manualSchemaEnd = api.indexOf("\n PageMetadata:", manualSchemaStart); assertTrue(manualSchemaStart >= 0 && manualSchemaEnd > manualSchemaStart); assertFalse(api.substring(manualSchemaStart, manualSchemaEnd).contains("inboundCode")); assertFalse(api.substring(manualSchemaStart, manualSchemaEnd).contains("plannedArrivalDate")); assertFalse(java.util.Arrays.stream(ManualInboundPlanRequest.class.getRecordComponents()) .anyMatch(component -> java.util.Set.of("inboundCode", "plannedArrivalDate") .contains(component.getName()))); assertTrue(api.contains("/api/platform/v1/last-leg/orders/{id}/hold:")); assertFalse(api.contains("/api/platform/v1/last-leg/orders/{id}/detained:")); assertTrue(api.contains("/api/platform/v1/last-leg/orders/{id}/manual-nodes:")); assertTrue(api.contains("minItems: 8")); assertTrue(api.contains("maxItems: 8")); assertTrue(api.contains("ACTUAL_ARRIVAL_WAITING_UNLOAD")); } } }