package jnpf.bizcommon.audit.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jnpf.audit.AuditApiConsts; import jnpf.bizcommon.audit.entity.AuditEventEntity; import jnpf.bizcommon.audit.entity.model.DmsFolderAuditPageQuery; import jnpf.bizcommon.audit.entity.model.AuditEventListVO; import jnpf.bizcommon.audit.entity.model.AuditEventDetailVO; import jnpf.bizcommon.audit.entity.model.AuditFieldDiffViewVO; import jnpf.bizcommon.audit.mapper.AuditEventMapper; import jnpf.bizcommon.audit.mapper.AuditQueryMapper; import jnpf.bizcommon.audit.service.impl.AuditQueryServiceImpl; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.springframework.test.util.ReflectionTestUtils; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class DmsFolderAuditQueryServiceTest { @Test void pageAlwaysAddsDmsFolderAndTenantScope() { AuditQueryMapper queryMapper = mock(AuditQueryMapper.class); when(queryMapper.countOperations(any())).thenReturn(0L); when(queryMapper.selectOperationPage(any(), anyLong(), anyLong())) .thenReturn(Collections.emptyList()); AuditQueryServiceImpl service = service(queryMapper, mock(AuditEventMapper.class)); DmsFolderAuditPageQuery query = new DmsFolderAuditPageQuery(); query.setKeyword("质量"); query.setSigned(Boolean.TRUE); service.dmsFolderPage(query); @SuppressWarnings("rawtypes") ArgumentCaptor captor = ArgumentCaptor.forClass(QueryWrapper.class); verify(queryMapper).countOperations(captor.capture()); QueryWrapper wrapper = captor.getValue(); String sql = wrapper.getCustomSqlSegment(); assertTrue(sql.contains("tenant_id")); assertTrue(sql.contains("biz_type")); assertTrue(sql.contains("target_table")); assertTrue(sql.contains("event_category")); assertTrue(sql.contains("EXISTS")); assertTrue(wrapper.getParamNameValuePairs().containsValue(AuditApiConsts.DEFAULT_TENANT_ID)); assertTrue(wrapper.getParamNameValuePairs().containsValue("DMS_FOLDER")); assertTrue(wrapper.getParamNameValuePairs().containsValue("dms_folders")); } @Test void detailRejectsAnEventOutsideTheFixedScope() { AuditEventMapper eventMapper = mock(AuditEventMapper.class); when(eventMapper.selectOne(any())).thenReturn(null); AuditQueryServiceImpl service = service(mock(AuditQueryMapper.class), eventMapper); assertThrows(RuntimeException.class, () -> service.dmsFolderDetail(9L)); @SuppressWarnings("rawtypes") ArgumentCaptor captor = ArgumentCaptor.forClass(QueryWrapper.class); verify(eventMapper).selectOne(captor.capture()); assertTrue(captor.getValue().getCustomSqlSegment().contains("tenant_id")); assertTrue(captor.getValue().getParamNameValuePairs().containsValue("DMS_FOLDER")); } @Test void listVoExposesFolderAndParentNamesFromRetainedSnapshot() { AuditQueryServiceImpl service = new AuditQueryServiceImpl(); AuditEventEntity event = new AuditEventEntity(); event.setBizType("DMS_FOLDER"); event.setTargetTable("dms_folders"); event.setDataSnapshot("{\"name\":\"检验报告\",\"parentName\":\"质量管理\"}"); AuditEventListVO vo = ReflectionTestUtils.invokeMethod(service, "toListVo", event); assertEquals("检验报告", vo.getFolderName()); assertEquals("质量管理", vo.getParentFolderName()); } @Test void detailUsesFullFolderPathsAndKeepsRawIds() { AuditQueryServiceImpl service = new AuditQueryServiceImpl(); AuditFieldDiffViewVO parentDiff = new AuditFieldDiffViewVO(); parentDiff.setField("parent_id"); parentDiff.setOldData("old-parent-id"); parentDiff.setNewData("new-parent-id"); AuditEventDetailVO detail = new AuditEventDetailVO(); detail.setFieldDiffList(Collections.singletonList(parentDiff)); ReflectionTestUtils.invokeMethod(service, "applyDmsFolderDiffDisplays", detail, "{\"oldParentName\":\"受控文件\"," + "\"oldPath\":\"/档案库/受控文件/报告\"," + "\"newParentName\":\"检验报告\"," + "\"newPath\":\"/质量体系/检验报告/报告\"}"); assertEquals("/档案库/受控文件/报告", parentDiff.getOldDisplay()); assertEquals("/质量体系/检验报告/报告", parentDiff.getNewDisplay()); assertEquals("old-parent-id", parentDiff.getOldData()); assertEquals("new-parent-id", parentDiff.getNewData()); } @Test void detailUsesVariableRootNameFromFolderPath() { AuditQueryServiceImpl service = new AuditQueryServiceImpl(); AuditFieldDiffViewVO parentDiff = new AuditFieldDiffViewVO(); parentDiff.setField("parent_id"); AuditEventDetailVO detail = new AuditEventDetailVO(); detail.setFieldDiffList(Collections.singletonList(parentDiff)); ReflectionTestUtils.invokeMethod(service, "applyDmsFolderDiffDisplays", detail, "{\"oldPath\":\"/项目文档/D/报告\"," + "\"newPath\":\"/质量文档/B/报告\"}"); assertEquals("/项目文档/D/报告", parentDiff.getOldDisplay()); assertEquals("/质量文档/B/报告", parentDiff.getNewDisplay()); } private AuditQueryServiceImpl service(AuditQueryMapper queryMapper, AuditEventMapper eventMapper) { AuditQueryServiceImpl service = new AuditQueryServiceImpl(); ReflectionTestUtils.setField(service, "auditQueryMapper", queryMapper); ReflectionTestUtils.setField(service, "auditEventMapper", eventMapper); return service; } }