From 0a95c89998ed336b6872fa2885f2d211e18e505d Mon Sep 17 00:00:00 2001 From: WangXu10 Date: Tue, 12 Sep 2023 13:46:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=AE=BE=E7=BD=AE-=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=85=8D=E7=BD=AE=E9=83=A8=E5=88=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/constants/PermissionConstants.java | 2 + .../sdk/constants/ProjectApplicationType.java | 13 +++ .../ProjectApplicationController.java | 39 +++++++ .../service/ProjectApplicationService.java | 63 ++++++++++- .../ProjectApplicationControllerTests.java | 107 +++++++++++++++++- .../dml/init_project_application_test.sql | 7 ++ .../file/metersphere-jira-plugin-3.x.jar | Bin 0 -> 41971 bytes .../system/mapper/ExtPluginMapper.java | 3 + .../system/mapper/ExtPluginMapper.xml | 11 ++ 9 files changed, 239 insertions(+), 6 deletions(-) create mode 100644 backend/services/project-management/src/test/resources/dml/init_project_application_test.sql create mode 100644 backend/services/project-management/src/test/resources/file/metersphere-jira-plugin-3.x.jar diff --git a/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java index dad81d8f4f..5ac883bab7 100644 --- a/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java +++ b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java @@ -149,6 +149,8 @@ public class PermissionConstants { public static final String PROJECT_APPLICATION_PERFORMANCE_TEST_UPDATE = "PROJECT_APPLICATION_PERFORMANCE_TEST:UPDATE"; public static final String PROJECT_APPLICATION_API_READ = "PROJECT_APPLICATION_API:READ"; public static final String PROJECT_APPLICATION_API_UPDATE = "PROJECT_APPLICATION_API:UPDATE"; + public static final String PROJECT_APPLICATION_CASE_READ = "PROJECT_APPLICATION_CASE:READ"; + public static final String PROJECT_APPLICATION_CASE_UPDATE = "PROJECT_APPLICATION_CASE:UPDATE"; /*------ end: PROJECT_APPLICATION ------*/ public static final String PROJECT_BASE_INFO_READ = "PROJECT_BASE_INFO:READ"; diff --git a/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/ProjectApplicationType.java b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/ProjectApplicationType.java index 170475b53f..e2be98e600 100644 --- a/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/ProjectApplicationType.java +++ b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/ProjectApplicationType.java @@ -78,6 +78,19 @@ public enum ProjectApplicationType { APPLICATION_API_SYNC_CASE, + //用例管理 + /** + * 公共用例库 + */ + APPLICATION_CASE_PUBLIC, + /** + * 测试用例关联需求 + */ + APPLICATION_CASE_ASSOCIATION_REQUIREMENTS, + /** + * 重新提审 + */ + APPLICATION_RE_REVIEW, //缺陷管理 /** diff --git a/backend/services/project-management/src/main/java/io/metersphere/project/controller/ProjectApplicationController.java b/backend/services/project-management/src/main/java/io/metersphere/project/controller/ProjectApplicationController.java index ede4a7502c..7630bba123 100644 --- a/backend/services/project-management/src/main/java/io/metersphere/project/controller/ProjectApplicationController.java +++ b/backend/services/project-management/src/main/java/io/metersphere/project/controller/ProjectApplicationController.java @@ -136,4 +136,43 @@ public class ProjectApplicationController { public List getResourcePoolList(@PathVariable String organizationId) { return projectApplicationService.getResourcePoolList(StringUtils.defaultIfBlank(organizationId, SessionUtils.getCurrentOrganizationId())); } + + + + /** + * ==========用例管理========== + */ + + @PostMapping("/update/case") + @Operation(summary = "应用设置-用例管理-配置") + @RequiresPermissions(PermissionConstants.PROJECT_APPLICATION_CASE_UPDATE) + @Log(type = OperationLogType.UPDATE, expression = "#msClass.updateCaseLog(#application)", msClass = ProjectApplicationService.class) + public ProjectApplication updateCase(@Validated({Updated.class}) @RequestBody ProjectApplication application) { + return projectApplicationService.update(application); + } + + + @PostMapping("/case") + @Operation(summary = "应用设置-用例管理-获取配置") + @RequiresPermissions(PermissionConstants.PROJECT_APPLICATION_CASE_READ) + public List getCase(@Validated @RequestBody ProjectApplicationRequest request) { + return projectApplicationService.get(request); + } + + + @GetMapping("/case/platform/{organizationId}") + @Operation(summary = "应用设置-用例管理-获取平台下拉框列表") + @RequiresPermissions(PermissionConstants.PROJECT_APPLICATION_CASE_READ) + public List getCasePlatformOptions(@PathVariable String organizationId) { + return projectApplicationService.getPlatformOptions(organizationId); + } + + + @GetMapping("case/platform/info/{pluginId}") + @Operation(summary = "应用设置-用例管理-选择平台获取平台信息") + @RequiresPermissions(PermissionConstants.PROJECT_APPLICATION_CASE_READ) + public Object getCasePlatformInfo(@PathVariable String pluginId) { + return projectApplicationService.getPluginScript(pluginId); + } + } diff --git a/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectApplicationService.java b/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectApplicationService.java index fd22a3b134..cf2d7fe62d 100644 --- a/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectApplicationService.java +++ b/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectApplicationService.java @@ -1,5 +1,6 @@ package io.metersphere.project.service; +import io.metersphere.plugin.platform.api.AbstractPlatformPlugin; import io.metersphere.project.domain.ProjectApplication; import io.metersphere.project.domain.ProjectApplicationExample; import io.metersphere.project.job.CleanUpReportJob; @@ -15,10 +16,14 @@ import io.metersphere.sdk.dto.OptionDTO; import io.metersphere.sdk.log.constants.OperationLogModule; import io.metersphere.sdk.log.constants.OperationLogType; import io.metersphere.sdk.sechedule.BaseScheduleService; +import io.metersphere.sdk.service.PluginLoadService; import io.metersphere.sdk.util.JSON; +import io.metersphere.sdk.util.ServiceUtils; import io.metersphere.sdk.util.SessionUtils; -import io.metersphere.system.domain.Schedule; -import io.metersphere.system.domain.User; +import io.metersphere.system.domain.*; +import io.metersphere.system.mapper.ExtPluginMapper; +import io.metersphere.system.mapper.PluginMapper; +import io.metersphere.system.mapper.ServiceIntegrationMapper; import jakarta.annotation.Resource; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; @@ -29,6 +34,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Service @Transactional @@ -45,6 +51,17 @@ public class ProjectApplicationService { @Resource private ExtProjectTestResourcePoolMapper extProjectTestResourcePoolMapper; + @Resource + private ServiceIntegrationMapper serviceIntegrationMapper; + @Resource + private ExtPluginMapper extPluginMapper; + + @Resource + private PluginMapper pluginMapper; + + @Resource + private PluginLoadService pluginLoadService; + /** * 更新配置信息 * @@ -159,6 +176,37 @@ public class ProjectApplicationService { } + /** + * 获取平台列表 + * + * @return + */ + public List getPlatformOptions(String organizationId) { + ServiceIntegrationExample example = new ServiceIntegrationExample(); + example.createCriteria().andOrganizationIdEqualTo(organizationId).andEnableEqualTo(true); + List serviceIntegrations = serviceIntegrationMapper.selectByExample(example); + List options = new ArrayList<>(); + if(CollectionUtils.isNotEmpty(serviceIntegrations)){ + List pluginIds = serviceIntegrations.stream().map(ServiceIntegration::getPluginId).collect(Collectors.toList()); + options = extPluginMapper.selectPluginOptions(pluginIds); + return options; + } + return options; + } + + + + public Object getPluginScript(String pluginId) { + this.checkResourceExist(pluginId); + AbstractPlatformPlugin platformPlugin = pluginLoadService.getImplInstance(pluginId, AbstractPlatformPlugin.class); + return pluginLoadService.getPluginScriptContent(pluginId, platformPlugin.getProjectScriptId()); + } + + private Plugin checkResourceExist(String id) { + return ServiceUtils.checkResourceExist(pluginMapper.selectByPrimaryKey(id), "permission.system_plugin.name"); + } + + /** * 测试计划 日志 * @@ -200,6 +248,17 @@ public class ProjectApplicationService { return delLog(application, OperationLogModule.PROJECT_PROJECT_MANAGER, "接口测试配置"); } + + /** + * 用例管理 日志 + * + * @param application + * @return + */ + public LogDTO updateCaseLog(ProjectApplication application) { + return delLog(application, OperationLogModule.PROJECT_PROJECT_MANAGER, "用例管理配置"); + } + private LogDTO delLog(ProjectApplication application, String module, String content) { ProjectApplicationExample example = new ProjectApplicationExample(); example.createCriteria().andTypeEqualTo(application.getType()).andProjectIdEqualTo(application.getProjectId()); diff --git a/backend/services/project-management/src/test/java/io/metersphere/project/controller/ProjectApplicationControllerTests.java b/backend/services/project-management/src/test/java/io/metersphere/project/controller/ProjectApplicationControllerTests.java index 667b784b6d..fcc770fd25 100644 --- a/backend/services/project-management/src/test/java/io/metersphere/project/controller/ProjectApplicationControllerTests.java +++ b/backend/services/project-management/src/test/java/io/metersphere/project/controller/ProjectApplicationControllerTests.java @@ -6,21 +6,38 @@ import io.metersphere.project.domain.ProjectApplication; import io.metersphere.project.request.ProjectApplicationRequest; import io.metersphere.sdk.base.BaseTest; import io.metersphere.sdk.constants.ProjectApplicationType; -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 io.metersphere.sdk.controller.handler.ResultHolder; +import io.metersphere.sdk.util.JSON; +import io.metersphere.system.domain.Plugin; +import io.metersphere.system.request.PluginUpdateRequest; +import io.metersphere.system.service.PluginService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.*; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; +import org.springframework.test.web.servlet.MvcResult; +import java.io.File; +import java.io.FileInputStream; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; +import static io.metersphere.sdk.constants.InternalUserRole.ADMIN; + @SpringBootTest @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @AutoConfigureMockMvc public class ProjectApplicationControllerTests extends BaseTest { + + private static Plugin plugin; + @Resource + private PluginService pluginService; + public static final String PROJECT_ID = "project_application_test_id"; public static final String TIME_TYPE_VALUE = "3M"; @@ -36,6 +53,7 @@ public class ProjectApplicationControllerTests extends BaseTest { //应用配置 - 测试计划 - 清理报告配置 @Test @Order(1) + @Sql(scripts = {"/dml/init_project_application_test.sql"}, config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED)) public void testTestPlanClean() throws Exception { this.testGetTestPlan(); //新增 @@ -305,6 +323,87 @@ public class ProjectApplicationControllerTests extends BaseTest { */ + + /** + * ==========用例管理 start========== + */ + public static final String CASE_UPDATE_URL = "/project/application/update/case"; + public static final String GET_CASE_URL = "/project/application/case"; + public static final String GET_PLATFORM_URL = "/project/application/case/platform"; + + public static final String GET_PLATFORM_INFO_URL = "/project/application/case/platform/info"; + + //应用配置 - 用例管理 - 公共用例库 + @Test + @Order(22) + public void testCasePublic() throws Exception { + ProjectApplication request = creatRequest(ProjectApplicationType.APPLICATION_CASE_PUBLIC.name(), "true"); + this.requestPost(CASE_UPDATE_URL, request); + } + + //应用配置 - 用例管理 - 重新提审 + @Test + @Order(23) + public void testReview() throws Exception { + ProjectApplication request = creatRequest(ProjectApplicationType.APPLICATION_RE_REVIEW.name(), "true"); + this.requestPost(CASE_UPDATE_URL, request); + } + + //应用管理 - 用例管理 - 获取配置 + @Test + @Order(24) + public void testGetCase() throws Exception { + List types = Arrays.asList(ProjectApplicationType.APPLICATION_CASE_PUBLIC.name(), ProjectApplicationType.APPLICATION_RE_REVIEW.name()); + ProjectApplicationRequest request = this.getRequest(types); + this.requestPostWithOkAndReturn(GET_CASE_URL, request); + } + + //应用管理 - 用例管理 - 获取平台下拉列表 + @Test + @Order(25) + public void testGetPlatform() throws Exception { + this.requestGetWithOkAndReturn(GET_PLATFORM_URL + "/100002"); + MvcResult mvcResult = this.requestGetWithOkAndReturn(GET_PLATFORM_URL + "/100001"); + // 获取返回值 + String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8); + ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class); + // 返回请求正常 + Assertions.assertNotNull(resultHolder); + } + + + //应用管理 - 用例管理 - 获取平台信息 + @Test + @Order(26) + public void testGetPlatformInfo() throws Exception { + plugin = addPlugin(); + MvcResult mvcResult = this.requestGetWithOkAndReturn(GET_PLATFORM_INFO_URL + "/"+plugin.getId()); + // 获取返回值 + String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8); + ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class); + // 返回请求正常 + Assertions.assertNotNull(resultHolder); + } + /** + * ==========用例管理 start========== + */ + + public Plugin addPlugin() throws Exception { + PluginUpdateRequest request = new PluginUpdateRequest(); + File jarFile = new File( + this.getClass().getClassLoader().getResource("file/metersphere-jira-plugin-3.x.jar") + .getPath() + ); + FileInputStream inputStream = new FileInputStream(jarFile); + MockMultipartFile mockMultipartFile = new MockMultipartFile(jarFile.getName(), inputStream); + request.setName("测试插件1"); + request.setGlobal(true); + request.setEnable(true); + request.setCreateUser(ADMIN.name()); + return pluginService.add(request, mockMultipartFile); + } + + private ProjectApplicationRequest getRequest(List types) { ProjectApplicationRequest request = new ProjectApplicationRequest(); request.setProjectId(PROJECT_ID); diff --git a/backend/services/project-management/src/test/resources/dml/init_project_application_test.sql b/backend/services/project-management/src/test/resources/dml/init_project_application_test.sql new file mode 100644 index 0000000000..7c2b0dbe48 --- /dev/null +++ b/backend/services/project-management/src/test/resources/dml/init_project_application_test.sql @@ -0,0 +1,7 @@ +-- 模拟数据 +INSERT INTO `service_integration`(`id`, `plugin_id`, `enable`, `configuration`, `organization_id`) VALUES ('1', '952262969139212', b'1', '1111', '100001'); + + + + + diff --git a/backend/services/project-management/src/test/resources/file/metersphere-jira-plugin-3.x.jar b/backend/services/project-management/src/test/resources/file/metersphere-jira-plugin-3.x.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8a6ea2338f7f162367e6ade82cf0a7eac40ceb6 GIT binary patch literal 41971 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 literal 0 HcmV?d00001 diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.java b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.java index 1a03b9e565..de74fa4853 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.java @@ -1,9 +1,12 @@ package io.metersphere.system.mapper; +import io.metersphere.sdk.dto.OptionDTO; import io.metersphere.system.dto.PluginDTO; import java.util.List; public interface ExtPluginMapper { List getPlugins(); + + List selectPluginOptions(List pluginIds); } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.xml b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.xml index 4a1bb3b2a4..9082755c7f 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.xml +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtPluginMapper.xml @@ -7,4 +7,15 @@ FROM plugin + + + \ No newline at end of file