package cn.iocoder.yudao.module.im.service.face; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackDO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackItemDO; import cn.iocoder.yudao.module.im.dal.mysql.face.ImFacePackItemMapper; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import java.util.Arrays; import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.FACE_PACK_ITEM_NOT_EXISTS; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.FACE_PACK_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * {@link ImFacePackItemServiceImpl} 的单元测试 * * @author 芋道源码 */ public class ImFacePackItemServiceImplTest extends BaseMockitoUnitTest { @InjectMocks private ImFacePackItemServiceImpl service; @Mock private ImFacePackItemMapper facePackItemMapper; @Mock private ImFacePackService facePackService; // ========== getEnabledItemListByPackIds ========== @Test public void testGetEnabledItemListByPackIds_emptyShortReturn() { // 调用 + 断言:空入参直接返回空列表,不查 DB assertTrue(service.getEnabledItemListByPackIds(Collections.emptyList()).isEmpty()); verify(facePackItemMapper, never()).selectListByPackIdsAndStatus(any(), any()); } @Test public void testGetEnabledItemListByPackIds_passesEnableStatus() { // 准备 List packIds = Arrays.asList(1L, 2L); ImFacePackItemDO item = new ImFacePackItemDO(); when(facePackItemMapper.selectListByPackIdsAndStatus(packIds, CommonStatusEnum.ENABLE.getStatus())) .thenReturn(Collections.singletonList(item)); // 调用 + 断言 assertEquals(1, service.getEnabledItemListByPackIds(packIds).size()); } // ========== createFacePackItem ========== @Test public void testCreateFacePackItem_success() { // 准备 ImFacePackItemSaveReqVO reqVO = new ImFacePackItemSaveReqVO(); reqVO.setPackId(10L).setUrl("a.png").setName("dog").setWidth(100).setHeight(100) .setSort(0).setStatus(CommonStatusEnum.ENABLE.getStatus()); when(facePackService.validateFacePackExists(10L)).thenReturn(new ImFacePackDO()); // 调用 service.createFacePackItem(reqVO); // 断言 ArgumentCaptor captor = ArgumentCaptor.forClass(ImFacePackItemDO.class); verify(facePackItemMapper).insert(captor.capture()); assertEquals(10L, captor.getValue().getPackId()); assertEquals("a.png", captor.getValue().getUrl()); } @Test public void testCreateFacePackItem_packNotExists() { // 准备:所属表情包不存在 ImFacePackItemSaveReqVO reqVO = new ImFacePackItemSaveReqVO(); reqVO.setPackId(99L).setUrl("a.png").setWidth(100).setHeight(100).setSort(0) .setStatus(CommonStatusEnum.ENABLE.getStatus()); when(facePackService.validateFacePackExists(99L)) .thenThrow(new ServiceException(FACE_PACK_NOT_EXISTS.getCode(), FACE_PACK_NOT_EXISTS.getMsg())); // 调用 + 断言:不落库 assertThrows(ServiceException.class, () -> service.createFacePackItem(reqVO)); verify(facePackItemMapper, never()).insert(any(ImFacePackItemDO.class)); } // ========== updateFacePackItem ========== @Test public void testUpdateFacePackItem_success() { // 准备 ImFacePackItemSaveReqVO reqVO = new ImFacePackItemSaveReqVO(); reqVO.setId(1L).setPackId(10L).setUrl("a.png").setWidth(100).setHeight(100) .setSort(0).setStatus(CommonStatusEnum.ENABLE.getStatus()); when(facePackItemMapper.selectById(1L)).thenReturn(new ImFacePackItemDO()); when(facePackService.validateFacePackExists(10L)).thenReturn(new ImFacePackDO()); // 调用 service.updateFacePackItem(reqVO); // 断言 verify(facePackItemMapper).updateById(any(ImFacePackItemDO.class)); } @Test public void testUpdateFacePackItem_itemNotExists() { ImFacePackItemSaveReqVO reqVO = new ImFacePackItemSaveReqVO(); reqVO.setId(99L).setPackId(10L).setUrl("a.png").setWidth(100).setHeight(100).setSort(0) .setStatus(CommonStatusEnum.ENABLE.getStatus()); when(facePackItemMapper.selectById(99L)).thenReturn(null); ServiceException exception = assertThrows(ServiceException.class, () -> service.updateFacePackItem(reqVO)); assertEquals(FACE_PACK_ITEM_NOT_EXISTS.getCode(), exception.getCode()); verify(facePackItemMapper, never()).updateById(any(ImFacePackItemDO.class)); } // ========== deleteFacePackItem ========== @Test public void testDeleteFacePackItem_success() { when(facePackItemMapper.selectById(1L)).thenReturn(new ImFacePackItemDO()); service.deleteFacePackItem(1L); verify(facePackItemMapper).deleteById(1L); } @Test public void testDeleteFacePackItem_notExists() { when(facePackItemMapper.selectById(99L)).thenReturn(null); ServiceException exception = assertThrows(ServiceException.class, () -> service.deleteFacePackItem(99L)); assertEquals(FACE_PACK_ITEM_NOT_EXISTS.getCode(), exception.getCode()); verify(facePackItemMapper, never()).deleteById(anyLong()); } @Test public void testDeleteFacePackItemList_emptySkip() { service.deleteFacePackItemList(Collections.emptyList()); verify(facePackItemMapper, never()).deleteByIds(any()); } @Test public void testDeleteFacePackItemList_success() { List ids = Arrays.asList(1L, 2L); when(facePackItemMapper.deleteByIds(ids)).thenReturn(2); service.deleteFacePackItemList(ids); verify(facePackItemMapper).deleteByIds(ids); } @Test public void testDeleteFacePackItemList_ignoreMissingIds() { List ids = Arrays.asList(1L, 2L); when(facePackItemMapper.deleteByIds(ids)).thenReturn(1); service.deleteFacePackItemList(ids); verify(facePackItemMapper).deleteByIds(ids); } }