diff --git a/backend/pom.xml b/backend/pom.xml index 0e4ec205fe..db7a2e7c2a 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -385,6 +385,12 @@ kubernetes-client 4.13.0 + + com.github.fge + json-schema-validator + 2.2.6 + + diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java index dd272859c1..f67eec5219 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java @@ -11,6 +11,7 @@ import io.metersphere.api.dto.definition.parse.ApiDefinitionImport; import io.metersphere.api.service.ApiDefinitionService; import io.metersphere.base.domain.ApiDefinition; import io.metersphere.commons.constants.RoleConstants; +import io.metersphere.commons.json.JSONSchemaGenerator; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; @@ -158,4 +159,10 @@ public class ApiDefinitionController { public void testPlanRelevance(@RequestBody ApiCaseRelevanceRequest request) { apiDefinitionService.testPlanRelevance(request); } + + @PostMapping("/preview") + public String preview(@RequestBody String jsonSchema) { + return JSONSchemaGenerator.getJson(jsonSchema); + } + } diff --git a/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java b/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java index 7ba26ee3d1..4065544e7b 100644 --- a/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java +++ b/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java @@ -1,6 +1,7 @@ package io.metersphere.api.dto.scenario; import io.metersphere.api.dto.scenario.request.BodyFile; +import io.metersphere.commons.json.JSONSchemaGenerator; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy; @@ -17,6 +18,7 @@ public class Body { private String format; private List kvs; private List binary; + private Object jsonSchema; public final static String KV = "KeyValue"; public final static String FORM_DATA = "Form Data"; @@ -54,6 +56,10 @@ public class Body { } else { if (!this.isJson()) { sampler.setPostBodyRaw(true); + } else { + if (StringUtils.isNotEmpty(this.format) && this.format.equals("JSON-SCHEMA") && this.getJsonSchema() != null) { + this.raw = JSONSchemaGenerator.getJson(com.alibaba.fastjson.JSON.toJSONString(this.getJsonSchema())); + } } KeyValue keyValue = new KeyValue("", this.getRaw()); keyValue.setEnable(true); diff --git a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java index 04cc8d7575..ad71231c14 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java @@ -1,5 +1,6 @@ package io.metersphere.api.jmeter; +import io.metersphere.api.dto.scenario.request.RequestType; import io.metersphere.api.service.*; import io.metersphere.base.domain.ApiScenarioReport; import io.metersphere.base.domain.ApiTestReport; @@ -336,7 +337,11 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl String start = "RPC Protocol: "; String end = "://"; if (StringUtils.contains(body, start)) { - return StringUtils.substringBetween(body, start, end).toUpperCase(); + String protocol = StringUtils.substringBetween(body, start, end); + if (StringUtils.isNotEmpty(protocol)) { + return protocol.toUpperCase(); + } + return RequestType.DUBBO; } else { // Http Method String method = StringUtils.substringBefore(body, " "); diff --git a/backend/src/main/java/io/metersphere/api/parse/Swagger2Parser.java b/backend/src/main/java/io/metersphere/api/parse/Swagger2Parser.java index d1a312941b..8d78614dad 100644 --- a/backend/src/main/java/io/metersphere/api/parse/Swagger2Parser.java +++ b/backend/src/main/java/io/metersphere/api/parse/Swagger2Parser.java @@ -275,6 +275,11 @@ public class Swagger2Parser extends ApiImportAbstractParser { } else if (value instanceof RefProperty) { RefProperty refProperty = (RefProperty) value; String simpleRef = refProperty.getSimpleRef(); + if (refSet.contains(simpleRef)) { + //避免嵌套死循环 + jsonObject.put(key, new JSONArray()); + return; + } refSet.add(simpleRef); Model model = definitions.get(simpleRef); jsonObject.put(key, getBodyParameters(model.getProperties(), refSet)); diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml index 2ca103606a..fb035d0e3d 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml @@ -297,20 +297,9 @@ - + - + + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java index c60c731415..483dc83f09 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java @@ -21,4 +21,6 @@ public interface ExtTestPlanScenarioCaseMapper { List getExecResultByPlanId(String planId); List getIdsByPlanId(String planId); + + List getNotRelevanceCaseIds(String planId, List relevanceProjectIds); } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml index 11767c5e7f..d3add4c1a2 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml @@ -92,4 +92,18 @@ where test_plan_id = #{planId} + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/commons/json/JSONSchemaGenerator.java b/backend/src/main/java/io/metersphere/commons/json/JSONSchemaGenerator.java new file mode 100644 index 0000000000..41e251740f --- /dev/null +++ b/backend/src/main/java/io/metersphere/commons/json/JSONSchemaGenerator.java @@ -0,0 +1,310 @@ +package io.metersphere.commons.json; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.JsonNode; +import com.github.fge.jackson.JsonLoader; +import com.github.fge.jsonschema.cfg.ValidationConfiguration; +import com.github.fge.jsonschema.core.report.ProcessingReport; +import com.github.fge.jsonschema.processors.syntax.SyntaxValidator; +import com.google.gson.*; +import io.metersphere.commons.utils.ScriptEngineUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +public class JSONSchemaGenerator { + + private static void generator(String json, JSONObject obj) { + analyzeSchema(json, obj); + } + + private static void analyzeSchema(String json, JSONObject rootObj) { + // Let's start with the root element of the file + JsonObject rootElement = null; + try { + JsonParser jsonParser = new JsonParser(); + JsonElement inputElement = jsonParser.parse(json); + rootElement = inputElement.getAsJsonObject(); + } catch (Exception e) { + e.printStackTrace(); + } + + analyzeRootSchemaElement(rootElement, rootObj); + } + + private static void analyzeRootSchemaElement(JsonObject rootElement, JSONObject rootObj) { + if (rootElement.has("type") || rootElement.has("allOf")) { + analyzeObject(rootElement, rootObj); + } + + if (rootElement.has("definitions")) { + // Section 9 in json-validation + analyzeDefinitions(rootElement); + } + } + + private static void analyzeObject(JsonObject object, JSONObject rootObj) { + // Creating the concept + + if (object.has("title")) { + // 暂不处理,后续使用时再加 + String title = object.get("title").getAsString(); + } + + if (object.has("description")) { + // 暂不处理,后续使用时再加 + String description = object.get("description").getAsString(); + } + + if (object.has("allOf")) { + JsonArray allOfArray = object.get("allOf").getAsJsonArray(); + for (JsonElement allOfElement : allOfArray) { + JsonObject allOfElementObj = allOfElement.getAsJsonObject(); + if (allOfElementObj.has("$ref")) { + // 暂不处理,后续使用时再加 + String ref = allOfElementObj.get("$ref").getAsString(); + } else if (allOfElementObj.has("properties")) { + // Properties elements will become the attributes/references of the element + JsonObject propertiesObj = allOfElementObj.get("properties").getAsJsonObject(); + for (Entry entry : propertiesObj.entrySet()) { + String propertyKey = entry.getKey(); + JsonObject propertyObj = propertiesObj.get(propertyKey).getAsJsonObject(); + analyzeProperty(rootObj, propertyKey, propertyObj); + } + } + } + } else if (object.has("oneOf")) { + // 暂不处理,后续使用时再加 + } else if (object.has("properties")) { + JsonObject propertiesObj = object.get("properties").getAsJsonObject(); + for (Entry entry : propertiesObj.entrySet()) { + String propertyKey = entry.getKey(); + JsonObject propertyObj = propertiesObj.get(propertyKey).getAsJsonObject(); + analyzeProperty(rootObj, propertyKey, propertyObj); + } + } else if (object.has("type") && !object.get("type").getAsString().equals("object")) { + analyzeProperty(rootObj, object.getAsString(), object); + } + + if (object.has("required")) { + // 必选项暂不处理,后续使用时再加 + } + } + + private static void analyzeProperty(JSONObject concept, String propertyName, JsonObject object) { + if (object.has("type")) { + String propertyObjType = null; + if (object.get("type") instanceof JsonPrimitive) { + propertyObjType = object.get("type").getAsString(); + } else if (object.get("type") instanceof JsonArray) { + JsonArray typeArray = (JsonArray) object.get("type").getAsJsonArray(); + propertyObjType = typeArray.get(0).getAsString(); + if (typeArray.size() > 1) { + if (typeArray.get(1).getAsString().equals("null")) { + // 暂不处理,后续使用时再加 + } + } + } + + if (object.has("enum")) { + concept.put(propertyName, analyzeEnumProperty(object)); + } else if (propertyObjType.equals("string")) { + // 先设置空值 + concept.put(propertyName, null); + if (object.has("format")) { + String propertyFormat = object.get("format").getAsString(); + if (propertyFormat.equals("date-time")) { + + } + } + if (object.has("default")) { + concept.put(propertyName, object.get("default")); + } + if (object.has("mock") && object.get("mock").getAsJsonObject() != null && StringUtils.isNotEmpty(object.get("mock").getAsJsonObject().get("mock").getAsString()) && StringUtils.isNotEmpty(object.get("mock").getAsJsonObject().get("mock").getAsString())) { + String value = ScriptEngineUtils.calculate(object.get("mock").getAsJsonObject().get("mock").getAsString()); + concept.put(propertyName, value); + } + if (object.has("maxLength")) { + + } + // Section 6.3.1 in json-schema-validation. Resolved as OCL + + if (object.has("minLength")) { + + } + // Section 6.3.2 in json-schema-validation. Resolved as OCL + + if (object.has("pattern")) { + // Section 6.3.3 in json-schema-validation. Resolved as OCL, possible? + // TODO 6.3.3 in json-schema-validation + } + + } else if (propertyObjType.equals("integer") || propertyObjType.equals("number")) { + // 先设置空值 + concept.put(propertyName, 0); + if (object.has("default")) { + concept.put(propertyName, object.get("default")); + } + if (object.has("mock") && object.get("mock").getAsJsonObject() != null && StringUtils.isNotEmpty(object.get("mock").getAsJsonObject().get("mock").getAsString())) { + String value = ScriptEngineUtils.calculate(object.get("mock").getAsJsonObject().get("mock").toString()); + concept.put(propertyName, value); + } + if (object.has("multipleOf")) { + + } + // Section 6.2.1 in json-schema-validation. Resolved as OCL + + if (object.has("maximum")) { + + } + // Section 6.2.2 in json-schema-validation. Resolved as OCL + + if (object.has("exclusiveMaximum")) { + + } + // Section 6.2.3 in json-schema-validation. Resolved as OCL + + if (object.has("minimum")) { + + } + // Section 6.2.4 in json-schema-validation. Resolved as OCL + + if (object.has("exclusiveMinimum")) { + + } + // Section 6.2.5 in json-schema-validation. Resolved as OCL + + } else if (propertyObjType.equals("boolean")) { + // 先设置空值 + concept.put(propertyName, false); + if (object.has("default")) { + concept.put(propertyName, object.get("default")); + } + if (object.has("mock") && object.get("mock").getAsJsonObject() != null && StringUtils.isNotEmpty(object.get("mock").getAsJsonObject().get("mock").getAsString())) { + String value = ScriptEngineUtils.calculate(object.get("mock").getAsJsonObject().get("mock").toString()); + concept.put(propertyName, value); + } + } else if (propertyObjType.equals("array")) { + // 先设置空值 + List array = new LinkedList<>(); + + JsonObject itemsObject = null; + if (object.has("items") && object.get("items").isJsonArray()) { + itemsObject = object.get("items").getAsJsonArray().get(0).getAsJsonObject(); + } else { + itemsObject = object.get("items").getAsJsonObject(); + } + + if (object.has("items")) { + if (itemsObject.has("enum")) { + array.add(analyzeEnumProperty(object)); + } else if (itemsObject.has("type") && itemsObject.get("type").getAsString().equals("string")) { + if (object.has("default")) { + array.add(object.get("default")); + } else if (object.has("mock") && object.get("mock").getAsJsonObject() != null && StringUtils.isNotEmpty(object.get("mock").getAsJsonObject().get("mock").getAsString())) { + String value = ScriptEngineUtils.calculate(object.get("mock").getAsJsonObject().get("mock").toString()); + array.add(object.get(value)); + } else { + array.add(null); + } + } else if (itemsObject.has("type") && itemsObject.get("type").getAsString().equals("number")) { + if (object.has("default")) { + array.add(object.get("default")); + } else if (object.has("mock") && object.get("mock").getAsJsonObject() != null && StringUtils.isNotEmpty(object.get("mock").getAsJsonObject().get("mock").getAsString())) { + String value = ScriptEngineUtils.calculate(object.get("mock").getAsJsonObject().get("mock").toString()); + array.add(object.get(value)); + } else { + array.add(0); + } + } else if (itemsObject.has("oneOf")) { + + } else if (itemsObject.has("anyOf")) { + + } else if (itemsObject.has("allOf")) { + // TODO + } else if (itemsObject.has("properties")) { + JSONObject propertyConcept = new JSONObject(); + JsonObject propertiesObj = itemsObject.get("properties").getAsJsonObject(); + for (Entry entry : propertiesObj.entrySet()) { + String propertyKey = entry.getKey(); + JsonObject propertyObj = propertiesObj.get(propertyKey).getAsJsonObject(); + analyzeProperty(propertyConcept, propertyKey, propertyObj); + } + array.add(propertyConcept); + + } else if (itemsObject.has("$ref")) { + analyzeRef(concept, propertyName, itemsObject); + } + } else if (object.has("items") && object.get("items").isJsonArray()) { + JsonArray itemsObjectArray = object.get("items").getAsJsonArray(); + array.add(itemsObjectArray); + } + + concept.put(propertyName, array); + + } else if (propertyObjType.equals("object")) { + JSONObject obj = new JSONObject(); + concept.put(propertyName, obj); + analyzeObject(object, obj); + } + } else if (object.has("$ref")) { + analyzeRef(concept, propertyName, object); + } else if (object.has("oneOf")) { + // Section 6.7.3 in json-schema-validation + + } else if (object.has("anyOf")) { + // Section 6.7.2 in json-schema-validation + + } + } + + private static List analyzeEnumProperty(JsonObject object) { + JsonArray enumValues = object.get("enum").getAsJsonArray(); + List list = new LinkedList<>(); + for (JsonElement enumValueElem : enumValues) { + String enumValue = enumValueElem.getAsString(); + list.add(enumValue); + } + return list; + } + + private static void analyzeRef(JSONObject concept, String propertyName, JsonObject object) { + String ref = object.get("$ref").getAsString(); + } + + private static void analyzeDefinitions(JsonObject object) { + JsonObject definitionsObj = object.get("definitions").getAsJsonObject(); + for (Entry entry : definitionsObj.entrySet()) { + String definitionKey = entry.getKey(); + JsonObject definitionObj = definitionsObj.get(definitionKey).getAsJsonObject(); + JSONObject obj = new JSONObject(); + analyzeRootSchemaElement(definitionObj, obj); + } + } + + private static final SyntaxValidator VALIDATOR = new SyntaxValidator(ValidationConfiguration.byDefault()); + + public static String getJson(String jsonSchema) { + if (StringUtils.isEmpty(jsonSchema)) { + return null; + } + try { + JsonNode jsonNode = JsonLoader.fromString(jsonSchema); + ProcessingReport report = VALIDATOR.validateSchema(jsonNode); + if (report.isSuccess()) { + JSONObject root = new JSONObject(); + generator(jsonSchema, root); + // 格式化返回 + Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create(); + return gson.toJson(root); + } else { + return report.getExceptionThreshold().toString(); + } + } catch (Exception ex) { + ex.printStackTrace(); + return ex.getMessage(); + } + } +} diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanApiCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanApiCaseService.java index 95eec7639d..fd83651fcf 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanApiCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanApiCaseService.java @@ -77,6 +77,9 @@ public class TestPlanApiCaseService { } public void deleteApiCaseBath(TestPlanApiCaseBatchRequest request) { + if (CollectionUtils.isEmpty(request.getIds())) { + return; + } apiDefinitionExecResultService.deleteByResourceIds(request.getIds()); TestPlanApiCaseExample example = new TestPlanApiCaseExample(); example.createCriteria() @@ -97,4 +100,11 @@ public class TestPlanApiCaseService { apiCase.setStatus(status); testPlanApiCaseMapper.updateByPrimaryKeySelective(apiCase); } + + public void deleteByRelevanceProjectIds(String planId, List relevanceProjectIds) { + TestPlanApiCaseBatchRequest request = new TestPlanApiCaseBatchRequest(); + request.setPlanId(planId); + request.setIds(extTestPlanApiCaseMapper.getNotRelevanceCaseIds(planId, relevanceProjectIds)); + deleteApiCaseBath(request); + } } diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanScenarioCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanScenarioCaseService.java index cee39a7677..683fe4cee1 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanScenarioCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanScenarioCaseService.java @@ -73,6 +73,9 @@ public class TestPlanScenarioCaseService { } public void deleteApiCaseBath(TestPlanApiCaseBatchRequest request) { + if (CollectionUtils.isEmpty(request.getIds())) { + return; + } TestPlanApiScenarioExample example = new TestPlanApiScenarioExample(); example.createCriteria() .andIdIn(request.getIds()); @@ -110,4 +113,11 @@ public class TestPlanScenarioCaseService { request.setIds(ids); deleteApiCaseBath(request); } + + public void deleteByRelevanceProjectIds(String planId, List relevanceProjectIds) { + TestPlanApiCaseBatchRequest request = new TestPlanApiCaseBatchRequest(); + request.setIds(extTestPlanScenarioCaseMapper.getNotRelevanceCaseIds(planId, relevanceProjectIds)); + request.setPlanId(planId); + deleteApiCaseBath(request); + } } diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanService.java index 72a403bc9b..d3d1959f1b 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanService.java @@ -10,7 +10,6 @@ import io.metersphere.api.dto.definition.ApiTestCaseRequest; import io.metersphere.api.dto.definition.TestPlanApiCaseDTO; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.*; -import io.metersphere.base.mapper.ext.ExtProjectMapper; import io.metersphere.base.mapper.ext.ExtTestCaseMapper; import io.metersphere.base.mapper.ext.ExtTestPlanMapper; import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper; @@ -27,7 +26,6 @@ import io.metersphere.notice.service.NoticeSendService; import io.metersphere.service.SystemParameterService; import io.metersphere.track.Factory.ReportComponentFactory; import io.metersphere.track.domain.ReportComponent; - import io.metersphere.track.dto.TestCaseReportMetricDTO; import io.metersphere.track.dto.TestPlanCaseDTO; import io.metersphere.track.dto.TestPlanDTO; @@ -69,8 +67,6 @@ public class TestPlanService { @Resource TestPlanTestCaseService testPlanTestCaseService; @Resource - ExtProjectMapper extProjectMapper; - @Resource TestCaseReportMapper testCaseReportMapper; @Resource TestPlanProjectMapper testPlanProjectMapper; @@ -229,6 +225,14 @@ public class TestPlanService { criteria.andCaseIdNotIn(caseIds); } testPlanTestCaseMapper.deleteByExample(testPlanTestCaseExample); + + List relevanceProjectIds = new ArrayList<>(); + relevanceProjectIds.add(testPlan.getProjectId()); + if (!CollectionUtils.isEmpty(testPlan.getProjectIds())) { + relevanceProjectIds.addAll(testPlan.getProjectIds()); + } + testPlanApiCaseService.deleteByRelevanceProjectIds(testPlan.getId(), relevanceProjectIds); + testPlanScenarioCaseService.deleteByRelevanceProjectIds(testPlan.getId(), relevanceProjectIds); } } diff --git a/frontend/package.json b/frontend/package.json index 0d52fe313f..181b934e95 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,9 +21,12 @@ "echarts": "^4.6.0", "el-table-infinite-scroll": "^1.0.10", "element-ui": "^2.13.0", + "generate-schema": "^2.6.0", "html2canvas": "^1.0.0-rc.7", "js-base64": "^3.4.4", "json-bigint": "^1.0.0", + "json-schema-faker": "^0.5.0-rcv.32", + "json5": "^2.1.3", "jsoneditor": "^9.1.2", "jspdf": "^2.1.1", "md5": "^2.3.0", diff --git a/frontend/src/business/components/api/automation/report/ApiReportList.vue b/frontend/src/business/components/api/automation/report/ApiReportList.vue index fb9ee71796..c9c2923042 100644 --- a/frontend/src/business/components/api/automation/report/ApiReportList.vue +++ b/frontend/src/business/components/api/automation/report/ApiReportList.vue @@ -108,7 +108,7 @@ export default { tableData: [], multipleSelection: [], currentPage: 1, - pageSize: 5, + pageSize: 10, total: 0, loading: false, currentProjectId: "", diff --git a/frontend/src/business/components/api/automation/scenario/ApiComponent.vue b/frontend/src/business/components/api/automation/scenario/ApiComponent.vue index 1763c431fa..918abd1d24 100644 --- a/frontend/src/business/components/api/automation/scenario/ApiComponent.vue +++ b/frontend/src/business/components/api/automation/scenario/ApiComponent.vue @@ -62,7 +62,7 @@

{{$t('api_test.definition.request.res_param')}}

- + diff --git a/frontend/src/business/components/api/definition/components/ApiVariable.vue b/frontend/src/business/components/api/definition/components/ApiVariable.vue index a30d16f3a1..5d2d77614b 100644 --- a/frontend/src/business/components/api/definition/components/ApiVariable.vue +++ b/frontend/src/business/components/api/definition/components/ApiVariable.vue @@ -1,5 +1,5 @@ diff --git a/frontend/src/business/components/api/definition/components/body/ApiBody.vue b/frontend/src/business/components/api/definition/components/body/ApiBody.vue index f03cca3cac..f442f28b21 100644 --- a/frontend/src/business/components/api/definition/components/body/ApiBody.vue +++ b/frontend/src/business/components/api/definition/components/body/ApiBody.vue @@ -1,5 +1,5 @@