package jnpf.dmsService; import jnpf.base.UserInfo; import jnpf.dmsEntity.operationlog.entity.DmsFileOperationLogEntity; import jnpf.dmsEntity.operationlog.vo.DmsFileOperationLogPageVO; import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity; import jnpf.dmsEntity.permission.enums.DmsPermissionAction; import jnpf.dmsEntity.permission.enums.DmsResourceType; import jnpf.dmsMapper.DmsFileOperationLogMapper; import jnpf.dmsMapper.DmsFileVersionMapper; import jnpf.dmsPermission.DmsCurrentIdentity; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import java.util.Collections; import java.util.Date; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class DmsFileOperationLogServiceTest { private final DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class); private final DmsPermissionDecisionService decisionService = mock(DmsPermissionDecisionService.class); private final DmsFileVersionMapper fileVersionMapper = mock(DmsFileVersionMapper.class); private final DmsFileOperationLogMapper operationLogMapper = mock(DmsFileOperationLogMapper.class); private final DmsFileOperationLogService service = new DmsFileOperationLogService( currentIdentity, decisionService, fileVersionMapper, operationLogMapper); private final UUID documentId = UUID.fromString("018f0000-0000-7000-8000-000000000901"); private final UUID fileVersionId = UUID.fromString("018f0000-0000-7000-8000-000000000902"); private UserInfo user; @BeforeEach void setUp() { user = new UserInfo(); user.setTenantId("tenant-1"); user.setUserId("user-1"); user.setUserName("张三"); when(currentIdentity.requireUser()).thenReturn(user); when(currentIdentity.tenantId(user)).thenReturn("tenant-1"); } @Test void recordsDisplayReadyViewLogWithIdempotencyKey() { UUID operationId = UUID.fromString("018f0000-0000-7000-8000-000000000903"); service.recordView(user, "tenant-1", documentId, fileVersionId, "质量手册.docx", operationId); ArgumentCaptor captor = ArgumentCaptor.forClass(DmsFileOperationLogEntity.class); verify(operationLogMapper).insertIgnore(captor.capture()); DmsFileOperationLogEntity log = captor.getValue(); assertEquals("VIEW", log.getOperationCode()); assertEquals("VIEW:" + operationId, log.getOperationKey()); assertEquals("用户张三查看了文件:质量手册.docx", log.getOperationContent()); } @Test void recordsDisplayReadyDownloadLogWithIdempotencyKey() { UUID operationId = UUID.fromString("018f0000-0000-7000-8000-000000000904"); service.recordDownload(user, "tenant-1", documentId, fileVersionId, "质量手册.docx", operationId); ArgumentCaptor captor = ArgumentCaptor.forClass(DmsFileOperationLogEntity.class); verify(operationLogMapper).insertIgnore(captor.capture()); DmsFileOperationLogEntity log = captor.getValue(); assertEquals("DOWNLOAD", log.getOperationCode()); assertEquals("DOWNLOAD:" + operationId, log.getOperationKey()); assertEquals("用户张三下载了文件:质量手册.docx", log.getOperationContent()); } @Test void queriesDocumentHistoryAfterCheckingReadPermission() { DmsFileVersionEntity version = new DmsFileVersionEntity(); version.setId(fileVersionId); version.setDocumentId(documentId); when(fileVersionMapper.selectByTenantAndId("tenant-1", fileVersionId)).thenReturn(version); when(operationLogMapper.countByDocument("tenant-1", documentId, "查看")) .thenReturn(1L); DmsFileOperationLogEntity row = new DmsFileOperationLogEntity(); row.setId(7L); row.setOperationCode("VIEW"); row.setOperationContent("用户张三查看了文件:质量手册.docx"); row.setOccurredAt(new Date(1234L)); when(operationLogMapper.selectByDocument("tenant-1", documentId, "查看", 10, 0L)) .thenReturn(Collections.singletonList(row)); DmsFileOperationLogPageVO page = service.page(fileVersionId, " 查看 ", 1, 10); verify(decisionService).requireAllowed(DmsResourceType.FILE_VERSION, fileVersionId, DmsPermissionAction.READ); assertEquals(1L, page.getTotal()); assertEquals("用户张三查看了文件:质量手册.docx", page.getList().get(0).getOperationContent()); } }