dongyukun
9 天以前 e88fba9645a57535d858ce48da8e9d9a3dc84adc
提交 | 用户 | 时间
e7c126 1 package com.iailab.module.infra.service.file;
H 2
3 import cn.hutool.core.date.DatePattern;
4 import cn.hutool.core.date.LocalDateTimeUtil;
5 import cn.hutool.core.map.MapUtil;
6 import com.iailab.framework.common.pojo.PageResult;
7 import com.iailab.framework.test.core.ut.BaseDbUnitTest;
8 import com.iailab.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO;
9 import com.iailab.module.infra.controller.admin.file.vo.config.FileConfigSaveReqVO;
10 import com.iailab.module.infra.dal.dataobject.file.FileConfigDO;
11 import com.iailab.module.infra.dal.mysql.file.FileConfigMapper;
12 import com.iailab.module.infra.framework.file.core.client.FileClient;
13 import com.iailab.module.infra.framework.file.core.client.FileClientConfig;
14 import com.iailab.module.infra.framework.file.core.client.FileClientFactory;
15 import com.iailab.module.infra.framework.file.core.client.local.LocalFileClient;
16 import com.iailab.module.infra.framework.file.core.client.local.LocalFileClientConfig;
17 import com.iailab.module.infra.framework.file.core.enums.FileStorageEnum;
18 import lombok.Data;
19 import org.junit.jupiter.api.Test;
20 import org.springframework.boot.test.mock.mockito.MockBean;
21 import org.springframework.context.annotation.Import;
22
23 import javax.annotation.Resource;
24 import javax.validation.Validator;
25 import java.io.Serializable;
26 import java.time.LocalDateTime;
27 import java.util.Map;
28
29 import static cn.hutool.core.util.RandomUtil.randomEle;
30 import static com.iailab.framework.common.util.date.LocalDateTimeUtils.buildTime;
31 import static com.iailab.framework.common.util.object.ObjectUtils.cloneIgnoreId;
32 import static com.iailab.framework.test.core.util.AssertUtils.assertPojoEquals;
33 import static com.iailab.framework.test.core.util.AssertUtils.assertServiceException;
34 import static com.iailab.framework.test.core.util.RandomUtils.randomLongId;
35 import static com.iailab.framework.test.core.util.RandomUtils.randomPojo;
36 import static com.iailab.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_DELETE_FAIL_MASTER;
37 import static com.iailab.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_NOT_EXISTS;
38 import static org.junit.jupiter.api.Assertions.*;
39 import static org.mockito.ArgumentMatchers.eq;
40 import static org.mockito.Mockito.*;
41
42 /**
43  * {@link FileConfigServiceImpl} 的单元测试类
44  *
45  * @author iailab
46  */
47 @Import(FileConfigServiceImpl.class)
48 public class FileConfigServiceImplTest extends BaseDbUnitTest {
49
50     @Resource
51     private FileConfigServiceImpl fileConfigService;
52
53     @Resource
54     private FileConfigMapper fileConfigMapper;
55
56     @MockBean
57     private Validator validator;
58     @MockBean
59     private FileClientFactory fileClientFactory;
60
61     @Test
62     public void testCreateFileConfig_success() {
63         // 准备参数
64         Map<String, Object> config = MapUtil.<String, Object>builder().put("basePath", "/yunai")
65                 .put("domain", "https://www.baidu.com").build();
66         FileConfigSaveReqVO reqVO = randomPojo(FileConfigSaveReqVO.class,
67                 o -> o.setStorage(FileStorageEnum.LOCAL.getStorage()).setConfig(config))
68                 .setId(null); // 避免 id 被赋值
69
70         // 调用
71         Long fileConfigId = fileConfigService.createFileConfig(reqVO);
72         // 断言
73         assertNotNull(fileConfigId);
74         // 校验记录的属性是否正确
75         FileConfigDO fileConfig = fileConfigMapper.selectById(fileConfigId);
76         assertPojoEquals(reqVO, fileConfig, "id", "config");
77         assertFalse(fileConfig.getMaster());
78         assertEquals("/yunai", ((LocalFileClientConfig) fileConfig.getConfig()).getBasePath());
79         assertEquals("https://www.baidu.com", ((LocalFileClientConfig) fileConfig.getConfig()).getDomain());
80         // 验证 cache
81         assertNull(fileConfigService.getClientCache().getIfPresent(fileConfigId));
82     }
83
84     @Test
85     public void testUpdateFileConfig_success() {
86         // mock 数据
87         FileConfigDO dbFileConfig = randomPojo(FileConfigDO.class, o -> o.setStorage(FileStorageEnum.LOCAL.getStorage())
88                 .setConfig(new LocalFileClientConfig().setBasePath("/yunai").setDomain("https://www.baidu.com")));
89         fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据
90         // 准备参数
91         FileConfigSaveReqVO reqVO = randomPojo(FileConfigSaveReqVO.class, o -> {
92             o.setId(dbFileConfig.getId()); // 设置更新的 ID
93             o.setStorage(FileStorageEnum.LOCAL.getStorage());
94             Map<String, Object> config = MapUtil.<String, Object>builder().put("basePath", "/yunai2")
95                     .put("domain", "https://doc.iocoder.cn").build();
96             o.setConfig(config);
97         });
98
99         // 调用
100         fileConfigService.updateFileConfig(reqVO);
101         // 校验是否更新正确
102         FileConfigDO fileConfig = fileConfigMapper.selectById(reqVO.getId()); // 获取最新的
103         assertPojoEquals(reqVO, fileConfig, "config");
104         assertEquals("/yunai2", ((LocalFileClientConfig) fileConfig.getConfig()).getBasePath());
105         assertEquals("https://doc.iocoder.cn", ((LocalFileClientConfig) fileConfig.getConfig()).getDomain());
106         // 验证 cache
107         assertNull(fileConfigService.getClientCache().getIfPresent(fileConfig.getId()));
108     }
109
110     @Test
111     public void testUpdateFileConfig_notExists() {
112         // 准备参数
113         FileConfigSaveReqVO reqVO = randomPojo(FileConfigSaveReqVO.class);
114
115         // 调用, 并断言异常
116         assertServiceException(() -> fileConfigService.updateFileConfig(reqVO), FILE_CONFIG_NOT_EXISTS);
117     }
118
119     @Test
120     public void testUpdateFileConfigMaster_success() {
121         // mock 数据
122         FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(false);
123         fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据
124         FileConfigDO masterFileConfig = randomFileConfigDO().setMaster(true);
125         fileConfigMapper.insert(masterFileConfig);// @Sql: 先插入出一条存在的数据
126
127         // 调用
128         fileConfigService.updateFileConfigMaster(dbFileConfig.getId());
129         // 断言数据
130         assertTrue(fileConfigMapper.selectById(dbFileConfig.getId()).getMaster());
131         assertFalse(fileConfigMapper.selectById(masterFileConfig.getId()).getMaster());
132         // 验证 cache
133         assertNull(fileConfigService.getClientCache().getIfPresent(0L));
134     }
135
136     @Test
137     public void testUpdateFileConfigMaster_notExists() {
138         // 调用, 并断言异常
139         assertServiceException(() -> fileConfigService.updateFileConfigMaster(randomLongId()), FILE_CONFIG_NOT_EXISTS);
140     }
141
142     @Test
143     public void testDeleteFileConfig_success() {
144         // mock 数据
145         FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(false);
146         fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据
147         // 准备参数
148         Long id = dbFileConfig.getId();
149
150         // 调用
151         fileConfigService.deleteFileConfig(id);
152         // 校验数据不存在了
153         assertNull(fileConfigMapper.selectById(id));
154         // 验证 cache
155         assertNull(fileConfigService.getClientCache().getIfPresent(id));
156     }
157
158     @Test
159     public void testDeleteFileConfig_notExists() {
160         // 准备参数
161         Long id = randomLongId();
162
163         // 调用, 并断言异常
164         assertServiceException(() -> fileConfigService.deleteFileConfig(id), FILE_CONFIG_NOT_EXISTS);
165     }
166
167     @Test
168     public void testDeleteFileConfig_master() {
169         // mock 数据
170         FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(true);
171         fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据
172         // 准备参数
173         Long id = dbFileConfig.getId();
174
175         // 调用, 并断言异常
176         assertServiceException(() -> fileConfigService.deleteFileConfig(id), FILE_CONFIG_DELETE_FAIL_MASTER);
177     }
178
179     @Test
180     public void testGetFileConfigPage() {
181         // mock 数据
182         FileConfigDO dbFileConfig = randomFileConfigDO().setName("iailab")
183                 .setStorage(FileStorageEnum.LOCAL.getStorage());
184         dbFileConfig.setCreateTime(LocalDateTimeUtil.parse("2020-01-23", DatePattern.NORM_DATE_PATTERN));// 等会查询到
185         fileConfigMapper.insert(dbFileConfig);
186         // 测试 name 不匹配
187         fileConfigMapper.insert(cloneIgnoreId(dbFileConfig, o -> o.setName("源码")));
188         // 测试 storage 不匹配
189         fileConfigMapper.insert(cloneIgnoreId(dbFileConfig, o -> o.setStorage(FileStorageEnum.DB.getStorage())));
190         // 测试 createTime 不匹配
191         fileConfigMapper.insert(cloneIgnoreId(dbFileConfig, o -> o.setCreateTime(LocalDateTimeUtil.parse("2020-11-23", DatePattern.NORM_DATE_PATTERN))));
192         // 准备参数
193         FileConfigPageReqVO reqVO = new FileConfigPageReqVO();
194         reqVO.setName("平台");
195         reqVO.setStorage(FileStorageEnum.LOCAL.getStorage());
196         reqVO.setCreateTime((new LocalDateTime[]{buildTime(2020, 1, 1),
197                 buildTime(2020, 1, 24)}));
198
199         // 调用
200         PageResult<FileConfigDO> pageResult = fileConfigService.getFileConfigPage(reqVO);
201         // 断言
202         assertEquals(1, pageResult.getTotal());
203         assertEquals(1, pageResult.getList().size());
204         assertPojoEquals(dbFileConfig, pageResult.getList().get(0));
205     }
206
207     @Test
208     public void testFileConfig() throws Exception {
209         // mock 数据
210         FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(false);
211         fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据
212         // 准备参数
213         Long id = dbFileConfig.getId();
214         // mock 获得 Client
215         FileClient fileClient = mock(FileClient.class);
216         when(fileClientFactory.getFileClient(eq(id))).thenReturn(fileClient);
217         when(fileClient.upload(any(), any(), any())).thenReturn("https://www.baidu.com");
218
219         // 调用,并断言
220         assertEquals("https://www.baidu.com", fileConfigService.testFileConfig(id));
221     }
222
223     @Test
224     public void testGetFileConfig() {
225         // mock 数据
226         FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(false);
227         fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据
228         // 准备参数
229         Long id = dbFileConfig.getId();
230
231         // 调用,并断言
232         assertPojoEquals(dbFileConfig, fileConfigService.getFileConfig(id));
233     }
234
235     @Test
236     public void testGetFileClient() {
237         // mock 数据
238         FileConfigDO fileConfig = randomFileConfigDO().setMaster(false);
239         fileConfigMapper.insert(fileConfig);
240         // 准备参数
241         Long id = fileConfig.getId();
242         // mock 获得 Client
243         FileClient fileClient = new LocalFileClient(id, new LocalFileClientConfig());
244         when(fileClientFactory.getFileClient(eq(id))).thenReturn(fileClient);
245
246         // 调用,并断言
247         assertSame(fileClient, fileConfigService.getFileClient(id));
248         // 断言缓存
249         verify(fileClientFactory).createOrUpdateFileClient(eq(id), eq(fileConfig.getStorage()),
250                 eq(fileConfig.getConfig()));
251     }
252
253     @Test
254     public void testGetMasterFileClient() {
255         // mock 数据
256         FileConfigDO fileConfig = randomFileConfigDO().setMaster(true);
257         fileConfigMapper.insert(fileConfig);
258         // 准备参数
259         Long id = fileConfig.getId();
260         // mock 获得 Client
261         FileClient fileClient = new LocalFileClient(id, new LocalFileClientConfig());
262         when(fileClientFactory.getFileClient(eq(fileConfig.getId()))).thenReturn(fileClient);
263
264         // 调用,并断言
265         assertSame(fileClient, fileConfigService.getMasterFileClient());
266         // 断言缓存
267         verify(fileClientFactory).createOrUpdateFileClient(eq(fileConfig.getId()), eq(fileConfig.getStorage()),
268                 eq(fileConfig.getConfig()));
269     }
270
271     private FileConfigDO randomFileConfigDO() {
272         return randomPojo(FileConfigDO.class).setStorage(randomEle(FileStorageEnum.values()).getStorage())
273                 .setConfig(new EmptyFileClientConfig());
274     }
275
276     @Data
277     public static class EmptyFileClientConfig implements FileClientConfig, Serializable {
278
279     }
280
281 }