refactor(用例管理): module 控制200

This commit is contained in:
guoyuqi 2023-12-25 19:10:08 +08:00 committed by 刘瑞斌
parent 9ba400f2ed
commit 6973108f66
6 changed files with 110 additions and 27 deletions

View File

@ -37,8 +37,8 @@ public class CaseReviewModuleController {
@Operation(summary = "用例管理-用例评审-模块-添加模块")
@RequiresPermissions(PermissionConstants.CASE_REVIEW_READ_ADD)
@CheckOwner(resourceId = "#request.getProjectId()", resourceType = "project")
public void add(@RequestBody @Validated CaseReviewModuleCreateRequest request) {
caseReviewModuleService.add(request, SessionUtils.getUserId());
public String add(@RequestBody @Validated CaseReviewModuleCreateRequest request) {
return caseReviewModuleService.add(request, SessionUtils.getUserId());
}
@PostMapping("/update")

View File

@ -37,8 +37,8 @@ public class FunctionalCaseModuleController {
@Operation(summary = "用例管理-功能用例-模块-添加模块")
@RequiresPermissions(PermissionConstants.FUNCTIONAL_CASE_READ_ADD)
@CheckOwner(resourceId = "#request.getProjectId()", resourceType = "project")
public void add(@RequestBody @Validated FunctionalCaseModuleCreateRequest request) {
functionalCaseModuleService.add(request, SessionUtils.getUserId());
public String add(@RequestBody @Validated FunctionalCaseModuleCreateRequest request) {
return functionalCaseModuleService.add(request, SessionUtils.getUserId());
}
@PostMapping("/update")

View File

@ -65,7 +65,7 @@ public class CaseReviewModuleService extends ModuleTreeService {
return super.buildTreeAndCountResource(fileModuleList, true, Translator.get("default.module"));
}
public void add(CaseReviewModuleCreateRequest request, String userId) {
public String add(CaseReviewModuleCreateRequest request, String userId) {
CaseReviewModule caseReviewModule = new CaseReviewModule();
caseReviewModule.setId(IDGenerator.nextStr());
caseReviewModule.setName(request.getName());
@ -78,6 +78,7 @@ public class CaseReviewModuleService extends ModuleTreeService {
caseReviewModule.setCreateUser(userId);
caseReviewModule.setUpdateUser(userId);
caseReviewModuleMapper.insert(caseReviewModule);
return caseReviewModule.getId();
}
public void update(CaseReviewModuleUpdateRequest request, String userId) {
@ -199,20 +200,32 @@ public class CaseReviewModuleService extends ModuleTreeService {
}
example.clear();
if (StringUtils.isNotBlank(caseReviewModule.getProjectId())) {
//检查项目ID是否和父节点ID一致
example.createCriteria().andProjectIdEqualTo(caseReviewModule.getProjectId()).andIdEqualTo(caseReviewModule.getParentId());
if (caseReviewModuleMapper.countByExample(example) == 0) {
throw new MSException(Translator.get("project.cannot.match.parent"));
}
example.clear();
//检查项目ID是否和父节点ID一致
example.createCriteria().andProjectIdEqualTo(caseReviewModule.getProjectId()).andIdEqualTo(caseReviewModule.getParentId());
if (caseReviewModuleMapper.countByExample(example) == 0) {
throw new MSException(Translator.get("project.cannot.match.parent"));
}
example.clear();
}
example.createCriteria().andParentIdEqualTo(caseReviewModule.getParentId()).andNameEqualTo(caseReviewModule.getName()).andIdNotEqualTo(caseReviewModule.getId());
if (caseReviewModuleMapper.countByExample(example) > 0) {
throw new MSException(Translator.get("node.name.repeat"));
}
example.clear();
//非默认节点检查该节点所在分支的总长度确保不超过阈值
if (!StringUtils.equals(caseReviewModule.getId(), ModuleConstants.DEFAULT_NODE_ID)) {
this.checkBranchModules(this.getRootNodeId(caseReviewModule), extCaseReviewModuleMapper::selectChildrenIdsByParentIds);
}
}
private String getRootNodeId(CaseReviewModule caseReviewModule) {
if (StringUtils.equals(caseReviewModule.getParentId(), ModuleConstants.ROOT_NODE_PARENT_ID)) {
return caseReviewModule.getId();
} else {
CaseReviewModule parentModule = caseReviewModuleMapper.selectByPrimaryKey(caseReviewModule.getParentId());
return this.getRootNodeId(parentModule);
}
}
@Override

View File

@ -69,7 +69,7 @@ public class FunctionalCaseModuleService extends ModuleTreeService {
return super.buildTreeAndCountResource(fileModuleList, true, Translator.get("default.module"));
}
public void add(FunctionalCaseModuleCreateRequest request, String userId) {
public String add(FunctionalCaseModuleCreateRequest request, String userId) {
FunctionalCaseModule functionalCaseModule = new FunctionalCaseModule();
functionalCaseModule.setId(IDGenerator.nextStr());
functionalCaseModule.setName(request.getName());
@ -82,6 +82,7 @@ public class FunctionalCaseModuleService extends ModuleTreeService {
functionalCaseModule.setCreateUser(userId);
functionalCaseModule.setUpdateUser(userId);
functionalCaseModuleMapper.insert(functionalCaseModule);
return functionalCaseModule.getId();
}
public void update(FunctionalCaseModuleUpdateRequest request, String userId) {
@ -204,20 +205,32 @@ public class FunctionalCaseModuleService extends ModuleTreeService {
}
example.clear();
if (StringUtils.isNotBlank(functionalCaseModule.getProjectId())) {
//检查项目ID是否和父节点ID一致
example.createCriteria().andProjectIdEqualTo(functionalCaseModule.getProjectId()).andIdEqualTo(functionalCaseModule.getParentId());
if (functionalCaseModuleMapper.countByExample(example) == 0) {
throw new MSException(Translator.get("project.cannot.match.parent"));
}
example.clear();
//检查项目ID是否和父节点ID一致
example.createCriteria().andProjectIdEqualTo(functionalCaseModule.getProjectId()).andIdEqualTo(functionalCaseModule.getParentId());
if (functionalCaseModuleMapper.countByExample(example) == 0) {
throw new MSException(Translator.get("project.cannot.match.parent"));
}
example.clear();
}
example.createCriteria().andParentIdEqualTo(functionalCaseModule.getParentId()).andNameEqualTo(functionalCaseModule.getName()).andIdNotEqualTo(functionalCaseModule.getId());
if (functionalCaseModuleMapper.countByExample(example) > 0) {
throw new MSException(Translator.get("node.name.repeat"));
}
example.clear();
//非默认节点检查该节点所在分支的总长度确保不超过阈值
if (!StringUtils.equals(functionalCaseModule.getId(), ModuleConstants.DEFAULT_NODE_ID)) {
this.checkBranchModules(this.getRootNodeId(functionalCaseModule), extFunctionalCaseModuleMapper::selectChildrenIdsByParentIds);
}
}
private String getRootNodeId(FunctionalCaseModule functionalCaseModule) {
if (StringUtils.equals(functionalCaseModule.getParentId(), ModuleConstants.ROOT_NODE_PARENT_ID)) {
return functionalCaseModule.getId();
} else {
FunctionalCaseModule parentModule = functionalCaseModuleMapper.selectByPrimaryKey(functionalCaseModule.getParentId());
return this.getRootNodeId(parentModule);
}
}
@Override

View File

@ -226,6 +226,31 @@ public class CaseReviewModuleControllerTests extends BaseTest {
Assertions.assertNotNull(a1b1c1Node);
preliminaryTreeNodes = treeNodes;
/**
测试能否正常做200个节点
*/
String parentId = null;
for (int i = 0; i < 210; i++) {
CaseReviewModuleCreateRequest perfRequest = new CaseReviewModuleCreateRequest();
perfRequest.setProjectId(project.getId());
perfRequest.setName("500-test-root-" + i);
if (StringUtils.isNotEmpty(parentId)) {
perfRequest.setParentId(parentId);
}
if (i < 200) {
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TREE_ADD, perfRequest);
ResultHolder holder = JSON.parseObject(result.getResponse().getContentAsString(), ResultHolder.class);
if (i % 50 == 0) {
//到20换下一层级
parentId = holder.getData().toString();
}
} else {
//测试超过500会报错
this.requestPost(URL_MODULE_TREE_ADD, perfRequest).andExpect(status().is5xxServerError());
}
}
treeNodes = this.getCaseReviewModuleTreeNode();
preliminaryTreeNodes = treeNodes;
}
@Test

View File

@ -227,6 +227,32 @@ public class FunctionalCaseModuleControllerTests extends BaseTest {
Assertions.assertNotNull(a1b1c1Node);
preliminaryTreeNodes = treeNodes;
/**
测试能否正常做200个节点
*/
String parentId = null;
for (int i = 0; i < 210; i++) {
FunctionalCaseModuleCreateRequest perfRequest = new FunctionalCaseModuleCreateRequest();
perfRequest.setProjectId(project.getId());
perfRequest.setName("500-test-root-" + i);
if (StringUtils.isNotEmpty(parentId)) {
perfRequest.setParentId(parentId);
}
if (i < 200) {
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TREE_ADD, perfRequest);
ResultHolder holder = JSON.parseObject(result.getResponse().getContentAsString(), ResultHolder.class);
if (i % 50 == 0) {
//到20换下一层级
parentId = holder.getData().toString();
}
} else {
//测试超过500会报错
this.requestPost(URL_MODULE_TREE_ADD, perfRequest).andExpect(status().is5xxServerError());
}
}
treeNodes = this.getFunctionalCaseModuleTreeNode();
preliminaryTreeNodes = treeNodes;
}
@Test
@ -658,7 +684,7 @@ public class FunctionalCaseModuleControllerTests extends BaseTest {
// 删除没有用例的节点a1-b1-c1 检查是否级联删除根节点
BaseTreeNode a1b1Node = getNodeByName(this.getFunctionalCaseModuleTreeNode(), "a1-b1");
assert a1b1Node != null;
this.requestGetWithOk(URL_MODULE_TREE_DELETE+a1b1Node.getId());
this.requestGetWithOk(URL_MODULE_TREE_DELETE + a1b1Node.getId());
this.checkModuleIsEmpty(a1b1Node.getId());
// 删除有用例的节点 a1-a1 检查是否级联删除根节点
@ -667,19 +693,19 @@ public class FunctionalCaseModuleControllerTests extends BaseTest {
FunctionalCase name = createCase(a1a1Node, false, "name");
FunctionalCase functionalCase = functionalCaseMapper.selectByPrimaryKey(name.getId());
Assertions.assertNotNull(functionalCase);
this.requestGetWithOk(URL_MODULE_TREE_DELETE+a1a1Node.getId());
this.requestGetWithOk(URL_MODULE_TREE_DELETE + a1a1Node.getId());
this.checkModuleIsEmpty(a1a1Node.getId());
FunctionalCase functionalCaseDel = functionalCaseMapper.selectByPrimaryKey(name.getId());
Assertions.assertTrue(functionalCaseDel.getDeleted());
Assertions.assertTrue(StringUtils.equals(functionalCaseDel.getModuleId(), "root"));
//删除不存在的节点
this.requestGetWithOk(URL_MODULE_TREE_DELETE+IDGenerator.nextNum());
this.requestGetWithOk(URL_MODULE_TREE_DELETE + IDGenerator.nextNum());
// 测试删除根节点
this.requestGetWithOk(URL_MODULE_TREE_DELETE+ModuleConstants.DEFAULT_NODE_ID);
this.requestGetWithOk(URL_MODULE_TREE_DELETE + ModuleConstants.DEFAULT_NODE_ID);
//service层判断测试删除空集合
functionalCaseModuleService.deleteModuleByIds(new ArrayList<>(),new ArrayList<>());
functionalCaseModuleService.deleteModuleByIds(new ArrayList<>(), new ArrayList<>());
checkLog(functionalCase.getId(), OperationLogType.DELETE, URL_MODULE_TREE_DELETE);
@ -712,12 +738,18 @@ public class FunctionalCaseModuleControllerTests extends BaseTest {
Assertions.assertNotNull(baseTreeNode.getParentId());
}
Assertions.assertNotNull(a1Node);
createCase(a1Node, true ,"name1");
createCase(a1Node, true, "name1");
MvcResult mvcResultTrash = this.requestGetAndReturn(URL_MODULE_TREE_TRASH + project.getId());
String contentTrash = mvcResultTrash.getResponse().getContentAsString(StandardCharsets.UTF_8);
ResultHolder resultHolderTrash = JSON.parseObject(contentTrash, ResultHolder.class);
List<BaseTreeNode> baseTreeNodeTrashList = JSON.parseArray(JSON.toJSONString(resultHolderTrash.getData()), BaseTreeNode.class);
Assertions.assertTrue(CollectionUtils.isNotEmpty(baseTreeNodeTrashList));
// 没case
mvcResultTrash = this.requestGetAndReturn(URL_MODULE_TREE_TRASH + "projectIdX");
contentTrash = mvcResultTrash.getResponse().getContentAsString(StandardCharsets.UTF_8);
resultHolderTrash = JSON.parseObject(contentTrash, ResultHolder.class);
baseTreeNodeTrashList = JSON.parseArray(JSON.toJSONString(resultHolderTrash.getData()), BaseTreeNode.class);
Assertions.assertTrue(CollectionUtils.isEmpty(baseTreeNodeTrashList));
}
private FunctionalCase createCase(BaseTreeNode a1a1Node, Boolean deleted, String name) {
@ -752,7 +784,7 @@ public class FunctionalCaseModuleControllerTests extends BaseTest {
}
private List<BaseTreeNode> getFunctionalCaseModuleTreeNode() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(URL_MODULE_TREE+"/"+project.getId()).header(SessionConstants.HEADER_TOKEN, sessionId)
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(URL_MODULE_TREE + "/" + project.getId()).header(SessionConstants.HEADER_TOKEN, sessionId)
.header(SessionConstants.CSRF_TOKEN, csrfToken)
.header(SessionConstants.CURRENT_PROJECT, project.getId())
.contentType(MediaType.APPLICATION_JSON))