package cn.iocoder.yudao.module.system.controller.admin.logger; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.logger.OperateLogService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; import java.util.Map; import java.util.Set; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class OperateLogControllerTest { @Mock private OperateLogService logService; @Mock private AdminUserService userService; @InjectMocks private OperateLogController controller; @Test void pageResolvesNamesInOneBatchAndKeepsTotal() { var request = new OperateLogPageReqVO(); when(logService.getOperateLogPage(request)).thenReturn(new PageResult<>( List.of(log(1L, 2), log(1L, 2), log(2L, 2)), 30L)); when(userService.getUserMap(Set.of(1L, 2L))).thenReturn(Map.of( 1L, user(1L, "超级管理员", "admin"), 2L, user(2L, "", "operator"))); var result = controller.pageOperateLog(request).getData(); assertEquals(30L, result.getTotal()); assertEquals(List.of("超级管理员", "超级管理员", "operator"), result.getList().stream().map(OperateLogRespVO::getUserName).toList()); verify(userService, times(1)).getUserMap(Set.of(1L, 2L)); } @Test void detailResolvesNameWithoutTranslationAspect() { when(logService.getOperateLog(9L)).thenReturn(log(1L, 2)); when(userService.getUserMap(Set.of(1L))).thenReturn(Map.of(1L, user(1L, "操作员", "operator"))); assertEquals("操作员", controller.getOperateLog(9L).getData().getUserName()); } @Test void missingAccountShowsOriginalId() { when(logService.getOperateLog(9L)).thenReturn(log(88L, 2)); when(userService.getUserMap(Set.of(88L))).thenReturn(Map.of()); var response = controller.getOperateLog(9L).getData(); assertEquals(88L, response.getUserId()); assertEquals("用户(编号:88)", response.getUserName()); } @Test void memberAndMissingOperatorDoNotResolveAdminWithSameId() { var request = new OperateLogPageReqVO(); when(logService.getOperateLogPage(request)).thenReturn(new PageResult<>( List.of(log(1L, 1), log(null, 2)), 2L)); var responses = controller.pageOperateLog(request).getData().getList(); assertEquals("会员(编号:1)", responses.get(0).getUserName()); assertEquals("未知操作人", responses.get(1).getUserName()); verifyNoInteractions(userService); } @Test void absentLogStillReturnsNull() { assertNull(controller.getOperateLog(99L).getData()); verifyNoInteractions(userService); } @Test void exportUsesResolvedName() throws Exception { var request = new OperateLogPageReqVO(); var response = mock(HttpServletResponse.class); when(logService.getOperateLogPage(request)).thenReturn(new PageResult<>(List.of(log(1L, 2)), 1L)); when(userService.getUserMap(Set.of(1L))).thenReturn(Map.of(1L, user(1L, "导出操作员", "operator"))); try (var excel = mockStatic(ExcelUtils.class)) { controller.exportOperateLog(response, request); assertEquals(PageParam.PAGE_SIZE_NONE, request.getPageSize()); excel.verify(() -> ExcelUtils.write(eq(response), eq("操作日志.xls"), eq("数据列表"), eq(OperateLogRespVO.class), argThat(rows -> rows.size() == 1 && "导出操作员".equals(((OperateLogRespVO) rows.get(0)).getUserName())))); } } private static OperateLogDO log(Long userId, Integer userType) { var log = new OperateLogDO(); log.setId(9L); log.setUserId(userId); log.setUserType(userType); return log; } private static AdminUserDO user(Long id, String nickname, String username) { return AdminUserDO.builder().id(id).nickname(nickname).username(username).build(); } }