package com.baiyue.lastleg.procurement; import com.baiyue.lastleg.procurement.dto.OverseasProcurementRequests; import com.baiyue.lastleg.procurement.dto.OverseasProcurementResponses.*; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import java.util.List; import static org.assertj.core.api.Assertions.*; class ProcurementRequestBoundaryTest { @Test void missingCommandVersionCannotDefaultToZero() throws Exception { var json=new ObjectMapper().findAndRegisterModules(); try(var factory=jakarta.validation.Validation.buildDefaultValidatorFactory()) { var validator=factory.getValidator(); for(var type:List.of(com.baiyue.lastleg.procurement.dto.ProcurementLifecycleRequests.Command.class, com.baiyue.lastleg.procurement.dto.ProcurementLifecycleRequests.Purchase.class, com.baiyue.lastleg.procurement.dto.ProcurementLifecycleRequests.Budget.class, com.baiyue.lastleg.procurement.dto.ProcurementLifecycleRequests.Warehouse.class)) { assertThat(validator.validate(json.readValue("{}",type))).anyMatch(v->"version".equals(v.getPropertyPath().toString())); } } } @Test void legacyGenericFieldsCannotSilentlyBypassDedicatedNodes() { var json=new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); for(String field:List.of("inboundQuantity","outboundDetails","productName","purchaseWarehouseId","domesticTrackingNo")) { assertThatThrownBy(()->json.readValue("{\"version\":0,\""+field+"\":null}",OverseasProcurementRequests.Update.class)) .hasMessageContaining("采购通用编辑仅支持备注"); } } @Test void customerProjectionExcludesInternalFilesAndFinancialDiagnostics() throws Exception { var fee=new com.baiyue.lastleg.procurement.entity.OverseasProcurementFee(); fee.setFeeNo("PF-1");fee.setFeeItemName("关税");fee.setAmount(BigDecimal.TEN);fee.setCurrency("CNY");fee.setWalletStatus("FREEZE_FAILED"); fee.setVoucherFileId(2L);fee.setVoucherFileName("private.pdf");fee.setWalletErrorMessage("database error");fee.setRemark("internal note");fee.setCreatedBy("operator");fee.setWalletLedgerId("private-ledger"); var output=new ObjectMapper().writeValueAsString(com.baiyue.lastleg.procurement.service.ProcurementQueryService.CustomerFee.from(fee,null,false)); assertThat(output).contains("PF-1","FREEZE_FAILED").doesNotContain("private.pdf","voucherFileId","internal note","database error","operator","private-ledger"); } }