package com.iailab.module.infra.service.file; import cn.hutool.core.io.resource.ResourceUtil; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.util.object.ObjectUtils; import com.iailab.framework.test.core.ut.BaseDbUnitTest; import com.iailab.framework.test.core.util.AssertUtils; import com.iailab.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.iailab.module.infra.dal.dataobject.file.FileDO; import com.iailab.module.infra.dal.mysql.file.FileMapper; import com.iailab.module.infra.framework.file.core.client.FileClient; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; import java.time.LocalDateTime; import static com.iailab.framework.common.util.date.LocalDateTimeUtils.buildTime; import static com.iailab.framework.test.core.util.AssertUtils.assertServiceException; import static com.iailab.framework.test.core.util.RandomUtils.*; import static com.iailab.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; @Import({FileServiceImpl.class}) public class FileServiceImplTest extends BaseDbUnitTest { @Resource private FileService fileService; @Resource private FileMapper fileMapper; @MockBean private FileConfigService fileConfigService; @Test public void testGetFilePage() { // mock 数据 FileDO dbFile = randomPojo(FileDO.class, o -> { // 等会查询到 o.setPath("yunai"); o.setType("image/jpg"); o.setCreateTime(buildTime(2021, 1, 15)); }); fileMapper.insert(dbFile); // 测试 path 不匹配 fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> o.setPath("tudou"))); // 测试 type 不匹配 fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { o.setType("image/png"); })); // 测试 createTime 不匹配 fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { o.setCreateTime(buildTime(2020, 1, 15)); })); // 准备参数 FilePageReqVO reqVO = new FilePageReqVO(); reqVO.setPath("yunai"); reqVO.setType("jp"); reqVO.setCreateTime((new LocalDateTime[]{buildTime(2021, 1, 10), buildTime(2021, 1, 20)})); // 调用 PageResult pageResult = fileService.getFilePage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); AssertUtils.assertPojoEquals(dbFile, pageResult.getList().get(0)); } @Test public void testCreateFile_success() throws Exception { // 准备参数 String path = randomString(); byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); // mock Master 文件客户端 FileClient client = mock(FileClient.class); when(fileConfigService.getMasterFileClient()).thenReturn(client); String url = randomString(); when(client.upload(same(content), same(path), eq("image/jpeg"))).thenReturn(url); when(client.getId()).thenReturn(10L); String name = "单测文件名"; // 调用 String result = fileService.createFile(name, path, content); // 断言 assertEquals(result, url); // 校验数据 FileDO file = fileMapper.selectOne(FileDO::getPath, path); assertEquals(10L, file.getConfigId()); assertEquals(path, file.getPath()); assertEquals(url, file.getUrl()); assertEquals("image/jpeg", file.getType()); assertEquals(content.length, file.getSize()); } @Test public void testDeleteFile_success() throws Exception { // mock 数据 FileDO dbFile = randomPojo(FileDO.class, o -> o.setConfigId(10L).setPath("tudou.jpg")); fileMapper.insert(dbFile);// @Sql: 先插入出一条存在的数据 // mock Master 文件客户端 FileClient client = mock(FileClient.class); when(fileConfigService.getFileClient(eq(10L))).thenReturn(client); // 准备参数 Long id = dbFile.getId(); // 调用 fileService.deleteFile(id); // 校验数据不存在了 assertNull(fileMapper.selectById(id)); // 校验调用 verify(client).delete(eq("tudou.jpg")); } @Test public void testDeleteFile_notExists() { // 准备参数 Long id = randomLongId(); // 调用, 并断言异常 assertServiceException(() -> fileService.deleteFile(id), FILE_NOT_EXISTS); } @Test public void testGetFileContent() throws Exception { // 准备参数 Long configId = 10L; String path = "tudou.jpg"; // mock 方法 FileClient client = mock(FileClient.class); when(fileConfigService.getFileClient(eq(10L))).thenReturn(client); byte[] content = new byte[]{}; when(client.getContent(eq("tudou.jpg"))).thenReturn(content); // 调用 byte[] result = fileService.getFileContent(configId, path); // 断言 assertSame(result, content); } }