mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-08 23:31:53 +08:00
✅ 增加 codegen 模块的单测覆盖率
This commit is contained in:
@@ -0,0 +1,556 @@
|
||||
package cn.iocoder.yudao.module.infra.service.codegen;
|
||||
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||
import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO;
|
||||
import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.column.CodegenColumnSaveReqVO;
|
||||
import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
|
||||
import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO;
|
||||
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
|
||||
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
|
||||
import cn.iocoder.yudao.module.infra.dal.mysql.codegen.CodegenColumnMapper;
|
||||
import cn.iocoder.yudao.module.infra.dal.mysql.codegen.CodegenTableMapper;
|
||||
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
|
||||
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
|
||||
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
|
||||
import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties;
|
||||
import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenBuilder;
|
||||
import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenEngine;
|
||||
import cn.iocoder.yudao.module.infra.service.db.DatabaseTableService;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import com.baomidou.mybatisplus.generator.config.po.TableField;
|
||||
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
||||
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.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
|
||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
|
||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
|
||||
import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.*;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* {@link CodegenServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Import(CodegenServiceImpl.class)
|
||||
public class CodegenServiceImplTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private CodegenServiceImpl codegenService;
|
||||
|
||||
@Resource
|
||||
private CodegenTableMapper codegenTableMapper;
|
||||
@Resource
|
||||
private CodegenColumnMapper codegenColumnMapper;
|
||||
|
||||
@MockBean
|
||||
private DatabaseTableService databaseTableService;
|
||||
|
||||
@MockBean
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@MockBean
|
||||
private CodegenBuilder codegenBuilder;
|
||||
@MockBean
|
||||
private CodegenEngine codegenEngine;
|
||||
|
||||
@MockBean
|
||||
private CodegenProperties codegenProperties;
|
||||
|
||||
@Test
|
||||
public void testCreateCodegenList() {
|
||||
// 准备参数
|
||||
Long userId = randomLongId();
|
||||
CodegenCreateListReqVO reqVO = randomPojo(CodegenCreateListReqVO.class,
|
||||
o -> o.setDataSourceConfigId(1L).setTableNames(Collections.singletonList("t_yunai")));
|
||||
// mock 方法(TableInfo)
|
||||
TableInfo tableInfo = mock(TableInfo.class);
|
||||
when(databaseTableService.getTable(eq(1L), eq("t_yunai")))
|
||||
.thenReturn(tableInfo);
|
||||
when(tableInfo.getComment()).thenReturn("芋艿");
|
||||
// mock 方法(TableInfo fields)
|
||||
TableField field01 = mock(TableField.class);
|
||||
when(field01.getComment()).thenReturn("主键");
|
||||
TableField field02 = mock(TableField.class);
|
||||
when(field02.getComment()).thenReturn("名字");
|
||||
List<TableField> fields = Arrays.asList(field01, field02);
|
||||
when(tableInfo.getFields()).thenReturn(fields);
|
||||
// mock 方法(CodegenTableDO)
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class);
|
||||
when(codegenBuilder.buildTable(same(tableInfo))).thenReturn(table);
|
||||
// mock 方法(AdminUserRespDTO)
|
||||
AdminUserRespDTO user = randomPojo(AdminUserRespDTO.class, o -> o.setNickname("芋头"));
|
||||
when(userApi.getUser(eq(userId))).thenReturn(user);
|
||||
// mock 方法(CodegenColumnDO)
|
||||
List<CodegenColumnDO> columns = randomPojoList(CodegenColumnDO.class);
|
||||
when(codegenBuilder.buildColumns(eq(table.getId()), same(fields)))
|
||||
.thenReturn(columns);
|
||||
// mock 方法(CodegenProperties)
|
||||
when(codegenProperties.getFrontType()).thenReturn(CodegenFrontTypeEnum.VUE3.getType());
|
||||
|
||||
// 调用
|
||||
List<Long> result = codegenService.createCodegenList(userId, reqVO);
|
||||
// 断言
|
||||
assertEquals(1, result.size());
|
||||
// 断言(CodegenTableDO)
|
||||
CodegenTableDO dbTable = codegenTableMapper.selectList().get(0);
|
||||
assertPojoEquals(table, dbTable);
|
||||
assertEquals(1L, dbTable.getDataSourceConfigId());
|
||||
assertEquals(CodegenSceneEnum.ADMIN.getScene(), dbTable.getScene());
|
||||
assertEquals(CodegenFrontTypeEnum.VUE3.getType(), dbTable.getFrontType());
|
||||
assertEquals("芋头", dbTable.getAuthor());
|
||||
// 断言(CodegenColumnDO)
|
||||
List<CodegenColumnDO> dbColumns = codegenColumnMapper.selectList();
|
||||
assertEquals(columns.size(), dbColumns.size());
|
||||
assertTrue(dbColumns.get(0).getPrimaryKey());
|
||||
for (int i = 0; i < dbColumns.size(); i++) {
|
||||
assertPojoEquals(columns.get(i), dbColumns.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateTableInfo() {
|
||||
// 情况一
|
||||
assertServiceException(() -> codegenService.validateTableInfo(null),
|
||||
CODEGEN_IMPORT_TABLE_NULL);
|
||||
// 情况二
|
||||
TableInfo tableInfo = mock(TableInfo.class);
|
||||
assertServiceException(() -> codegenService.validateTableInfo(tableInfo),
|
||||
CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL);
|
||||
// 情况三
|
||||
when(tableInfo.getComment()).thenReturn("芋艿");
|
||||
assertServiceException(() -> codegenService.validateTableInfo(tableInfo),
|
||||
CODEGEN_IMPORT_COLUMNS_NULL);
|
||||
// 情况四
|
||||
TableField field = mock(TableField.class);
|
||||
when(field.getName()).thenReturn("name");
|
||||
when(tableInfo.getFields()).thenReturn(Collections.singletonList(field));
|
||||
assertServiceException(() -> codegenService.validateTableInfo(tableInfo),
|
||||
CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL, field.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateCodegen_notExists() {
|
||||
// 准备参数
|
||||
CodegenUpdateReqVO updateReqVO = randomPojo(CodegenUpdateReqVO.class);
|
||||
// mock 方法
|
||||
|
||||
// 调用,并断言
|
||||
assertServiceException(() -> codegenService.updateCodegen(updateReqVO),
|
||||
CODEGEN_TABLE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateCodegen_sub_masterNotExists() {
|
||||
// mock 数据
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setTemplateType(CodegenTemplateTypeEnum.SUB.getType())
|
||||
.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(table);
|
||||
// 准备参数
|
||||
CodegenUpdateReqVO updateReqVO = randomPojo(CodegenUpdateReqVO.class,
|
||||
o -> o.getTable().setId(table.getId())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.SUB.getType()));
|
||||
|
||||
// 调用,并断言
|
||||
assertServiceException(() -> codegenService.updateCodegen(updateReqVO),
|
||||
CODEGEN_MASTER_TABLE_NOT_EXISTS, updateReqVO.getTable().getMasterTableId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateCodegen_sub_columnNotExists() {
|
||||
// mock 数据
|
||||
CodegenTableDO subTable = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setTemplateType(CodegenTemplateTypeEnum.SUB.getType())
|
||||
.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(subTable);
|
||||
// mock 数据(master)
|
||||
CodegenTableDO masterTable = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setTemplateType(CodegenTemplateTypeEnum.MASTER_ERP.getType())
|
||||
.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(masterTable);
|
||||
// 准备参数
|
||||
CodegenUpdateReqVO updateReqVO = randomPojo(CodegenUpdateReqVO.class,
|
||||
o -> o.getTable().setId(subTable.getId())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.SUB.getType())
|
||||
.setMasterTableId(masterTable.getId()));
|
||||
|
||||
// 调用,并断言
|
||||
assertServiceException(() -> codegenService.updateCodegen(updateReqVO),
|
||||
CODEGEN_SUB_COLUMN_NOT_EXISTS, updateReqVO.getTable().getSubJoinColumnId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateCodegen_success() {
|
||||
// mock 数据
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setTemplateType(CodegenTemplateTypeEnum.ONE.getType())
|
||||
.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(table);
|
||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column01);
|
||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column02);
|
||||
// 准备参数
|
||||
CodegenUpdateReqVO updateReqVO = randomPojo(CodegenUpdateReqVO.class,
|
||||
o -> o.getTable().setId(table.getId())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.ONE.getType())
|
||||
.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
CodegenColumnSaveReqVO columnVO01 = randomPojo(CodegenColumnSaveReqVO.class,
|
||||
o -> o.setId(column01.getId()).setTableId(table.getId()));
|
||||
CodegenColumnSaveReqVO columnVO02 = randomPojo(CodegenColumnSaveReqVO.class,
|
||||
o -> o.setId(column02.getId()).setTableId(table.getId()));
|
||||
updateReqVO.setColumns(Arrays.asList(columnVO01, columnVO02));
|
||||
|
||||
// 调用
|
||||
codegenService.updateCodegen(updateReqVO);
|
||||
// 断言
|
||||
CodegenTableDO dbTable = codegenTableMapper.selectById(table.getId());
|
||||
assertPojoEquals(updateReqVO.getTable(), dbTable);
|
||||
List<CodegenColumnDO> dbColumns = codegenColumnMapper.selectList();
|
||||
assertEquals(2, dbColumns.size());
|
||||
assertPojoEquals(columnVO01, dbColumns.get(0));
|
||||
assertPojoEquals(columnVO02, dbColumns.get(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSyncCodegenFromDB() {
|
||||
// mock 数据(CodegenTableDO)
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class, o -> o.setTableName("t_yunai")
|
||||
.setDataSourceConfigId(1L).setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(table);
|
||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||
.setColumnName("id"));
|
||||
codegenColumnMapper.insert(column01);
|
||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||
.setColumnName("name"));
|
||||
codegenColumnMapper.insert(column02);
|
||||
// 准备参数
|
||||
Long tableId = table.getId();
|
||||
// mock 方法(TableInfo)
|
||||
TableInfo tableInfo = mock(TableInfo.class);
|
||||
when(databaseTableService.getTable(eq(1L), eq("t_yunai")))
|
||||
.thenReturn(tableInfo);
|
||||
when(tableInfo.getComment()).thenReturn("芋艿");
|
||||
// mock 方法(TableInfo fields)
|
||||
TableField field01 = mock(TableField.class);
|
||||
when(field01.getComment()).thenReturn("主键");
|
||||
TableField field03 = mock(TableField.class);
|
||||
when(field03.getComment()).thenReturn("分类");
|
||||
List<TableField> fields = Arrays.asList(field01, field03);
|
||||
when(tableInfo.getFields()).thenReturn(fields);
|
||||
when(databaseTableService.getTable(eq(1L), eq("t_yunai")))
|
||||
.thenReturn(tableInfo);
|
||||
// mock 方法(CodegenTableDO)
|
||||
List<CodegenColumnDO> newColumns = randomPojoList(CodegenColumnDO.class);
|
||||
when(codegenBuilder.buildColumns(eq(table.getId()), argThat(tableFields -> {
|
||||
assertEquals(2, tableFields.size());
|
||||
assertSame(tableInfo.getFields(), tableFields);
|
||||
return true;
|
||||
}))).thenReturn(newColumns);
|
||||
|
||||
// 调用
|
||||
codegenService.syncCodegenFromDB(tableId);
|
||||
// 断言
|
||||
List<CodegenColumnDO> dbColumns = codegenColumnMapper.selectList();
|
||||
assertEquals(newColumns.size(), dbColumns.size());
|
||||
assertPojoEquals(newColumns.get(0), dbColumns.get(0));
|
||||
assertPojoEquals(newColumns.get(1), dbColumns.get(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteCodegen_notExists() {
|
||||
assertServiceException(() -> codegenService.deleteCodegen(randomLongId()),
|
||||
CODEGEN_TABLE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteCodegen_success() {
|
||||
// mock 数据
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(table);
|
||||
CodegenColumnDO column = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column);
|
||||
// 准备参数
|
||||
Long tableId = table.getId();
|
||||
|
||||
// 调用
|
||||
codegenService.deleteCodegen(tableId);
|
||||
// 断言
|
||||
assertNull(codegenTableMapper.selectById(tableId));
|
||||
assertEquals(0, codegenColumnMapper.selectList().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetCodegenTableList() {
|
||||
// mock 数据
|
||||
CodegenTableDO table01 = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(table01);
|
||||
CodegenTableDO table02 = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(table02);
|
||||
// 准备参数
|
||||
Long dataSourceConfigId = table01.getDataSourceConfigId();
|
||||
|
||||
// 调用
|
||||
List<CodegenTableDO> result = codegenService.getCodegenTableList(dataSourceConfigId);
|
||||
// 断言
|
||||
assertEquals(1, result.size());
|
||||
assertPojoEquals(table01, result.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetCodegenTablePage() {
|
||||
// mock 数据
|
||||
CodegenTableDO tableDO = randomPojo(CodegenTableDO.class, o -> {
|
||||
o.setTableName("t_yunai");
|
||||
o.setTableComment("芋艿");
|
||||
o.setClassName("SystemYunai");
|
||||
o.setCreateTime(buildTime(2021, 3, 10));
|
||||
}).setScene(CodegenSceneEnum.ADMIN.getScene());
|
||||
codegenTableMapper.insert(tableDO);
|
||||
// 测试 tableName 不匹配
|
||||
codegenTableMapper.insert(cloneIgnoreId(tableDO, o -> o.setTableName(randomString())));
|
||||
// 测试 tableComment 不匹配
|
||||
codegenTableMapper.insert(cloneIgnoreId(tableDO, o -> o.setTableComment(randomString())));
|
||||
// 测试 className 不匹配
|
||||
codegenTableMapper.insert(cloneIgnoreId(tableDO, o -> o.setClassName(randomString())));
|
||||
// 测试 createTime 不匹配
|
||||
codegenTableMapper.insert(cloneIgnoreId(tableDO, logDO -> logDO.setCreateTime(buildTime(2021, 4, 10))));
|
||||
// 准备参数
|
||||
CodegenTablePageReqVO reqVO = new CodegenTablePageReqVO();
|
||||
reqVO.setTableName("yunai");
|
||||
reqVO.setTableComment("芋");
|
||||
reqVO.setClassName("Yunai");
|
||||
reqVO.setCreateTime(buildBetweenTime(2021, 3, 1, 2021, 3, 31));
|
||||
|
||||
// 调用
|
||||
PageResult<CodegenTableDO> pageResult = codegenService.getCodegenTablePage(reqVO);
|
||||
// 断言,只查到了一条符合条件的
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(tableDO, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetCodegenTable() {
|
||||
// mock 数据
|
||||
CodegenTableDO tableDO = randomPojo(CodegenTableDO.class, o -> o.setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||
codegenTableMapper.insert(tableDO);
|
||||
// 准备参数
|
||||
Long id = tableDO.getId();
|
||||
|
||||
// 调用
|
||||
CodegenTableDO result = codegenService.getCodegenTable(id);
|
||||
// 断言
|
||||
assertPojoEquals(tableDO, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetCodegenColumnListByTableId() {
|
||||
// mock 数据
|
||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class);
|
||||
codegenColumnMapper.insert(column01);
|
||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class);
|
||||
codegenColumnMapper.insert(column02);
|
||||
// 准备参数
|
||||
Long tableId = column01.getTableId();
|
||||
|
||||
// 调用
|
||||
List<CodegenColumnDO> result = codegenService.getCodegenColumnListByTableId(tableId);
|
||||
// 断言
|
||||
assertEquals(1, result.size());
|
||||
assertPojoEquals(column01, result.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerationCodes_tableNotExists() {
|
||||
assertServiceException(() -> codegenService.generationCodes(randomLongId()),
|
||||
CODEGEN_TABLE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerationCodes_columnNotExists() {
|
||||
// mock 数据(CodegenTableDO)
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
|
||||
codegenTableMapper.insert(table);
|
||||
// 准备参数
|
||||
Long tableId = table.getId();
|
||||
|
||||
// 调用,并断言
|
||||
assertServiceException(() -> codegenService.generationCodes(tableId),
|
||||
CODEGEN_COLUMN_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerationCodes_sub_tableNotExists() {
|
||||
// mock 数据(CodegenTableDO)
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
|
||||
codegenTableMapper.insert(table);
|
||||
// mock 数据(CodegenColumnDO)
|
||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column01);
|
||||
// 准备参数
|
||||
Long tableId = table.getId();
|
||||
|
||||
// 调用,并断言
|
||||
assertServiceException(() -> codegenService.generationCodes(tableId),
|
||||
CODEGEN_MASTER_GENERATION_FAIL_NO_SUB_TABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerationCodes_sub_columnNotExists() {
|
||||
// mock 数据(CodegenTableDO)
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
|
||||
codegenTableMapper.insert(table);
|
||||
// mock 数据(CodegenColumnDO)
|
||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column01);
|
||||
// mock 数据(sub CodegenTableDO)
|
||||
CodegenTableDO subTable = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.SUB.getType())
|
||||
.setMasterTableId(table.getId()));
|
||||
codegenTableMapper.insert(subTable);
|
||||
// 准备参数
|
||||
Long tableId = table.getId();
|
||||
|
||||
// 调用,并断言
|
||||
assertServiceException(() -> codegenService.generationCodes(tableId),
|
||||
CODEGEN_SUB_COLUMN_NOT_EXISTS, subTable.getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerationCodes_one_success() {
|
||||
// mock 数据(CodegenTableDO)
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()));
|
||||
codegenTableMapper.insert(table);
|
||||
// mock 数据(CodegenColumnDO)
|
||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column01);
|
||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column02);
|
||||
// mock 执行生成
|
||||
Map<String, String> codes = MapUtil.of(randomString(), randomString());
|
||||
when(codegenEngine.execute(eq(table), argThat(columns -> {
|
||||
assertEquals(2, columns.size());
|
||||
assertEquals(column01, columns.get(0));
|
||||
assertEquals(column02, columns.get(1));
|
||||
return true;
|
||||
}), isNull(), isNull())).thenReturn(codes);
|
||||
// 准备参数
|
||||
Long tableId = table.getId();
|
||||
|
||||
// 调用
|
||||
Map<String, String> result = codegenService.generationCodes(tableId);
|
||||
// 断言
|
||||
assertSame(codes, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerationCodes_master_success() {
|
||||
// mock 数据(CodegenTableDO)
|
||||
CodegenTableDO table = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
|
||||
codegenTableMapper.insert(table);
|
||||
// mock 数据(CodegenColumnDO)
|
||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column01);
|
||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
||||
codegenColumnMapper.insert(column02);
|
||||
// mock 数据(sub CodegenTableDO)
|
||||
CodegenTableDO subTable = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTemplateType(CodegenTemplateTypeEnum.SUB.getType())
|
||||
.setMasterTableId(table.getId())
|
||||
.setSubJoinColumnId(1024L));
|
||||
codegenTableMapper.insert(subTable);
|
||||
// mock 数据(sub CodegenColumnDO)
|
||||
CodegenColumnDO subColumn01 = randomPojo(CodegenColumnDO.class, o -> o.setId(1024L).setTableId(subTable.getId()));
|
||||
codegenColumnMapper.insert(subColumn01);
|
||||
// mock 执行生成
|
||||
Map<String, String> codes = MapUtil.of(randomString(), randomString());
|
||||
when(codegenEngine.execute(eq(table), argThat(columns -> {
|
||||
assertEquals(2, columns.size());
|
||||
assertEquals(column01, columns.get(0));
|
||||
assertEquals(column02, columns.get(1));
|
||||
return true;
|
||||
}), argThat(tables -> {
|
||||
assertEquals(1, tables.size());
|
||||
assertPojoEquals(subTable, tables.get(0));
|
||||
return true;
|
||||
}), argThat(columns -> {
|
||||
assertEquals(1, columns.size());
|
||||
assertPojoEquals(subColumn01, columns.size());
|
||||
return true;
|
||||
}))).thenReturn(codes);
|
||||
// 准备参数
|
||||
Long tableId = table.getId();
|
||||
|
||||
// 调用
|
||||
Map<String, String> result = codegenService.generationCodes(tableId);
|
||||
// 断言
|
||||
assertSame(codes, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDatabaseTableList() {
|
||||
// 准备参数
|
||||
Long dataSourceConfigId = randomLongId();
|
||||
String name = randomString();
|
||||
String comment = randomString();
|
||||
// mock 方法
|
||||
TableInfo tableInfo01 = mock(TableInfo.class);
|
||||
when(tableInfo01.getName()).thenReturn("t_yunai");
|
||||
when(tableInfo01.getComment()).thenReturn("芋艿");
|
||||
TableInfo tableInfo02 = mock(TableInfo.class);
|
||||
when(tableInfo02.getName()).thenReturn("t_yunai_02");
|
||||
when(tableInfo02.getComment()).thenReturn("芋艿_02");
|
||||
when(databaseTableService.getTableList(eq(dataSourceConfigId), eq(name), eq(comment)))
|
||||
.thenReturn(ListUtil.toList(tableInfo01, tableInfo02));
|
||||
// mock 数据
|
||||
CodegenTableDO tableDO = randomPojo(CodegenTableDO.class,
|
||||
o -> o.setScene(CodegenSceneEnum.ADMIN.getScene())
|
||||
.setTableName("t_yunai_02")
|
||||
.setDataSourceConfigId(dataSourceConfigId));
|
||||
codegenTableMapper.insert(tableDO);
|
||||
|
||||
// 调用
|
||||
List<DatabaseTableRespVO> result = codegenService.getDatabaseTableList(dataSourceConfigId, name, comment);
|
||||
// 断言
|
||||
assertEquals(1, result.size());
|
||||
assertEquals("t_yunai", result.get(0).getName());
|
||||
assertEquals("芋艿", result.get(0).getComment());
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,89 @@
|
||||
package cn.iocoder.yudao.module.infra.service.codegen.inner;
|
||||
|
||||
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
|
||||
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
|
||||
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
|
||||
import com.baomidou.mybatisplus.generator.config.po.TableField;
|
||||
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
||||
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.InjectMocks;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class CodegenBuilderTest extends BaseMockitoUnitTest {
|
||||
|
||||
@InjectMocks
|
||||
private CodegenBuilder codegenBuilder;
|
||||
|
||||
@Test
|
||||
public void testBuildTable() {
|
||||
// 准备参数
|
||||
TableInfo tableInfo = mock(TableInfo.class);
|
||||
// mock 方法
|
||||
when(tableInfo.getName()).thenReturn("system_user");
|
||||
when(tableInfo.getComment()).thenReturn("用户");
|
||||
|
||||
// 调用
|
||||
CodegenTableDO table = codegenBuilder.buildTable(tableInfo);
|
||||
// 断言
|
||||
assertEquals("system_user", table.getTableName());
|
||||
assertEquals("用户", table.getTableComment());
|
||||
assertEquals("system", table.getModuleName());
|
||||
assertEquals("user", table.getBusinessName());
|
||||
assertEquals("User", table.getClassName());
|
||||
assertEquals("用户", table.getClassComment());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBuildColumns() {
|
||||
// 准备参数
|
||||
Long tableId = randomLongId();
|
||||
TableField tableField = mock(TableField.class);
|
||||
List<TableField> tableFields = Collections.singletonList(tableField);
|
||||
// mock 方法
|
||||
TableField.MetaInfo metaInfo = mock(TableField.MetaInfo.class);
|
||||
when(tableField.getMetaInfo()).thenReturn(metaInfo);
|
||||
when(metaInfo.getJdbcType()).thenReturn(JdbcType.BIGINT);
|
||||
when(tableField.getComment()).thenReturn("编号");
|
||||
when(tableField.isKeyFlag()).thenReturn(true);
|
||||
when(tableField.isKeyIdentityFlag()).thenReturn(true);
|
||||
IColumnType columnType = mock(IColumnType.class);
|
||||
when(tableField.getColumnType()).thenReturn(columnType);
|
||||
when(columnType.getType()).thenReturn("Long");
|
||||
when(tableField.getName()).thenReturn("id2");
|
||||
when(tableField.getPropertyName()).thenReturn("id");
|
||||
|
||||
// 调用
|
||||
List<CodegenColumnDO> columns = codegenBuilder.buildColumns(tableId, tableFields);
|
||||
// 断言
|
||||
assertEquals(1, columns.size());
|
||||
CodegenColumnDO column = columns.get(0);
|
||||
assertEquals(tableId, column.getTableId());
|
||||
assertEquals("id2", column.getColumnName());
|
||||
assertEquals("BIGINT", column.getDataType());
|
||||
assertEquals("编号", column.getColumnComment());
|
||||
assertFalse(column.getNullable());
|
||||
assertTrue(column.getPrimaryKey());
|
||||
assertTrue(column.getAutoIncrement());
|
||||
assertEquals(1, column.getOrdinalPosition());
|
||||
assertEquals("Long", column.getJavaType());
|
||||
assertEquals("id", column.getJavaField());
|
||||
assertNull(column.getDictType());
|
||||
assertNotNull(column.getExample());
|
||||
assertFalse(column.getCreateOperation());
|
||||
assertTrue(column.getUpdateOperation());
|
||||
assertFalse(column.getListOperation());
|
||||
assertEquals("=", column.getListOperationCondition());
|
||||
assertTrue(column.getListOperationResult());
|
||||
assertEquals("input", column.getHtmlType());
|
||||
}
|
||||
|
||||
}
|
@@ -1,4 +0,0 @@
|
||||
/**
|
||||
* 占位,无其它作用
|
||||
*/
|
||||
package cn.iocoder.yudao.module.infra.service.codegen;
|
@@ -51,13 +51,13 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest {
|
||||
// 测试 userId 不匹配
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, o -> o.setUserId(3344L)));
|
||||
// 测试 userType 不匹配
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue())));
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, o -> o.setUserType(UserTypeEnum.MEMBER.getValue())));
|
||||
// 测试 applicationName 不匹配
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, logDO -> logDO.setApplicationName("test")));
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, o -> o.setApplicationName("test")));
|
||||
// 测试 requestUrl 不匹配
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, logDO -> logDO.setRequestUrl("bar")));
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, o -> o.setRequestUrl("bar")));
|
||||
// 测试 exceptionTime 不匹配:构造一个早期时间 2021-02-06 00:00:00
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6))));
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, o -> o.setExceptionTime(buildTime(2021, 2, 6))));
|
||||
// 测试 progressStatus 不匹配
|
||||
apiErrorLogMapper.insert(cloneIgnoreId(apiErrorLogDO, logDO -> logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.DONE.getStatus())));
|
||||
// 准备参数
|
||||
|
@@ -197,11 +197,11 @@ const total = ref(0) // 列表的总页数
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
name: null,
|
||||
birthday: null,
|
||||
name: undefined,
|
||||
birthday: undefined,
|
||||
birthday: [],
|
||||
sex: null,
|
||||
enabled: null,
|
||||
sex: undefined,
|
||||
enabled: undefined,
|
||||
createTime: []
|
||||
})
|
||||
const queryFormRef = ref() // 搜索的表单
|
||||
|
@@ -192,11 +192,11 @@ const total = ref(0) // 列表的总页数
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
name: null,
|
||||
birthday: null,
|
||||
name: undefined,
|
||||
birthday: undefined,
|
||||
birthday: [],
|
||||
sex: null,
|
||||
enabled: null,
|
||||
sex: undefined,
|
||||
enabled: undefined,
|
||||
createTime: []
|
||||
})
|
||||
const queryFormRef = ref() // 搜索的表单
|
||||
|
@@ -177,11 +177,11 @@ const total = ref(0) // 列表的总页数
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
name: null,
|
||||
birthday: null,
|
||||
name: undefined,
|
||||
birthday: undefined,
|
||||
birthday: [],
|
||||
sex: null,
|
||||
enabled: null,
|
||||
sex: undefined,
|
||||
enabled: undefined,
|
||||
createTime: []
|
||||
})
|
||||
const queryFormRef = ref() // 搜索的表单
|
||||
|
@@ -177,11 +177,11 @@ const total = ref(0) // 列表的总页数
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
name: null,
|
||||
birthday: null,
|
||||
name: undefined,
|
||||
birthday: undefined,
|
||||
birthday: [],
|
||||
sex: null,
|
||||
enabled: null,
|
||||
sex: undefined,
|
||||
enabled: undefined,
|
||||
createTime: []
|
||||
})
|
||||
const queryFormRef = ref() // 搜索的表单
|
||||
|
@@ -106,7 +106,7 @@ const { t } = useI18n() // 国际化
|
||||
const loading = ref(true) // 列表的加载中
|
||||
const list = ref([]) // 列表的数据
|
||||
const queryParams = reactive({
|
||||
name: null
|
||||
name: undefined
|
||||
})
|
||||
const queryFormRef = ref() // 搜索的表单
|
||||
const exportLoading = ref(false) // 导出的加载中
|
||||
|
@@ -8,3 +8,5 @@ DELETE FROM "infra_api_error_log";
|
||||
DELETE FROM "infra_file_config";
|
||||
DELETE FROM "infra_test_demo";
|
||||
DELETE FROM "infra_data_source_config";
|
||||
DELETE FROM "infra_codegen_table";
|
||||
DELETE FROM "infra_codegen_column";
|
||||
|
@@ -170,3 +170,59 @@ CREATE TABLE IF NOT EXISTS "infra_data_source_config" (
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '数据源配置表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "infra_codegen_table" (
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"data_source_config_id" bigint not null,
|
||||
"scene" tinyint not null DEFAULT 1,
|
||||
"table_name" varchar(200) NOT NULL,
|
||||
"table_comment" varchar(500) NOT NULL,
|
||||
"remark" varchar(500) NOT NULL,
|
||||
"module_name" varchar(30) NOT NULL,
|
||||
"business_name" varchar(30) NOT NULL,
|
||||
"class_name" varchar(100) NOT NULL,
|
||||
"class_comment" varchar(50) NOT NULL,
|
||||
"author" varchar(50) NOT NULL,
|
||||
"template_type" tinyint not null DEFAULT 1,
|
||||
"front_type" tinyint not null,
|
||||
"parent_menu_id" bigint not null,
|
||||
"master_table_id" bigint not null,
|
||||
"sub_join_column_id" bigint not null,
|
||||
"sub_join_many" bit not null,
|
||||
"tree_parent_column_id" bigint not null,
|
||||
"tree_name_column_id" bigint not null,
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '代码生成表定义表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "infra_codegen_column" (
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"table_id" bigint not null,
|
||||
"column_name" varchar(200) NOT NULL,
|
||||
"data_type" varchar(100) NOT NULL,
|
||||
"column_comment" varchar(500) NOT NULL,
|
||||
"nullable" tinyint not null,
|
||||
"primary_key" tinyint not null,
|
||||
"auto_increment" varchar(5) not null,
|
||||
"ordinal_position" int not null,
|
||||
"java_type" varchar(32) NOT NULL,
|
||||
"java_field" varchar(64) NOT NULL,
|
||||
"dict_type" varchar(200) NOT NULL,
|
||||
"example" varchar(64) NOT NULL,
|
||||
"create_operation" bit not null,
|
||||
"update_operation" bit not null,
|
||||
"list_operation" bit not null,
|
||||
"list_operation_condition" varchar(32) not null,
|
||||
"list_operation_result" bit not null,
|
||||
"html_type" varchar(32) NOT NULL,
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '代码生成表字段定义表';
|
Reference in New Issue
Block a user