feat(测试计划): 场景排序接口&接口列表返回新增协议字段

This commit is contained in:
WangXu10 2024-06-12 16:42:47 +08:00 committed by Craftsman
parent c5cc5b2e5a
commit e5518e1c30
6 changed files with 52 additions and 9 deletions

View File

@ -57,7 +57,6 @@ public class TestPlanApiCaseController {
@RequiresPermissions(PermissionConstants.TEST_PLAN_READ_UPDATE)
@CheckOwner(resourceId = "#request.getTestPlanId()", resourceType = "test_plan")
public TestPlanOperationResponse sortNode(@Validated @RequestBody ResourceSortRequest request) {
testPlanManagementService.checkModuleIsOpen(request.getTestCollectionId(), TestPlanResourceConfig.CHECK_TYPE_TEST_PLAN, Collections.singletonList(TestPlanResourceConfig.CONFIG_TEST_PLAN_FUNCTIONAL_CASE));
return testPlanApiCaseService.sortNode(request, new LogInsertModule(SessionUtils.getUserId(), "/test-plan/api/case/sort", HttpMethodConstants.POST.name()));
}

View File

@ -8,6 +8,7 @@ import io.metersphere.api.service.scenario.ApiScenarioReportService;
import io.metersphere.plan.dto.request.*;
import io.metersphere.plan.dto.response.TestPlanApiScenarioPageResponse;
import io.metersphere.plan.dto.response.TestPlanAssociationResponse;
import io.metersphere.plan.dto.response.TestPlanOperationResponse;
import io.metersphere.plan.service.TestPlanApiScenarioBatchRunService;
import io.metersphere.plan.service.TestPlanApiScenarioLogService;
import io.metersphere.plan.service.TestPlanApiScenarioService;
@ -141,4 +142,11 @@ public class TestPlanApiScenarioController {
testPlanApiScenarioService.checkReportIsTestPlan(reportId);
return apiScenarioReportService.getDetail(reportId, stepId);
}
@PostMapping(value = "/sort")
@Operation(summary = "测试计划-场景用例拖拽排序")
@RequiresPermissions(PermissionConstants.TEST_PLAN_READ_UPDATE)
public TestPlanOperationResponse sortNode(@Validated @RequestBody ResourceSortRequest request) {
return testPlanApiScenarioService.sortNode(request, new LogInsertModule(SessionUtils.getUserId(), "/test-plan/api/scenario/sort", HttpMethodConstants.POST.name()));
}
}

View File

@ -53,7 +53,6 @@ public class TestPlanFunctionalCaseController {
@RequiresPermissions(PermissionConstants.TEST_PLAN_READ_UPDATE)
@CheckOwner(resourceId = "#request.getTestPlanId()", resourceType = "test_plan")
public TestPlanOperationResponse sortNode(@Validated @RequestBody ResourceSortRequest request) {
testPlanManagementService.checkModuleIsOpen(request.getTestCollectionId(), TestPlanResourceConfig.CHECK_TYPE_TEST_PLAN, Collections.singletonList(TestPlanResourceConfig.CONFIG_TEST_PLAN_FUNCTIONAL_CASE));
return testPlanFunctionalCaseService.sortNode(request, new LogInsertModule(SessionUtils.getUserId(), "/test-plan/functional/case/sort", HttpMethodConstants.POST.name()));
}

View File

@ -71,4 +71,7 @@ public class TestPlanApiCasePageResponse implements Serializable {
@Schema(description = "状态")
private String status;
@Schema(description = "协议")
private String protocol;
}

View File

@ -19,7 +19,9 @@ import io.metersphere.api.service.scenario.ApiScenarioReportService;
import io.metersphere.api.service.scenario.ApiScenarioService;
import io.metersphere.api.utils.ApiDataUtils;
import io.metersphere.plan.domain.TestPlanApiScenario;
import io.metersphere.plan.domain.TestPlanApiScenarioExample;
import io.metersphere.plan.dto.request.*;
import io.metersphere.plan.dto.response.TestPlanOperationResponse;
import io.metersphere.plan.mapper.TestPlanApiScenarioMapper;
import io.metersphere.plan.service.TestPlanApiScenarioService;
import io.metersphere.project.api.assertion.MsResponseCodeAssertion;
@ -34,6 +36,7 @@ import io.metersphere.sdk.dto.api.task.TaskItem;
import io.metersphere.sdk.util.JSON;
import io.metersphere.system.base.BaseTest;
import io.metersphere.system.controller.handler.ResultHolder;
import io.metersphere.system.dto.sdk.enums.MoveTypeEnum;
import io.metersphere.system.uid.IDGenerator;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.*;
@ -66,6 +69,7 @@ public class TestPlanApiScenarioControllerTests extends BaseTest {
public static final String API_SCENARIO_DISASSOCIATE = "disassociate";
public static final String API_SCENARIO_BATCH_DISASSOCIATE = "batch/disassociate";
public static final String API_SCENARIO_BATCH_UPDATE_EXECUTOR_URL = "batch/update/executor";
private static final String URL_POST_RESOURCE_API_SCENARIO_SORT = "/sort";
@Resource
private TestPlanApiScenarioService testPlanApiScenarioService;
@ -271,6 +275,43 @@ public class TestPlanApiScenarioControllerTests extends BaseTest {
request.setTreeType("COLLECTION");
this.requestPostWithOkAndReturn(API_SCENARIO_TREE_COUNT, request);
this.testSort();
}
public void testSort() throws Exception {
TestPlanApiScenarioExample testPlanApiScenarioExample = new TestPlanApiScenarioExample();
testPlanApiScenarioExample.createCriteria().andTestPlanCollectionIdEqualTo("wxxx_collection_2");
testPlanApiScenarioExample.setOrderByClause("pos asc");
List<TestPlanApiScenario> scenarioList = testPlanApiScenarioMapper.selectByExample(testPlanApiScenarioExample);
//最后一个移动到第一位之前
ResourceSortRequest request = new ResourceSortRequest();
request.setTestCollectionId("wxxx_collection_2");
request.setProjectId("wxx_project_1234");
request.setMoveId(scenarioList.getLast().getId());
request.setTargetId(scenarioList.getFirst().getId());
request.setMoveMode(MoveTypeEnum.AFTER.name());
MvcResult result = this.requestPostWithOkAndReturn(URL_POST_RESOURCE_API_SCENARIO_SORT, request);
ResultHolder resultHolder = JSON.parseObject(result.getResponse().getContentAsString(StandardCharsets.UTF_8), ResultHolder.class);
TestPlanOperationResponse response = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), TestPlanOperationResponse.class);
Assertions.assertEquals(response.getOperationCount(), 1);
scenarioList = testPlanApiScenarioMapper.selectByExample(testPlanApiScenarioExample);
Assertions.assertEquals(scenarioList.get(0).getId(), request.getMoveId());
Assertions.assertEquals(scenarioList.get(1).getId(), request.getTargetId());
//将这时的第30个放到第一位之后
request.setTargetId(scenarioList.getLast().getId());
request.setMoveId(scenarioList.getFirst().getId());
request.setMoveMode(MoveTypeEnum.BEFORE.name());
result = this.requestPostWithOkAndReturn(URL_POST_RESOURCE_API_SCENARIO_SORT, request);
resultHolder = JSON.parseObject(result.getResponse().getContentAsString(StandardCharsets.UTF_8), ResultHolder.class);
response = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), TestPlanOperationResponse.class);
Assertions.assertEquals(response.getOperationCount(), 1);
scenarioList = testPlanApiScenarioMapper.selectByExample(testPlanApiScenarioExample);
Assertions.assertEquals(scenarioList.get(0).getId(), request.getTargetId());
Assertions.assertEquals(scenarioList.get(1).getId(), request.getMoveId());
}
@Test

View File

@ -1276,10 +1276,6 @@ public class TestPlanTests extends BaseTest {
request.setTargetId(funcList.get(0).getId());
request.setMoveMode(MoveTypeEnum.AFTER.name());
//先测试一下没有开启模块时能否使用
testPlanTestService.removeProjectModule(project, PROJECT_MODULE, "caseManagement");
this.requestPost(URL_POST_RESOURCE_FUNCTIONAL_CASE_SORT, request).andExpect(status().is5xxServerError());
//恢复
testPlanTestService.resetProjectModule(project, PROJECT_MODULE);
@ -1329,9 +1325,6 @@ public class TestPlanTests extends BaseTest {
//反例测试计划为空
request.setTestCollectionId(null);
this.requestPost(URL_POST_RESOURCE_FUNCTIONAL_CASE_SORT, request).andExpect(status().isBadRequest());
//反例 测试计划不存在
request.setTestCollectionId(IDGenerator.nextStr());
this.requestPost(URL_POST_RESOURCE_FUNCTIONAL_CASE_SORT, request).andExpect(status().is5xxServerError());
//反例拖拽的节点不存在
request.setTestCollectionId(repeatCaseTestPlan.getId());
request.setMoveId(null);