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