diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseController.java b/backend/services/case-management/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseController.java new file mode 100644 index 0000000000..e128e04dfb --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseController.java @@ -0,0 +1,50 @@ +package io.metersphere.functional.controller; + + +import com.alibaba.excel.util.StringUtils; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import io.metersphere.functional.dto.ReviewFunctionalCaseDTO; +import io.metersphere.functional.request.ReviewFunctionalCasePageRequest; +import io.metersphere.functional.service.CaseReviewFunctionalCaseService; +import io.metersphere.system.utils.PageUtils; +import io.metersphere.system.utils.Pager; +import io.metersphere.system.utils.SessionUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author wx + */ +@Tag(name = "用例管理-用例评审-评审列表-评审详情") +@RestController +@RequestMapping("/case/review/detail") +public class CaseReviewFunctionalCaseController { + + @Resource + private CaseReviewFunctionalCaseService caseReviewFunctionalCaseService; + + + @GetMapping("/get-ids/{reviewId}") + @Operation(summary = "用例管理-功能用例-评审列表-评审详情-获取已关联用例id集合(关联用例弹窗前调用)") + public List getCaseIds(@PathVariable String reviewId) { + return caseReviewFunctionalCaseService.getCaseIdsByReviewId(reviewId); + } + + + @PostMapping("/page") + @Operation(summary = "用例管理-功能用例-评审列表-评审详情-已关联用例列表") + public Pager> page(@Validated @RequestBody ReviewFunctionalCasePageRequest request) { + String userId = StringUtils.EMPTY; + if (request.getViewFlag()) { + userId = SessionUtils.getUserId(); + } + Page page = PageHelper.startPage(request.getCurrent(), request.getPageSize()); + return PageUtils.setPageInfo(page, caseReviewFunctionalCaseService.page(request, false, userId)); + } +} diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseAttachmentController.java b/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseAttachmentController.java index dc14bb9551..83c37ac294 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseAttachmentController.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseAttachmentController.java @@ -11,10 +11,12 @@ import io.metersphere.project.dto.filemanagement.request.FileMetadataTableReques import io.metersphere.project.dto.filemanagement.response.FileInformationResponse; import io.metersphere.project.service.FileAssociationService; import io.metersphere.project.service.FileMetadataService; +import io.metersphere.project.service.FileModuleService; import io.metersphere.sdk.constants.PermissionConstants; import io.metersphere.sdk.exception.MSException; import io.metersphere.sdk.util.FileAssociationSourceUtil; import io.metersphere.sdk.util.Translator; +import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.log.constants.OperationLogModule; import io.metersphere.system.utils.Pager; import io.metersphere.system.utils.SessionUtils; @@ -46,6 +48,8 @@ public class FunctionalCaseAttachmentController { @Resource private FileAssociationService fileAssociationService; + @Resource + private FileModuleService fileModuleService; @PostMapping("/page") @@ -120,6 +124,7 @@ public class FunctionalCaseAttachmentController { String fileId = null; try { FileAssociationDTO fileAssociationDTO = new FileAssociationDTO(attachment.getFileName(), fileByte, attachment.getCaseId(), FileAssociationSourceUtil.SOURCE_TYPE_FUNCTIONAL_CASE, fileLogRecord); + fileAssociationDTO.setModuleId(request.getModuleId()); fileId = fileAssociationService.transferAndAssociation(fileAssociationDTO); functionalCaseAttachmentService.deleteCaseAttachment(Arrays.asList(request.getFileId()), request.getCaseId(), request.getProjectId()); } catch (Exception e) { @@ -146,4 +151,13 @@ public class FunctionalCaseAttachmentController { functionalCaseAttachmentService.deleteFile(request, userId); } + + @GetMapping("/options/{projectId}") + @Operation(summary = "用例管理-功能用例-附件-转存目录下拉框") + @RequiresPermissions(PermissionConstants.FUNCTIONAL_CASE_READ) + public List options(@PathVariable String projectId) { + return fileModuleService.getTree(projectId); + } + + } diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/dto/ReviewFunctionalCaseDTO.java b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/ReviewFunctionalCaseDTO.java new file mode 100644 index 0000000000..4bc028035d --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/ReviewFunctionalCaseDTO.java @@ -0,0 +1,46 @@ +package io.metersphere.functional.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author wx + */ +@Data +public class ReviewFunctionalCaseDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "用例id") + private String id; + + @Schema(description = "用例名称") + private String name; + + @Schema(description = "版本id") + private String versionId; + + @Schema(description = "版本名称") + private String versionName; + + @Schema(description = "评审人") + private List reviewers; + + @Schema(description = "评审人名称") + private List reviewNames; + + @Schema(description = "评审状态") + private String status; + + @Schema(description = "所属模块") + private String moduleId; + + @Schema(description = "模块名称") + private String moduleName; + +} diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/dto/ReviewsDTO.java b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/ReviewsDTO.java new file mode 100644 index 0000000000..5ee005350d --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/ReviewsDTO.java @@ -0,0 +1,27 @@ +package io.metersphere.functional.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author wx + */ +@Data +public class ReviewsDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "用例id") + private String caseId; + + @Schema(description = "用例评审人id字符串集合") + private String userIds; + + @Schema(description = "用例评审人名称字符集合") + private String userNames; + +} diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.java b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.java index db6da0eef8..5b164d4f3f 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.java @@ -1,7 +1,9 @@ package io.metersphere.functional.mapper; import io.metersphere.functional.dto.FunctionalCaseReviewDTO; +import io.metersphere.functional.dto.ReviewFunctionalCaseDTO; import io.metersphere.functional.request.FunctionalCaseReviewListRequest; +import io.metersphere.functional.request.ReviewFunctionalCasePageRequest; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,4 +18,8 @@ public interface ExtCaseReviewFunctionalCaseMapper { void updateStatus(@Param("caseId") String caseId, @Param("reviewId") String reviewId, @Param("status") String status); Long getUnCompletedCaseCount(@Param("reviewId") String reviewId, @Param("statusList") List statusList); + + List getCaseIdsByReviewId(@Param("reviewId") String reviewId); + + List page(@Param("request") ReviewFunctionalCasePageRequest request, @Param("deleted") boolean deleted, @Param("userId") String userId, @Param("sort") String sort); } diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.xml b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.xml index 192f5c956e..b2a2ddeb49 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.xml +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseMapper.xml @@ -35,4 +35,189 @@ where review_id = #{reviewId} and case_id = #{caseId} + + + + + + + + + + ( + functional_case.name like concat('%', #{request.keyword},'%') + or functional_case.num like concat('%', #{request.keyword},'%') + or JSON_CONTAINS(tags, concat('["',#{request.keyword},'"]')) + ) + + + + + + + + + + + 1=1 + + + + + + + + + + case_review_functional_case.review_status in + + + + + + + functional_case.last_execute_result in + + + + + + + functional_case.version_id in + + + + + + + test_case.id in ( + select resource_id from custom_field_test_case where concat('custom_single-',field_id) = + #{key} + and trim(both '"' from `value`) in + + ) + + + + + + test_case.id in ( + select resource_id from custom_field_test_case where concat('custom_multiple-',field_id) = + #{key} + and JSON_CONTAINS(`value`, json_array(#{value})) + + + + + + functional_case.create_user in + + + + + + + + + + + + + + + functional_case.name + + + + + + + + + functional_case.num + + + + + + + + + + functional_case.id ${custom.operator} ( + select case_id from functional_case_custom_field where field_id = #{custom.id} + + + and JSON_CONTAINS(`value`, json_array(#{custom.value})) + + + and `value` + + + + + + and trim(both '"' from `value`) + + + + + + ) + + + + + + + + + + + + AND + + + OR + + + \ No newline at end of file diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseUserMapper.java b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseUserMapper.java new file mode 100644 index 0000000000..0700dbddd8 --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseUserMapper.java @@ -0,0 +1,13 @@ +package io.metersphere.functional.mapper; + +import io.metersphere.functional.dto.ReviewsDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author wx + */ +public interface ExtCaseReviewFunctionalCaseUserMapper { + List selectReviewers(@Param("ids") List ids, @Param("reviewId") String reviewId); +} \ No newline at end of file diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseUserMapper.xml b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseUserMapper.xml new file mode 100644 index 0000000000..80c8607aff --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtCaseReviewFunctionalCaseUserMapper.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml index 02140494a9..7f975f2901 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml @@ -95,7 +95,12 @@ ) - + + AND functional_case.id not in + + #{excludeId} + + diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseFileRequest.java b/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseFileRequest.java index b40a6192f6..01e3dc1bc9 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseFileRequest.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseFileRequest.java @@ -27,4 +27,7 @@ public class FunctionalCaseFileRequest implements Serializable { @Schema(description = "是否本地",requiredMode = Schema.RequiredMode.REQUIRED) private Boolean local; + @Schema(description = "转存的模块id",requiredMode = Schema.RequiredMode.REQUIRED) + private String moduleId; + } diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCasePageRequest.java b/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCasePageRequest.java index abb8a24add..9f44e4dc75 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCasePageRequest.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCasePageRequest.java @@ -41,4 +41,7 @@ public class FunctionalCasePageRequest extends BasePageRequest implements Serial @Schema(description = "关联缺陷") private AssociationDTO associationBug; + @Schema(description = "排除ids") + private List excludeIds; + } diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/request/ReviewFunctionalCasePageRequest.java b/backend/services/case-management/src/main/java/io/metersphere/functional/request/ReviewFunctionalCasePageRequest.java new file mode 100644 index 0000000000..fadfe4f526 --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/request/ReviewFunctionalCasePageRequest.java @@ -0,0 +1,24 @@ +package io.metersphere.functional.request; + +import io.metersphere.system.dto.sdk.BasePageRequest; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author wx + */ +@Data +public class ReviewFunctionalCasePageRequest extends BasePageRequest implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "评审id", requiredMode = Schema.RequiredMode.REQUIRED) + private String reviewId; + + + @Schema(description = "是否只看我的", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean viewFlag; +} diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java b/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java index 113c8b7b0a..f99615cfe3 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java @@ -1,7 +1,24 @@ package io.metersphere.functional.service; +import io.metersphere.functional.dto.ReviewFunctionalCaseDTO; +import io.metersphere.functional.dto.ReviewsDTO; +import io.metersphere.functional.mapper.ExtCaseReviewFunctionalCaseMapper; +import io.metersphere.functional.mapper.ExtCaseReviewFunctionalCaseUserMapper; +import io.metersphere.functional.mapper.ExtFunctionalCaseModuleMapper; +import io.metersphere.functional.request.ReviewFunctionalCasePageRequest; +import io.metersphere.project.domain.ProjectVersion; +import io.metersphere.project.mapper.ExtBaseProjectVersionMapper; +import io.metersphere.system.dto.sdk.BaseTreeNode; +import jakarta.annotation.Resource; +import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 用例评审和功能用例的中间表服务实现类 @@ -9,6 +26,63 @@ import org.springframework.stereotype.Service; * @date : 2023-5-17 */ @Service +@Transactional(rollbackFor = Exception.class) public class CaseReviewFunctionalCaseService { + + @Resource + private ExtCaseReviewFunctionalCaseMapper extCaseReviewFunctionalCaseMapper; + @Resource + private ExtFunctionalCaseModuleMapper extFunctionalCaseModuleMapper; + @Resource + private ExtBaseProjectVersionMapper extBaseProjectVersionMapper; + @Resource + private ExtCaseReviewFunctionalCaseUserMapper extCaseReviewFunctionalCaseUserMapper; + + /** + * 通过评审id获取关联的用例id集合 + * + * @param reviewId reviewId + * @return String + */ + public List getCaseIdsByReviewId(String reviewId) { + return extCaseReviewFunctionalCaseMapper.getCaseIdsByReviewId(reviewId); + } + + + /** + * 评审详情分页列表查询 + * + * @param request request + * @param deleted deleted + * @return ReviewFunctionalCaseDTO + */ + public List page(ReviewFunctionalCasePageRequest request, boolean deleted, String userId) { + List list = extCaseReviewFunctionalCaseMapper.page(request, deleted, userId, request.getSortString()); + return doHandleDTO(list, request.getReviewId()); + } + + private List doHandleDTO(List list, String reviewId) { + if (CollectionUtils.isNotEmpty(list)) { + List ids = list.stream().map(ReviewFunctionalCaseDTO::getId).toList(); + List modules = extFunctionalCaseModuleMapper.selectBaseByIds(ids); + Map moduleMap = modules.stream().collect(Collectors.toMap(BaseTreeNode::getId, BaseTreeNode::getName)); + + List versionIds = list.stream().map(ReviewFunctionalCaseDTO::getVersionId).toList(); + List versions = extBaseProjectVersionMapper.getVersionByIds(versionIds); + Map versionMap = versions.stream().collect(Collectors.toMap(ProjectVersion::getId, ProjectVersion::getName)); + + List reviewers = extCaseReviewFunctionalCaseUserMapper.selectReviewers(ids, reviewId); + Map userIdMap = reviewers.stream().collect(Collectors.toMap(ReviewsDTO::getCaseId, ReviewsDTO::getUserIds)); + Map userNameMap = reviewers.stream().collect(Collectors.toMap(ReviewsDTO::getCaseId, ReviewsDTO::getUserNames)); + + list.forEach(item -> { + item.setModuleName(moduleMap.get(item.getModuleId())); + item.setVersionName(versionMap.get(item.getVersionId())); + item.setReviewers(Arrays.asList(userIdMap.get(item.getId()))); + item.setReviewNames(Arrays.asList(userNameMap.get(item.getId()))); + }); + } + return list; + } } \ No newline at end of file diff --git a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseControllerTests.java b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseControllerTests.java new file mode 100644 index 0000000000..2ff89d95de --- /dev/null +++ b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseControllerTests.java @@ -0,0 +1,82 @@ +package io.metersphere.functional.controller; + +import io.metersphere.functional.request.FunctionalCasePageRequest; +import io.metersphere.functional.request.ReviewFunctionalCasePageRequest; +import io.metersphere.system.base.BaseTest; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@AutoConfigureMockMvc +public class CaseReviewFunctionalCaseControllerTests extends BaseTest { + + public static final String GET_CASE_IDS = "/case/review/detail/get-ids/"; + public static final String FUNCTIONAL_CASE_LIST_URL = "/functional/case/page"; + + public static final String REVIEW_CASE_PAGE = "/case/review/detail/page"; + + @Test + @Order(1) + public void testGetCaseIds() throws Exception { + this.requestGet(GET_CASE_IDS + "test_review_id"); + } + + + @Test + @Order(2) + public void testPage() throws Exception { + FunctionalCasePageRequest request = new FunctionalCasePageRequest(); + request.setProjectId("100001100001"); + request.setCurrent(1); + request.setPageSize(10); + request.setExcludeIds(Arrays.asList("TEST_FUNCTIONAL_CASE_ID_1")); + Map map = new HashMap<>(); + map.put("customs", Arrays.asList(new LinkedHashMap() {{ + put("id", "TEST_FIELD_ID"); + put("operator", "in"); + put("value", "222"); + put("type", "List"); + }})); + request.setCombine(map); + this.requestPost(FUNCTIONAL_CASE_LIST_URL, request); + } + + + @Test + @Order(3) + @Sql(scripts = {"/dml/init_review_functional_case_test.sql"}, config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED)) + public void testReviewCasePage() throws Exception { + ReviewFunctionalCasePageRequest request = new ReviewFunctionalCasePageRequest(); + request.setReviewId("wx_review_id_1"); + request.setCurrent(1); + request.setPageSize(10); + Map map = new HashMap<>(); + map.put("customs", Arrays.asList(new LinkedHashMap() {{ + put("id", "TEST_FIELD_ID"); + put("operator", "in"); + put("value", "222"); + put("type", "List"); + }})); + request.setCombine(map); + request.setViewFlag(false); + this.requestPostWithOkAndReturn(REVIEW_CASE_PAGE, request); + + request.setSort(new HashMap<>() {{ + put("createTime", "desc"); + }}); + this.requestPostWithOkAndReturn(REVIEW_CASE_PAGE, request); + } + +} diff --git a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/CleanupFunctionalCaseResourceTest.java b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/CleanupFunctionalCaseResourceTests.java similarity index 96% rename from backend/services/case-management/src/test/java/io/metersphere/functional/controller/CleanupFunctionalCaseResourceTest.java rename to backend/services/case-management/src/test/java/io/metersphere/functional/controller/CleanupFunctionalCaseResourceTests.java index 771f1b5c40..ba24eb8d75 100644 --- a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/CleanupFunctionalCaseResourceTest.java +++ b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/CleanupFunctionalCaseResourceTests.java @@ -14,7 +14,7 @@ import org.springframework.test.context.jdbc.SqlConfig; @SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @AutoConfigureMockMvc -public class CleanupFunctionalCaseResourceTest { +public class CleanupFunctionalCaseResourceTests { @Resource private CleanupFunctionalCaseResourceService cleanupFunctionalCaseResourceService; diff --git a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseAttachmentControllerTests.java b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseAttachmentControllerTests.java index 88a0d38121..938f693f00 100644 --- a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseAttachmentControllerTests.java +++ b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseAttachmentControllerTests.java @@ -55,6 +55,7 @@ public class FunctionalCaseAttachmentControllerTests extends BaseTest { public static final String ATTACHMENT_TRANSFER_URL = "/attachment/transfer"; public static final String UPLOAD_FILE_URL = "/attachment/upload/file"; public static final String DELETE_FILE_URL = "/attachment/delete/file"; + public static final String OPTIONS_URL = "/attachment/options/"; @Test @@ -216,4 +217,11 @@ public class FunctionalCaseAttachmentControllerTests extends BaseTest { } + @Test + @Order(9) + public void testOptions() throws Exception { + //覆盖controller方法 + this.requestGet(OPTIONS_URL + DEFAULT_PROJECT_ID); + } + } diff --git a/backend/services/case-management/src/test/resources/dml/init_review_functional_case_test.sql b/backend/services/case-management/src/test/resources/dml/init_review_functional_case_test.sql new file mode 100644 index 0000000000..6868010b98 --- /dev/null +++ b/backend/services/case-management/src/test/resources/dml/init_review_functional_case_test.sql @@ -0,0 +1,26 @@ +INSERT INTO functional_case(id, num, module_id, project_id, template_id, name, review_status, tags, case_edit_type, pos, version_id, ref_id, last_execute_result, deleted, public_case, latest, create_user, update_user, delete_user, create_time, update_time, delete_time) +VALUES ('wx_case_id_1', 100, 'TEST_MODULE_ID', 'wx_test_project', '100001', '测试', 'UN_REVIEWED', NULL, 'STEP', 0, 'v1.0.0', 'v1.0.0', 'UN_EXECUTED', b'0', b'0', b'1', 'admin', 'admin', '', 1698058347559, 1698058347559, NULL); + +INSERT INTO functional_case(id, num, module_id, project_id, template_id, name, review_status, tags, case_edit_type, pos, version_id, ref_id, last_execute_result, deleted, public_case, latest, create_user, update_user, delete_user, create_time, update_time, delete_time) +VALUES ('wx_case_id_2', 101, 'TEST_MODULE_ID', 'wx_test_project', '100001', '测试多版本', 'UN_REVIEWED', '["测试标签_1"]', 'STEP', 0, 'v1.0.0', 'TEST_REF_ID', 'UN_EXECUTED', b'0', b'0', b'1', 'admin', 'admin', '', 1698058347559, 1698058347559, NULL); + +INSERT INTO functional_case_blob(id, steps, text_description, expected_result, prerequisite, description) VALUES ('wx_case_id_1', 'STEP', '1111', '', '', 'TEST'); +INSERT INTO functional_case_blob(id, steps, text_description, expected_result, prerequisite, description) VALUES ('wx_case_id_2', 'STEP', '1111', '', '', '1111'); + + +INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('wx_case_id_1', '100548878725546079', '22'); +INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('wx_case_id_1', 'TEST_FIELD_ID', '["222","333"]'); +INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('wx_case_id_2', 'TEST_FIELD_ID_1', '["222","333"]'); + + + +INSERT INTO case_review(id, num, name, module_id, project_id, status, review_pass_rule, pos, start_time, end_time, case_count, pass_rate, tags, description, create_time, create_user, update_time, update_user) +VALUES ('wx_review_id_1',10001,'wx1', 'wx_module_1', 'wx_test_project', 'COMPLETED', 'SINGLE', 001, null, null, 1,100.00,null,null,1698058347559,'admin',1698058347559,'admin'), + ('wx_review_id_2',10002,'wx2', 'wx_module_2', 'wx_test_project', 'COMPLETED', 'SINGLE', 001, null, null, 1,100.00,null,null,1698058347559,'admin',1698058347559,'admin'); + +INSERT INTO case_review_functional_case(id, review_id, case_id, status, create_time, create_user, update_time) +VALUES ('wx_test_1', 'wx_review_id_1', 'wx_case_id_1', 'PASS', 1698058347559,'admin',1698058347559), + ('wx_test_2', 'wx_review_id_2', 'wx_case_id_2', 'PASS', 1698058347559,'admin',1698058347559); + + +INSERT INTO functional_case_module(id, project_id, name, parent_id, pos, create_time, update_time, create_user, update_user) VALUES ('wx_module_1', 'wx_test_project', '测试所属模块', 'NONE', 0, 1669174143999, 1669174143999, 'admin', 'admin'); diff --git a/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.java b/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.java index 60b71977b6..8ed3f55165 100644 --- a/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.java +++ b/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.java @@ -1,8 +1,14 @@ package io.metersphere.project.mapper; +import io.metersphere.project.domain.ProjectVersion; import org.apache.ibatis.annotations.Param; +import java.util.List; + public interface ExtBaseProjectVersionMapper { String getDefaultVersion(@Param("projectId") String projectId); + + + List getVersionByIds(@Param("ids") List ids); } diff --git a/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.xml b/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.xml index 433087f7dd..5bc4c4d710 100644 --- a/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.xml +++ b/backend/services/project-management/src/main/java/io/metersphere/project/mapper/ExtBaseProjectVersionMapper.xml @@ -6,4 +6,10 @@ select id from project_version where project_id = #{projectId} and status = 'open' and latest = TRUE LIMIT 1 + \ No newline at end of file