feat(接口测试): 获取协议列表接口实现

This commit is contained in:
AgAngle 2023-11-08 15:10:42 +08:00 committed by jianxing
parent f2f4cf71d6
commit b6599fec96
11 changed files with 210 additions and 7 deletions

View File

@ -8,7 +8,7 @@ package io.metersphere.plugin.api.spi;
public abstract class AbstractProtocolPlugin extends AbstractApiPlugin {
/**
* 返回协议名
* 返回协议名
* @return
*/
abstract public String getProtocol();

View File

@ -19,4 +19,16 @@ public class QueryParam extends KeyValueParam {
* 是否必填
*/
private Boolean required = false;
/**
* 最大长度
*/
private Integer minLength;
/**
* 最小长度
*/
private Integer maxLength;
/**
* 是否编码
*/
private Boolean encode = false;
}

View File

@ -18,4 +18,16 @@ public class RestParam extends KeyValueParam {
* 是否必填
*/
private Boolean required = false;
/**
* 最大长度
*/
private Integer minLength;
/**
* 最小长度
*/
private Integer maxLength;
/**
* 是否编码
*/
private Boolean encode = false;
}

View File

@ -0,0 +1,32 @@
package io.metersphere.api.controller;
import io.metersphere.api.service.ApiTestService;
import io.metersphere.system.dto.ProtocolDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Author: jianxing
* @CreateTime: 2023-11-06 10:54
*/
@RestController
@RequestMapping("/api/test")
@Tag(name = "接口测试")
public class ApiTestController {
@Resource
private ApiTestService apiTestService;
@GetMapping("/protocol/{organizationId}")
@Operation(summary = "获取协议插件的的协议列表")
public List<ProtocolDTO> getProtocols(@PathVariable String organizationId) {
return apiTestService.getProtocols(organizationId);
}
}

View File

@ -0,0 +1,26 @@
package io.metersphere.api.service;
import io.metersphere.system.dto.ProtocolDTO;
import io.metersphere.system.service.ApiPluginService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author jianxing
* @date : 2023-11-6
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class ApiTestService {
@Resource
private ApiPluginService apiPluginService;
public List<ProtocolDTO> getProtocols(String orgId) {
return apiPluginService.getProtocols(orgId);
}
}

View File

@ -0,0 +1,32 @@
package io.metersphere.api.controller;
import io.metersphere.system.base.BaseTest;
import org.junit.jupiter.api.MethodOrderer;
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;
/**
* @Author: jianxing
* @CreateTime: 2023-11-07 17:07
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@AutoConfigureMockMvc
public class ApiTestControllerTests extends BaseTest {
private static final String BASE_PATH = "/api/test/";
protected static final String PROTOCOL_LIST = "protocol/{0}";
@Override
protected String getBasePath() {
return BASE_PATH;
}
@Test
public void getProtocols() throws Exception {
// @@请求成功
this.requestGetWithOk(PROTOCOL_LIST, this.DEFAULT_ORGANIZATION_ID).andReturn();
}
}

View File

@ -8,6 +8,13 @@ import lombok.Data;
*/
@Data
public class ProtocolDTO {
/**
* 协议名
*/
private String protocol;
private String name;
/**
* 协议对应的组件名
* 例如 Http 对应 MsHTTPElement
*/
private String polymorphicName;
}

View File

@ -1,13 +1,20 @@
package io.metersphere.system.service;
import io.metersphere.plugin.api.spi.AbstractProtocolPlugin;
import io.metersphere.plugin.api.spi.MsTestElement;
import io.metersphere.sdk.constants.PluginScenarioType;
import io.metersphere.sdk.dto.api.request.http.MsHTTPElement;
import io.metersphere.sdk.util.LogUtils;
import io.metersphere.system.domain.Plugin;
import io.metersphere.system.dto.ProtocolDTO;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.pf4j.PluginWrapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@ -20,23 +27,50 @@ public class ApiPluginService {
private PluginLoadService pluginLoadService;
@Resource
private BasePluginService basePluginService;
private static final String HTTP_PROTOCOL = "HTTP";
/**
* 获取协议插件的的协议列表
* @param orgId
* @return
*/
public List<String> getProtocols(String orgId) {
public List<ProtocolDTO> getProtocols(String orgId) {
// 查询组织下有权限的插件
Set<String> pluginIds = basePluginService.getOrgEnabledPlugins(orgId, PluginScenarioType.API_PROTOCOL)
.stream()
.map(Plugin::getId)
.collect(Collectors.toSet());
// 过滤协议插件
List<PluginWrapper> plugins = pluginLoadService.getMsPluginManager().getPlugins();
return plugins.stream()
.filter(plugin -> pluginIds.contains(plugin.getPluginId()) && plugin.getPlugin() instanceof AbstractProtocolPlugin)
.map(plugin -> ((AbstractProtocolPlugin) plugin.getPlugin()).getProtocol())
.collect(Collectors.toList());
List<PluginWrapper> pluginWrappers = plugins.stream()
.filter(plugin -> pluginIds.contains(plugin.getPluginId()) && plugin.getPlugin() instanceof AbstractProtocolPlugin).toList();
List protocols = new ArrayList<ProtocolDTO>();
pluginWrappers.forEach(pluginWrapper -> {
try {
// 获取插件中 MsTestElement 的实现类
List<Class<? extends MsTestElement>> extensionClasses = pluginWrapper.getPluginManager()
.getExtensionClasses(MsTestElement.class, pluginWrapper.getPluginId());
AbstractProtocolPlugin protocolPlugin = ((AbstractProtocolPlugin) pluginWrapper.getPlugin());
ProtocolDTO protocolDTO = new ProtocolDTO();
protocolDTO.setProtocol(protocolPlugin.getProtocol());
if (CollectionUtils.isNotEmpty(extensionClasses)) {
protocolDTO.setPolymorphicName(extensionClasses.get(0).getSimpleName());
}
if (StringUtils.isNoneBlank(protocolDTO.getProtocol(), protocolDTO.getPolymorphicName())) {
protocols.add(protocolDTO);
}
} catch (Exception e) {
LogUtils.error(e);
}
});
// http 协议放最前面
ProtocolDTO protocolDTO = new ProtocolDTO();
protocolDTO.setProtocol(HTTP_PROTOCOL);
protocolDTO.setPolymorphicName(MsHTTPElement.class.getSimpleName());
protocols.addFirst(protocolDTO);
return protocols;
}
}

View File

@ -0,0 +1,48 @@
package io.metersphere.system.service;
import io.metersphere.sdk.dto.api.request.http.MsHTTPElement;
import io.metersphere.system.base.BaseApiPluginTestService;
import io.metersphere.system.base.BaseTest;
import io.metersphere.system.dto.ProtocolDTO;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.MethodOrderer;
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 java.util.ArrayList;
import java.util.List;
/**
* @Author: jianxing
* @CreateTime: 2023-11-08 16:34
*/
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ApiPluginServiceTests extends BaseTest {
@Resource
private BaseApiPluginTestService baseApiPluginTestService;
@Resource
private ApiPluginService apiPluginService;
@Test
public void getProtocols() throws Exception {
baseApiPluginTestService.addJdbcPlugin();
// 校验数据是否正确
List<ProtocolDTO> protocols = apiPluginService.getProtocols(this.DEFAULT_ORGANIZATION_ID);
List expected = new ArrayList<ProtocolDTO>();
ProtocolDTO httpProtocol = new ProtocolDTO();
httpProtocol.setProtocol("HTTP");
httpProtocol.setPolymorphicName(MsHTTPElement.class.getSimpleName());
ProtocolDTO jdbcProtocol = new ProtocolDTO();
jdbcProtocol.setProtocol("JDBC");
jdbcProtocol.setPolymorphicName("MsJDBCElement");
expected.add(httpProtocol);
expected.add(jdbcProtocol);
Assertions.assertEquals(protocols, expected);
}
}