This commit is contained in:
2026-09-16 11:14:32 +08:00
parent a098c4377c
commit a975b07968
@@ -5,7 +5,10 @@ import com.baiyue.firstleg.dto.SmartLoadingDtos.*;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.yaml.snakeyaml.Yaml;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
class PlatformSmartLoadingControllerContractTest { class PlatformSmartLoadingControllerContractTest {
@@ -98,13 +101,35 @@ class PlatformSmartLoadingControllerContractTest {
.contains("回到 IN_PROGRESS") .contains("回到 IN_PROGRESS")
.contains("COMPLETED 永久拒绝增量"); .contains("COMPLETED 永久拒绝增量");
} }
@Test void planContractEmbedsColoadGroupsWithoutPerInboundFanout() throws Exception { @Test void planContractEmbedsColoadGroupsAndPalletMembersWithoutPerInboundFanout() throws Exception {
String yaml=java.nio.file.Files.readString(java.nio.file.Path.of("src/main/resources/openapi/firstleg-v1.yaml")); String yaml=java.nio.file.Files.readString(java.nio.file.Path.of("src/main/resources/openapi/firstleg-v1.yaml"));
assertThat(yaml) Map<?,?> document=new Yaml().load(yaml);
.contains("required: [id, planNo, status, bookingId, version, canAssign, canEdit, finalCompletionStatus, coLoadGroups, items]") Map<?,?> schemas=(Map<?,?>)((Map<?,?>)document.get("components")).get("schemas");
.contains("SmartLoadingPlanCoLoadGroup:") Map<?,?> plan=(Map<?,?>)schemas.get("SmartLoadingPlan");
.contains("required: [groupId, groupNo, lockedPlanId, memberOrderCount, inboundFragmentCount, fullPackageCount, memberInboundIds]") assertThat((List<?>)plan.get("required")).extracting(Object::toString)
.contains("调用方不得按 inboundId 扇出重建"); .containsExactlyInAnyOrder("id","planNo","status","bookingId","version","canAssign","canEdit",
"finalCompletionStatus","coLoadGroups","palletMembers","items");
Map<?,?> properties=(Map<?,?>)plan.get("properties");
Map<?,?> groups=(Map<?,?>)properties.get("coLoadGroups");
assertThat(groups.get("type")).isEqualTo("array");
assertThat(((Map<?,?>)groups.get("items")).get("$ref"))
.isEqualTo("#/components/schemas/SmartLoadingPlanCoLoadGroup");
assertThat(groups.get("description").toString()).contains("调用方不得按 inboundId 扇出重建");
Map<?,?> group=(Map<?,?>)schemas.get("SmartLoadingPlanCoLoadGroup");
assertThat((List<?>)group.get("required")).extracting(Object::toString)
.containsExactlyInAnyOrder("groupId","groupNo","lockedPlanId","memberOrderCount",
"inboundFragmentCount","fullPackageCount","memberInboundIds");
Map<?,?> pallets=(Map<?,?>)properties.get("palletMembers");
assertThat(pallets.get("type")).isEqualTo("array");
assertThat(((Map<?,?>)pallets.get("items")).get("$ref"))
.isEqualTo("#/components/schemas/SmartLoadingPlanPalletMembers");
Map<?,?> pallet=(Map<?,?>)schemas.get("SmartLoadingPlanPalletMembers");
assertThat((List<?>)pallet.get("required")).extracting(Object::toString)
.containsExactlyInAnyOrder("palletId","members");
Map<?,?> members=(Map<?,?>)((Map<?,?>)pallet.get("properties")).get("members");
assertThat(members.get("type")).isEqualTo("array");
assertThat(((Map<?,?>)members.get("items")).get("$ref"))
.isEqualTo("#/components/schemas/SmartLoadingCandidateGroupMember");
} }
private void authority(String method,String permission,Class<?>...types)throws Exception{Method m=PlatformSmartLoadingController.class.getDeclaredMethod(method,types);assertThat(m.getAnnotation(PreAuthorize.class).value()).isEqualTo("hasAuthority('"+permission+"')");} private void authority(String method,String permission,Class<?>...types)throws Exception{Method m=PlatformSmartLoadingController.class.getDeclaredMethod(method,types);assertThat(m.getAnnotation(PreAuthorize.class).value()).isEqualTo("hasAuthority('"+permission+"')");}
} }