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;
|
}
|
}
|