feat(接口测试): 增加回收站查询列表接口

This commit is contained in:
wxg0103 2023-11-22 18:20:22 +08:00 committed by wxg0103
parent 7285248b72
commit 587e105a4f
16 changed files with 234 additions and 88 deletions

View File

@ -30,7 +30,7 @@ public class ApiDefinitionModuleController {
@Operation(summary = "接口测试-接口管理-模块-查找模块")
@RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ)
public List<BaseTreeNode> getTree(@RequestBody @Validated ApiModuleRequest request) {
return apiDefinitionModuleService.getTree(request);
return apiDefinitionModuleService.getTree(request, false);
}
@PostMapping("/add")
@ -66,6 +66,20 @@ public class ApiDefinitionModuleController {
@Operation(summary = "接口测试-接口管理-模块-统计模块数量")
@RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ)
public Map<String, Long> moduleCount(@Validated @RequestBody ApiModuleRequest request) {
return apiDefinitionModuleService.moduleCount(request);
return apiDefinitionModuleService.moduleCount(request, false);
}
@PostMapping("/trash/count")
@Operation(summary = "接口测试-接口管理-模块-统计回收站模块数量")
@RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ)
public Map<String, Long> moduleCountTrash(@Validated @RequestBody ApiModuleRequest request) {
return apiDefinitionModuleService.moduleCount(request, true);
}
@PostMapping("/trash/tree")
@Operation(summary = "接口测试-接口管理-模块-查找模块")
@RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ)
public List<BaseTreeNode> getTrashTree(@RequestBody @Validated ApiModuleRequest request) {
return apiDefinitionModuleService.getTree(request, true);
}
}

View File

@ -112,7 +112,7 @@ public class ApiTestCaseController {
public Pager<List<ApiTestCaseDTO>> page(@Validated @RequestBody ApiTestCasePageRequest request) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "create_time desc");
return PageUtils.setPageInfo(page, apiTestCaseService.page(request));
return PageUtils.setPageInfo(page, apiTestCaseService.page(request, false));
}
@PostMapping("/batch/delete")
@ -133,5 +133,13 @@ public class ApiTestCaseController {
apiTestCaseService.batchEdit(request, SessionUtils.getUserId());
}
@PostMapping(value = "/trash/page")
@Operation(summary = "接口测试-接口管理-接口用例-回收站-分页查询")
@RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_CASE_READ)
public Pager<List<ApiTestCaseDTO>> pageTrash(@Validated @RequestBody ApiTestCasePageRequest request) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "create_time desc");
return PageUtils.setPageInfo(page, apiTestCaseService.page(request, true));
}
}

View File

@ -7,6 +7,7 @@ import lombok.Data;
import java.io.Serializable;
import java.util.LinkedHashSet;
import java.util.List;
@Data
public class ApiTestCaseAddRequest implements Serializable {
@ -49,4 +50,8 @@ public class ApiTestCaseAddRequest implements Serializable {
@Schema(description = "请求内容")
@NotBlank
private String request;
@Schema(description = "接口用例所需的所有文件资源ID")
private List<String> fileIds;
}

View File

@ -83,4 +83,7 @@ public class ApiTestCaseDTO {
@Schema(description = "请求内容")
private AbstractMsTestElement request;
@Schema(description = "接口用例所关联的文件ID列表修改时需要作为参数传入")
private List<String> fileIds;
}

View File

@ -45,4 +45,15 @@ public class ApiTestCaseUpdateRequest implements Serializable {
@NotBlank
private String request;
@Schema(description = "接口用例所需的所有文件资源ID")
private List<String> fileIds;
/**
* 新上传的文件ID
* 为了解决文件名称重复的问题需要把文件和ID一一对应
* 创建时先按ID创建目录再把文件放入目录
*/
@Schema(description = "新上传的文件ID与上传的文件顺序保持一致")
private List<String> addFileIds;
}

View File

@ -5,7 +5,7 @@
<update id="deleteApiToGc">
update api_definition
set delete_user = #{userId},delete_time = #{time}, deleted = 1
set delete_user = #{userId},delete_time = #{time}, deleted = 1 , module_id = 'root'
where ref_id in
<foreach collection="ids" item="v" separator="," open="(" close=")">
#{v}
@ -79,16 +79,13 @@
group by ref_id
</select>
<select id="getApiDefinitionByRefId" resultType="io.metersphere.api.dto.definition.ApiDefinitionVersionDTO">
SELECT
id,
SELECT id,
`name`,
version_id,
ref_id,
project_id
FROM
api_definition
WHERE
ref_id = #{refId}
FROM api_definition
WHERE ref_id = #{refId}
</select>
<select id="getTagsByIds" resultType="io.metersphere.api.domain.ApiDefinition">
select id, tags from api_definition

View File

@ -27,9 +27,9 @@ public interface ExtApiDefinitionModuleMapper {
BaseModule selectModuleByParentIdAndPosOperator(NodeSortQueryParam nodeSortQueryParam);
List<ApiTreeNode> selectApiDataByRequest(@Param("request") ApiModuleRequest request);
List<ApiTreeNode> selectApiDataByRequest(@Param("request") ApiModuleRequest request, @Param("deleted") boolean deleted);
List<ModuleCountDTO> countModuleIdByRequest(@Param("request") ApiModuleRequest request);
List<ModuleCountDTO> countModuleIdByRequest(@Param("request") ApiModuleRequest request, @Param("deleted") boolean deleted);
List<BaseTreeNode> selectNodeByIds(@Param("ids") List<String> ids);
}

View File

@ -117,7 +117,7 @@
<sql id="api_request">
<where>
api_definition.deleted = 0
api_definition.deleted = #{deleted}
<if test="request.projectId != null and request.projectId != ''">
AND api_definition.project_id = #{request.projectId}
</if>

View File

@ -33,10 +33,11 @@
t1.update_user,
t1.create_time,
t1.update_time,
t1.delete_user,
t1.delete_time,
t1.num,
t1.last_report_status,
t1.last_report_id,
t1.delete_time,
t1.environment_id
FROM
api_test_case t1

View File

@ -9,9 +9,11 @@ import io.metersphere.api.mapper.ApiDebugBlobMapper;
import io.metersphere.api.mapper.ApiDebugMapper;
import io.metersphere.api.mapper.ApiDebugModuleMapper;
import io.metersphere.api.mapper.ExtApiDebugModuleMapper;
import io.metersphere.api.service.ApiFileResourceService;
import io.metersphere.project.dto.ModuleCountDTO;
import io.metersphere.project.dto.NodeSortDTO;
import io.metersphere.project.service.ModuleTreeService;
import io.metersphere.sdk.constants.DefaultRepositoryDir;
import io.metersphere.sdk.constants.ModuleConstants;
import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.util.Translator;
@ -52,6 +54,8 @@ public class ApiDebugModuleService extends ModuleTreeService {
private ApiDebugBlobMapper apiDebugBlobMapper;
@Resource
private SqlSessionFactory sqlSessionFactory;
@Resource
private ApiFileResourceService apiFileResourceService;
public List<BaseTreeNode> getTree(String protocol, String userId) {
List<BaseTreeNode> fileModuleList = extApiDebugModuleMapper.selectBaseByProtocolAndUser(protocol, userId);
@ -198,6 +202,11 @@ public class ApiDebugModuleService extends ModuleTreeService {
ApiDebugBlobExample blobExample = new ApiDebugBlobExample();
blobExample.createCriteria().andIdIn(apiDebugIds);
apiDebugBlobMapper.deleteByExample(blobExample);
//删除文件关联关系
apiDebugs.forEach(apiDebug -> {
String apiDebugDir = DefaultRepositoryDir.getApiDebugDir(apiDebug.getProjectId(), apiDebug.getId());
apiFileResourceService.deleteByResourceId(apiDebugDir, apiDebug.getId());
});
apiDebugModuleLogService.saveDeleteDataLog(apiDebugs, currentUser, projectId);
}

View File

@ -55,11 +55,11 @@ public class ApiDefinitionModuleService extends ModuleTreeService {
@Resource
private ApiTestCaseService apiTestCaseService;
public List<BaseTreeNode> getTree(ApiModuleRequest request) {
public List<BaseTreeNode> getTree(ApiModuleRequest request, boolean deleted) {
//接口的树结构是 模块子模块+接口 接口为非delete状态的
List<BaseTreeNode> fileModuleList = extApiDefinitionModuleMapper.selectBaseByRequest(request);
List<BaseTreeNode> baseTreeNodes = super.buildTreeAndCountResource(fileModuleList, true, Translator.get(UNPLANNED_API));
List<ApiTreeNode> apiTreeNodeList = extApiDefinitionModuleMapper.selectApiDataByRequest(request);
List<ApiTreeNode> apiTreeNodeList = extApiDefinitionModuleMapper.selectApiDataByRequest(request, deleted);
return apiDebugModuleService.getBaseTreeNodes(apiTreeNodeList, baseTreeNodes);
}
@ -245,10 +245,10 @@ public class ApiDefinitionModuleService extends ModuleTreeService {
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
}
public Map<String, Long> moduleCount(ApiModuleRequest request) {
public Map<String, Long> moduleCount(ApiModuleRequest request, boolean deleted) {
request.setModuleIds(null);
//查找根据moduleIds查找模块下的接口数量 查非delete状态的
List<ModuleCountDTO> moduleCountDTOList = extApiDefinitionModuleMapper.countModuleIdByRequest(request);
List<ModuleCountDTO> moduleCountDTOList = extApiDefinitionModuleMapper.countModuleIdByRequest(request, deleted);
long allCount = getAllCount(moduleCountDTOList);
Map<String, Long> moduleCountMap = getModuleCountMap(request, moduleCountDTOList);
moduleCountMap.put(DEBUG_MODULE_COUNT_ALL, allCount);

View File

@ -1,24 +1,24 @@
package io.metersphere.api.service.definition;
import io.metersphere.api.constants.ApiResourceType;
import io.metersphere.api.domain.*;
import io.metersphere.api.dto.debug.ApiFileResourceUpdateRequest;
import io.metersphere.api.dto.definition.*;
import io.metersphere.api.mapper.*;
import io.metersphere.api.service.ApiFileResourceService;
import io.metersphere.api.util.ApiDataUtils;
import io.metersphere.plugin.api.spi.AbstractMsTestElement;
import io.metersphere.project.domain.Project;
import io.metersphere.project.mapper.ProjectMapper;
import io.metersphere.sdk.constants.ApplicationNumScope;
import io.metersphere.sdk.constants.DefaultRepositoryDir;
import io.metersphere.sdk.constants.StorageType;
import io.metersphere.sdk.domain.Environment;
import io.metersphere.sdk.domain.EnvironmentExample;
import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.mapper.EnvironmentMapper;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.sdk.util.JSON;
import io.metersphere.sdk.util.LogUtils;
import io.metersphere.sdk.util.Translator;
import io.metersphere.system.file.FileRequest;
import io.metersphere.system.file.MinioRepository;
import io.metersphere.system.service.UserLoginService;
import io.metersphere.system.uid.IDGenerator;
@ -30,6 +30,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.jetbrains.annotations.NotNull;
import org.mybatis.spring.SqlSessionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -73,37 +74,21 @@ public class ApiTestCaseService {
private ApiTestCaseLogService apiTestCaseLogService;
@Resource
private SqlSessionFactory sqlSessionFactory;
@Resource
private ApiFileResourceService apiFileResourceService;
public ApiTestCase addCase(ApiTestCaseAddRequest request, List<MultipartFile> files, String userId) {
ApiTestCase testCase = new ApiTestCase();
testCase.setId(IDGenerator.nextStr());
BeanUtils.copyBean(testCase, request);
ApiDefinition apiDefinition = getApiDefinition(request.getApiDefinitionId());
testCase.setNum(NumGenerator.nextNum(request.getProjectId() + "_" + apiDefinition.getNum(), ApplicationNumScope.API_TEST_CASE));
testCase.setApiDefinitionId(request.getApiDefinitionId());
testCase.setName(request.getName());
testCase.setPos(getNextOrder(request.getProjectId()));
testCase.setProjectId(request.getProjectId());
checkProjectExist(testCase.getProjectId());
checkNameExist(testCase);
testCase.setVersionId(apiDefinition.getVersionId());
testCase.setPriority(request.getPriority());
testCase.setStatus(request.getStatus());
testCase.setCreateUser(userId);
testCase.setUpdateUser(userId);
testCase.setCreateTime(System.currentTimeMillis());
testCase.setUpdateTime(System.currentTimeMillis());
if (CollectionUtils.isNotEmpty(request.getTags())) {
testCase.setTags(JSON.toJSONString(request.getTags()));
}
apiTestCaseMapper.insertSelective(testCase);
ApiTestCaseBlob caseBlob = new ApiTestCaseBlob();
caseBlob.setId(testCase.getId());
caseBlob.setRequest(request.getRequest().getBytes());
apiTestCaseBlobMapper.insert(caseBlob);
uploadBodyFile(files, testCase.getId(), request.getProjectId());
return testCase;
@NotNull
private static ApiFileResourceUpdateRequest getFileResourceRequest(ApiTestCase testCase, List<String> filed, List<String> addFiled) {
String apiCaseDir = DefaultRepositoryDir.getApiCaseDir(testCase.getProjectId(), testCase.getId());
// 处理文件
ApiFileResourceUpdateRequest resourceUpdateRequest = new ApiFileResourceUpdateRequest();
resourceUpdateRequest.setProjectId(testCase.getProjectId());
resourceUpdateRequest.setFileIds(filed);
resourceUpdateRequest.setAddFileIds(addFiled);
resourceUpdateRequest.setFolder(apiCaseDir);
resourceUpdateRequest.setResourceId(testCase.getId());
resourceUpdateRequest.setApiResourceType(ApiResourceType.API_CASE);
return resourceUpdateRequest;
}
private void checkProjectExist(String projectId) {
@ -140,21 +125,40 @@ public class ApiTestCaseService {
return (pos == null ? 0 : pos) + ORDER_STEP;
}
public void uploadBodyFile(List<MultipartFile> files, String caseId, String projectId) {
if (CollectionUtils.isNotEmpty(files)) {
files.forEach(file -> {
FileRequest fileRequest = new FileRequest();
fileRequest.setFileName(file.getName());
fileRequest.setFolder(DefaultRepositoryDir.getApiCaseDir(projectId, caseId));
fileRequest.setStorage(StorageType.MINIO.name());
try {
minioRepository.saveFile(file, fileRequest);
} catch (Exception e) {
LogUtils.info("上传body文件失败: 文件名称:" + file.getName(), e);
throw new MSException(Translator.get("file_upload_fail"));
}
});
public ApiTestCase addCase(ApiTestCaseAddRequest request, List<MultipartFile> files, String userId) {
ApiTestCase testCase = new ApiTestCase();
testCase.setId(IDGenerator.nextStr());
BeanUtils.copyBean(testCase, request);
ApiDefinition apiDefinition = getApiDefinition(request.getApiDefinitionId());
testCase.setNum(NumGenerator.nextNum(request.getProjectId() + "_" + apiDefinition.getNum(), ApplicationNumScope.API_TEST_CASE));
testCase.setApiDefinitionId(request.getApiDefinitionId());
testCase.setName(request.getName());
testCase.setPos(getNextOrder(request.getProjectId()));
testCase.setProjectId(request.getProjectId());
checkProjectExist(testCase.getProjectId());
checkNameExist(testCase);
testCase.setVersionId(apiDefinition.getVersionId());
testCase.setPriority(request.getPriority());
testCase.setStatus(request.getStatus());
testCase.setCreateUser(userId);
testCase.setUpdateUser(userId);
testCase.setCreateTime(System.currentTimeMillis());
testCase.setUpdateTime(System.currentTimeMillis());
if (CollectionUtils.isNotEmpty(request.getTags())) {
testCase.setTags(JSON.toJSONString(request.getTags()));
}
apiTestCaseMapper.insertSelective(testCase);
ApiTestCaseBlob caseBlob = new ApiTestCaseBlob();
caseBlob.setId(testCase.getId());
caseBlob.setRequest(request.getRequest().getBytes());
apiTestCaseBlobMapper.insert(caseBlob);
// 处理文件
ApiFileResourceUpdateRequest resourceRequest =
getFileResourceRequest(testCase, request.getFileIds(), request.getFileIds());
apiFileResourceService.addFileResource(resourceRequest, files);
return testCase;
}
private ApiTestCase checkResourceExist(String id) {
@ -183,6 +187,7 @@ public class ApiTestCaseService {
List<ApiTestCaseFollower> followers = apiTestCaseFollowerMapper.selectByExample(example);
apiTestCaseDTO.setFollow(CollectionUtils.isNotEmpty(followers));
apiTestCaseDTO.setRequest(ApiDataUtils.parseObject(new String(testCaseBlob.getRequest()), AbstractMsTestElement.class));
apiTestCaseDTO.setFileIds(apiFileResourceService.getFileIdsByResourceId(id));
return apiTestCaseDTO;
}
@ -240,7 +245,10 @@ public class ApiTestCaseService {
apiTestCaseBlob.setId(request.getId());
apiTestCaseBlob.setRequest(request.getRequest().getBytes());
apiTestCaseBlobMapper.updateByPrimaryKeySelective(apiTestCaseBlob);
uploadBodyFile(files, request.getId(), testCase.getProjectId());
ApiFileResourceUpdateRequest resourceRequest =
getFileResourceRequest(testCase, request.getFileIds(), request.getAddFileIds());
apiFileResourceService.updateFileResource(resourceRequest, files);
return testCase;
}
@ -254,8 +262,8 @@ public class ApiTestCaseService {
apiTestCaseMapper.updateByPrimaryKeySelective(update);
}
public List<ApiTestCaseDTO> page(ApiTestCasePageRequest request) {
List<ApiTestCaseDTO> apiCaseLists = extApiTestCaseMapper.listByRequest(request, false);
public List<ApiTestCaseDTO> page(ApiTestCasePageRequest request, boolean deleted) {
List<ApiTestCaseDTO> apiCaseLists = extApiTestCaseMapper.listByRequest(request, deleted);
buildApiTestCaseDTO(apiCaseLists);
return apiCaseLists;
}
@ -327,15 +335,10 @@ public class ApiTestCaseService {
ApiTestCaseBlobExample blobExample = new ApiTestCaseBlobExample();
blobExample.createCriteria().andIdIn(ids);
apiTestCaseBlobMapper.deleteByExample(blobExample);
//删除body文件
FileRequest request = new FileRequest();
//删除文件关联关系
ids.forEach(id -> {
try {
request.setFolder(DefaultRepositoryDir.getApiCaseDir(projectId, id));
minioRepository.deleteFolder(request);
} catch (Exception e) {
LogUtils.info("删除body文件失败: 文件名称:" + id, e);
}
String apiCaseDir = DefaultRepositoryDir.getApiCaseDir(projectId, id);
apiFileResourceService.deleteByResourceId(apiCaseDir, id);
});
//记录删除日志
apiTestCaseLogService.deleteBatchLog(caseLists, userId, projectId);

View File

@ -52,6 +52,8 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
private static final String URL_MODULE_TREE = "/api/definition/module/tree";
private static final String URL_MODULE_MOVE = "/api/definition/module/move";
private static final String URL_FILE_MODULE_COUNT = "/api/definition/module/count";
private static final String URL_MODULE_TRASH_TREE = "/api/definition/module/trash/tree";
private static final String URL_MODULE_TRASH_COUNT = "/api/definition/module/trash/count";
private static final ResultMatcher BAD_REQUEST_MATCHER = status().isBadRequest();
private static final ResultMatcher ERROR_REQUEST_MATCHER = status().is5xxServerError();
private static Project project;
@ -762,7 +764,7 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
}
@Test
@Order(8)
@Order(9)
public void TestModuleCountError() throws Exception {
ApiDebugRequest request = new ApiDebugRequest();
request.setProtocol(null);
@ -801,6 +803,35 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
}
@Test
@Order(11)
public void getModuleTrashTreeNode() throws Exception {
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TRASH_TREE, new ApiModuleRequest() {{
this.setProtocol("HTTP");
this.setProjectId(project.getId());
}});
String returnData = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class);
JSON.parseArray(JSON.toJSONString(resultHolder.getData()), BaseTreeNode.class);
}
@Test
@Order(12)
public void getModuleTrashTreeCount() throws Exception {
ApiModuleRequest request = new ApiModuleRequest() {{
this.setProtocol("HTTP");
this.setProjectId(project.getId());
}};
MvcResult moduleCountMvcResult = this.requestPostWithOkAndReturn(URL_MODULE_TRASH_COUNT, request);
Map<String, Integer> moduleCountResult = JSON.parseObject(JSON.toJSONString(
JSON.parseObject(moduleCountMvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8), ResultHolder.class).getData()),
Map.class);
Assertions.assertTrue(moduleCountResult.containsKey("all"));
request.setProjectId(DEFAULT_PROJECT_ID);
requestPostPermissionTest(PermissionConstants.PROJECT_API_DEFINITION_READ, URL_MODULE_TRASH_COUNT, request);
}
private List<BaseTreeNode> getModuleTreeNode() throws Exception {
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TREE, new ApiModuleRequest() {{
this.setProtocol("HTTP");

View File

@ -4,6 +4,7 @@ import io.metersphere.api.controller.param.ApiTestCaseAddRequestDefinition;
import io.metersphere.api.domain.*;
import io.metersphere.api.dto.definition.*;
import io.metersphere.api.mapper.*;
import io.metersphere.api.service.ApiFileResourceService;
import io.metersphere.api.util.ApiDataUtils;
import io.metersphere.plugin.api.spi.AbstractMsTestElement;
import io.metersphere.sdk.constants.ApplicationNumScope;
@ -62,6 +63,7 @@ public class ApiTestCaseControllerTests extends BaseTest {
private static final String DELETE = BASE_PATH + "delete/";
private static final String UPDATE = BASE_PATH + "update";
private static final String PAGE = BASE_PATH + "page";
private static final String TRASH_PAGE = BASE_PATH + "trash/page";
private static final String UPDATE_STATUS = BASE_PATH + "update-status";
private static final String BATCH_EDIT = BASE_PATH + "batch/edit";
private static final String BATCH_DELETE = BASE_PATH + "batch/delete";
@ -83,6 +85,8 @@ public class ApiTestCaseControllerTests extends BaseTest {
private ApiTestCaseFollowerMapper apiTestCaseFollowerMapper;
@Resource
private EnvironmentMapper environmentMapper;
@Resource
private ApiFileResourceService apiFileResourceService;
public static <T> T parseObjectFromMvcResult(MvcResult mvcResult, Class<T> parseClass) {
try {
@ -180,6 +184,7 @@ public class ApiTestCaseControllerTests extends BaseTest {
request.setEnvironmentId(environments.get(0).getId());
MsHTTPElement msHttpElement = MsHTTPElementTest.getMsHttpElement();
request.setRequest(ApiDataUtils.toJSONString(msHttpElement));
request.setFileIds(List.of("fileId1"));
LinkedMultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
paramMap.add("request", JSON.toJSONString(request));
FileInputStream inputStream = new FileInputStream(new File(
@ -267,6 +272,7 @@ public class ApiTestCaseControllerTests extends BaseTest {
List<ApiTestCaseFollower> followers = apiTestCaseFollowerMapper.selectByExample(example);
copyApiDebugDTO.setFollow(CollectionUtils.isNotEmpty(followers));
copyApiDebugDTO.setRequest(ApiDataUtils.parseObject(new String(apiDebugBlob.getRequest()), AbstractMsTestElement.class));
copyApiDebugDTO.setFileIds(apiFileResourceService.getFileIdsByResourceId(apiTestCase.getId()));
Assertions.assertEquals(apiDebugDTO, copyApiDebugDTO);
this.requestGetWithOk(GET + anotherApiTestCase.getId())
.andReturn();
@ -361,7 +367,14 @@ public class ApiTestCaseControllerTests extends BaseTest {
MsHTTPElement msHttpElement = MsHTTPElementTest.getMsHttpElement();
request.setRequest(ApiDataUtils.toJSONString(msHttpElement));
LinkedMultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
request.setFileIds(List.of("fileId1"));
request.setAddFileIds(List.of("fileId2"));
paramMap.add("request", JSON.toJSONString(request));
FileInputStream inputStream = new FileInputStream(new File(
this.getClass().getClassLoader().getResource("file/file_upload.JPG")
.getPath()));
MockMultipartFile file = new MockMultipartFile("file_upload.JPG", "file_upload.JPG", MediaType.APPLICATION_OCTET_STREAM_VALUE, inputStream);
paramMap.add("files", List.of(file));
MvcResult mvcResult = this.requestMultipartWithOkAndReturn(UPDATE, paramMap);
// 校验请求成功数据
ApiTestCase resultData = getResultData(mvcResult, ApiTestCase.class);
@ -602,6 +615,57 @@ public class ApiTestCaseControllerTests extends BaseTest {
requestPostPermissionTest(PermissionConstants.PROJECT_API_DEFINITION_CASE_DELETE, BATCH_MOVE_GC, request);
}
@Test
@Order(12)
public void trashPage() throws Exception {
// @@请求成功
ApiTestCasePageRequest pageRequest = new ApiTestCasePageRequest();
pageRequest.setProjectId(DEFAULT_PROJECT_ID);
pageRequest.setPageSize(10);
pageRequest.setCurrent(1);
MvcResult mvcResult = responsePost(TRASH_PAGE, pageRequest);
Pager<?> returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
//返回值不为空
Assertions.assertNotNull(returnPager);
//返回值的页码和当前页码相同
Assertions.assertEquals(returnPager.getCurrent(), pageRequest.getCurrent());
//返回的数据量不超过规定要返回的数据量相同
Assertions.assertTrue(((List<ApiTestCaseDTO>) returnPager.getList()).size() <= pageRequest.getPageSize());
//查询apiDefinitionId1的数据
pageRequest.setApiDefinitionId("apiDefinitionId1");
mvcResult = responsePost(TRASH_PAGE, pageRequest);
returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
//返回值不为空
Assertions.assertNotNull(returnPager);
//返回值的页码和当前页码相同
Assertions.assertEquals(returnPager.getCurrent(), pageRequest.getCurrent());
List<ApiTestCaseDTO> caseDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), ApiTestCaseDTO.class);
caseDTOS.forEach(caseDTO -> Assertions.assertEquals(caseDTO.getApiDefinitionId(), "apiDefinitionId1"));
//查询模块为moduleId1的数据
pageRequest.setApiDefinitionId(null);
pageRequest.setModuleIds(List.of("moduleId1"));
mvcResult = responsePost(TRASH_PAGE, pageRequest);
returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
//返回值不为空
Assertions.assertNotNull(returnPager);
//返回值的页码和当前页码相同
Assertions.assertEquals(returnPager.getCurrent(), pageRequest.getCurrent());
caseDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), ApiTestCaseDTO.class);
caseDTOS.forEach(caseDTO -> Assertions.assertEquals(apiDefinitionMapper.selectByPrimaryKey(caseDTO.getApiDefinitionId()).getModuleId(), "moduleId1"));
pageRequest.setModuleIds(null);
pageRequest.setSort(new HashMap<>() {{
put("createTime", "asc");
}});
responsePost(TRASH_PAGE, pageRequest);
//校验权限
requestPostPermissionTest(PermissionConstants.PROJECT_API_DEFINITION_CASE_READ, TRASH_PAGE, pageRequest);
}
@Test
@Order(20)
public void delete() throws Exception {

View File

@ -85,6 +85,6 @@ minio.endpoint=http://${embedded.minio.host}:${embedded.minio.port}
minio.access-key=${embedded.minio.accessKey}
minio.secret-key=${embedded.minio.secretKey}
logging.level.org.springframework.jdbc.core=debug
logging.level.io.metersphere.sdk.mapper=debug
logging.level.io.metersphere.project.mapper=debug
logging.level.org.springframework.jdbc.core=info
logging.level.io.metersphere.sdk.mapper=info
logging.level.io.metersphere.project.mapper=info

View File

@ -135,12 +135,12 @@ public class EnvironmentService {
if (CollectionUtils.isNotEmpty(sslFiles)) {
sslFiles.forEach(sslFile -> {
FileRequest fileRequest = new FileRequest();
fileRequest.setFileName(sslFile.getName());
fileRequest.setFileName(sslFile.getOriginalFilename());
fileRequest.setFolder(DefaultRepositoryDir.getEnvSslDir(environment.getProjectId(), environment.getId()));
try {
minioRepository.saveFile(sslFile, fileRequest);
} catch (Exception e) {
LogUtils.info("上传ssl文件失败: 文件名称:" + sslFile.getName(), e);
LogUtils.info("上传ssl文件失败: 文件名称:" + sslFile.getOriginalFilename(), e);
throw new MSException(Translator.get("api_test_environment_ssl_file_upload_failed"));
}
});