package jnpf.dmsService; import jnpf.dmsEntity.banben.DmsWenjianBanbenJiesuanModel; import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity; import jnpf.dmsEntity.storage.approval.DmsApprovedItem; import jnpf.dmsIntegration.audit.DmsVersionStateAuditRow; import jnpf.dmsMapper.*; import jnpf.exception.DataException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.*; import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDate; import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class DmsApprovedFileProjectionTest { @Mock DmsApprovedBatchMapper receipts; @Mock jnpf.dmsService.center.DmsCenterQueryService center; @Mock DmsApprovedMetadataMapper metadata; @InjectMocks DmsApprovedFileProjection projection; @org.junit.jupiter.params.ParameterizedTest @org.junit.jupiter.params.provider.CsvSource({"audit:zhuwenjian,yes", "audit:jilu:row,yes", "audit:jilu:row,no"}) void projectsRegisteredAuthorAndObjectWithNativeDepartment(String sourceKey, String controlFlag) { DmsWenjianBanbenJiesuanModel model = fixture(); DmsApprovedItem item = receipts.item("t", "source"); item.setSourceKey(sourceKey); item.setShifouShoukong(controlFlag); DmsWenjianBanbenJiesuanModel source = new DmsWenjianBanbenJiesuanModel(); source.setZhidingrenBumenId("author-department"); source.setBianhaoShiyongRenId("number-owner"); source.setShenheLiuchengId("flow"); source.setShenheLiuchengRenwuId("task"); when(metadata.selectSource("t", "xinzeng_shenhe", "audit", "row")).thenReturn(source); projection.enrich(model); assertEquals("author", model.getZhidingRenId()); assertEquals(java.sql.Date.valueOf("2026-09-14"), model.getZhidingRiqi()); assertEquals("author-department", model.getZhidingrenBumenId()); assertEquals("018f0000-0000-7000-8000-000000000999", model.getWenjianDuixiangId()); assertEquals("flow", model.getShenheLiuchengId()); assertEquals("task", model.getShenheLiuchengRenwuId()); assertEquals(item.getFileVersionId().toString(), model.getCenterVersionId()); assertEquals(controlFlag, model.getShifouShoukong()); } @Test void rejectsMissingOfficialObjectBeforeBusinessWrite() { DmsWenjianBanbenJiesuanModel model = fixture(); assertThrows(DataException.class, () -> projection.enrich(model)); assertNull(model.getCenterVersionId()); } @Test void rejectsMissingTaskControlFlagInsteadOfWritingNull() { DmsWenjianBanbenJiesuanModel model = fixture(); receipts.item("t", "source").setShifouShoukong(null); when(metadata.selectSource("t", "xinzeng_shenhe", "audit", "row")) .thenReturn(new DmsWenjianBanbenJiesuanModel()); assertThrows(DataException.class, () -> projection.enrich(model)); assertNull(model.getCenterVersionId()); } private DmsWenjianBanbenJiesuanModel fixture() { DmsWenjianBanbenJiesuanModel model = new DmsWenjianBanbenJiesuanModel(); model.setTenantId("t"); model.setLaiyuanYewuJian("source"); model.setLaiyuanDanjuLeixing("xinzeng_shenhe"); model.setLaiyuanDanjuId("audit"); model.setLaiyuanZixiangId("row"); DmsApprovedItem item = new DmsApprovedItem(); item.setSourceKey("source"); item.setShifouShoukong("no"); item.setDocumentId(UUID.randomUUID()); item.setFileVersionId(UUID.randomUUID()); DmsFileVersionEntity version = new DmsFileVersionEntity(); version.setDocumentId(item.getDocumentId()); version.setPreparedBy("author"); version.setPreparedOn(LocalDate.of(2026,9,14)); version.setVersionLabel("D(00)"); DmsVersionStateAuditRow state = new DmsVersionStateAuditRow(); state.setLifecycleStatus("EFFECTIVE"); state.setEffectiveFrom(new java.util.Date()); when(receipts.item("t", "source")).thenReturn(item); when(center.version("t", item.getFileVersionId())).thenReturn(new jnpf.dmsEntity.center.DmsCenterVersionSnapshot( item.getDocumentId(), item.getFileVersionId(), version.getVersionLabel(), "hash", "author", version.getPreparedOn(), UUID.fromString("018f0000-0000-7000-8000-000000000999"), "EFFECTIVE", state.getEffectiveFrom(), null)); return model; } }