diff --git a/backend/framework/sdk/src/main/java/io/metersphere/sdk/util/XMLUtils.java b/backend/framework/sdk/src/main/java/io/metersphere/sdk/util/XMLUtils.java index 9940a1586d..fbc9fcb724 100644 --- a/backend/framework/sdk/src/main/java/io/metersphere/sdk/util/XMLUtils.java +++ b/backend/framework/sdk/src/main/java/io/metersphere/sdk/util/XMLUtils.java @@ -17,10 +17,9 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class XMLUtils { public static final boolean IS_TRANS = false; @@ -142,4 +141,36 @@ public class XMLUtils { } return result; } + + /** + * 递归清空元素的文本内容 + */ + public static void clearElementText(Element element) { + // 清空当前元素的文本内容 + element.setText(StringUtils.EMPTY); + + // 递归处理子元素 + Iterator iterator = element.elementIterator(); + while (iterator.hasNext()) { + clearElementText(iterator.next()); + } + } + + /** + * 使用正则清空元素的文本内容 + */ + public static String clearElementText(String text) { + // 正则表达式匹配 XML 标签中的内容 + String regex = "(<[^<>]+>)([^<>]*)(]+>)"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(text); + + // 替换内容为空字符串 + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(result, matcher.group(1) + StringUtils.EMPTY + matcher.group(3)); + } + matcher.appendTail(result); + return result.toString(); + } } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiTestCaseController.java b/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiTestCaseController.java index 1938aa170c..4cbd49b661 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiTestCaseController.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiTestCaseController.java @@ -4,6 +4,7 @@ import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.metersphere.api.constants.ApiConstants; import io.metersphere.api.domain.ApiTestCase; +import io.metersphere.api.dto.ApiCaseCompareData; import io.metersphere.api.dto.ReferenceDTO; import io.metersphere.api.dto.ReferenceRequest; import io.metersphere.api.dto.definition.*; @@ -308,4 +309,12 @@ public class ApiTestCaseController { public void clearApiChange(@PathVariable String id) { apiTestCaseService.clearApiChange(id); } + + @GetMapping("/api/compare/{id}") + @Operation(summary = "与接口定义对比") + @RequiresPermissions(value = PermissionConstants.PROJECT_API_DEFINITION_CASE_READ) + @CheckOwner(resourceId = "#id", resourceType = "api_test_case") + public ApiCaseCompareData getApiCompareData(@PathVariable String id) { + return apiTestCaseService.getApiCompareData(id); + } } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/dto/ApiCaseCompareData.java b/backend/services/api-test/src/main/java/io/metersphere/api/dto/ApiCaseCompareData.java new file mode 100644 index 0000000000..ce32482ab7 --- /dev/null +++ b/backend/services/api-test/src/main/java/io/metersphere/api/dto/ApiCaseCompareData.java @@ -0,0 +1,14 @@ +package io.metersphere.api.dto; + +import io.metersphere.plugin.api.spi.MsTestElement; +import lombok.Data; + +/** + * @Author: jianxing + * @CreateTime: 2024-08-02 17:49 + */ +@Data +public class ApiCaseCompareData { + private MsTestElement apiRequest; + private MsTestElement caseRequest; +} diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java index 4ef46f4de4..5ab788dbe8 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java @@ -16,8 +16,6 @@ import org.apache.jmeter.protocol.http.util.HTTPFileArg; import java.io.File; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * @Author: jianxing @@ -80,29 +78,6 @@ public abstract class MsBodyConverter { return fileArg; } - /** - * 将文本中的 @xxx 转换成 ${__Mock(@xxx)} - * - * @param text - * @return - */ - protected String parseTextMock(String text) { - String pattern = "[\"\\s:]@[a-zA-Z\\\\(|,'-\\\\d ]*[a-zA-Z)-9),\\\\\"]"; - Pattern regex = Pattern.compile(pattern); - Matcher matcher = regex.matcher(text); - while (matcher.find()) { - //取出group的最后一个字符 主要是防止 @string|number 和 @string 这种情况 - //如果是 “ 或者, 结尾的 需要截取 - String group = matcher.group(); - if (group.endsWith(",") || group.endsWith("\"")) { - group = group.substring(0, group.length() - 1); - } - // 去掉第一个字符,因为第一个字符是 " : 或者空格 - group = group.substring(1, group.length()); - text = text.replace(group, StringUtils.join("${__Mock(", group.replace(",", "\\,"), ")}")); - } - return text; - } /** * 处理raw格式参数 * 包含了 json 等格式 diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java index 4405ad1c7a..3e7e6ff101 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java @@ -60,6 +60,30 @@ public class MsJsonBodyConverter extends MsBodyConverter { return jsonStr; } + /** + * 将文本中的 @xxx 转换成 ${__Mock(@xxx)} + * + * @param text + * @return + */ + protected String parseTextMock(String text) { + String pattern = "[\"\\s:]@[a-zA-Z\\\\(|,'-\\\\d ]*[a-zA-Z)-9),\\\\\"]"; + Pattern regex = Pattern.compile(pattern); + Matcher matcher = regex.matcher(text); + while (matcher.find()) { + //取出group的最后一个字符 主要是防止 @string|number 和 @string 这种情况 + //如果是 “ 或者, 结尾的 需要截取 + String group = matcher.group(); + if (group.endsWith(",") || group.endsWith("\"")) { + group = group.substring(0, group.length() - 1); + } + // 去掉第一个字符,因为第一个字符是 " : 或者空格 + group = group.substring(1, group.length()); + text = text.replace(group, StringUtils.join("${__Mock(", group.replace(",", "\\,"), ")}")); + } + return text; + } + private void parseMock(List list) { Map replaceDataMap = new HashMap<>(); for (int index = 0; index < list.size(); index++) { diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/service/ApiReportSendNoticeService.java b/backend/services/api-test/src/main/java/io/metersphere/api/service/ApiReportSendNoticeService.java index f33708aa6c..4a4cf2b686 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/service/ApiReportSendNoticeService.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/service/ApiReportSendNoticeService.java @@ -81,11 +81,11 @@ public class ApiReportSendNoticeService { ApiExecuteResourceType.API_SCENARIO.name(), ApiExecuteResourceType.TEST_PLAN_API_SCENARIO.name(), ApiExecuteResourceType.PLAN_RUN_API_SCENARIO.name())) { ApiScenario scenario = null; switch (ApiExecuteResourceType.valueOf(noticeDTO.getResourceType())) { - case ApiExecuteResourceType.API_SCENARIO -> + case API_SCENARIO -> scenario = apiScenarioMapper.selectByPrimaryKey(noticeDTO.getResourceId()); - case ApiExecuteResourceType.TEST_PLAN_API_SCENARIO -> + case TEST_PLAN_API_SCENARIO -> scenario = extApiScenarioMapper.getScenarioByResourceId(noticeDTO.getResourceId()); - case ApiExecuteResourceType.PLAN_RUN_API_SCENARIO -> + case PLAN_RUN_API_SCENARIO -> scenario = extApiScenarioMapper.getScenarioByReportId(noticeDTO.getResourceId()); default -> { } @@ -109,11 +109,11 @@ public class ApiReportSendNoticeService { ApiExecuteResourceType.API_CASE.name(), ApiExecuteResourceType.TEST_PLAN_API_CASE.name(), ApiExecuteResourceType.PLAN_RUN_API_CASE.name())) { ApiTestCase testCase = null; switch (ApiExecuteResourceType.valueOf(noticeDTO.getResourceType())) { - case ApiExecuteResourceType.API_CASE -> + case API_CASE -> testCase = apiTestCaseMapper.selectByPrimaryKey(noticeDTO.getResourceId()); - case ApiExecuteResourceType.TEST_PLAN_API_CASE -> + case TEST_PLAN_API_CASE -> testCase = extApiTestCaseMapper.getCaseByResourceId(noticeDTO.getResourceId()); - case ApiExecuteResourceType.PLAN_RUN_API_CASE -> + case PLAN_RUN_API_CASE -> testCase = extApiTestCaseMapper.getCaseByReportId(noticeDTO.getResourceId()); default -> { } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiTestCaseService.java b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiTestCaseService.java index c0fb63d822..5566fa34c3 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiTestCaseService.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiTestCaseService.java @@ -7,6 +7,7 @@ import io.metersphere.api.dto.debug.ApiFileResourceUpdateRequest; import io.metersphere.api.dto.debug.ApiResourceRunRequest; import io.metersphere.api.dto.definition.*; import io.metersphere.api.dto.request.ApiTransferRequest; +import io.metersphere.api.dto.request.http.MsHTTPElement; import io.metersphere.api.mapper.*; import io.metersphere.api.service.ApiCommonService; import io.metersphere.api.service.ApiExecuteService; @@ -241,14 +242,14 @@ public class ApiTestCaseService extends MoveNodeService { example.createCriteria().andCaseIdEqualTo(id).andUserIdEqualTo(userId); List followers = apiTestCaseFollowerMapper.selectByExample(example); apiTestCaseDTO.setFollow(CollectionUtils.isNotEmpty(followers)); - AbstractMsTestElement msTestElement = ApiDataUtils.parseObject(new String(testCaseBlob.getRequest()), AbstractMsTestElement.class); + AbstractMsTestElement msTestElement = getTestElement(testCaseBlob); apiCommonService.setLinkFileInfo(id, msTestElement); apiCommonService.setEnableCommonScriptProcessorInfo(msTestElement); apiCommonService.setApiDefinitionExecuteInfo(msTestElement, apiDefinition); apiTestCaseDTO.setRequest(msTestElement); ApiDefinitionBlob apiDefinitionBlob = apiDefinitionBlobMapper.selectByPrimaryKey(apiDefinition.getId()); - AbstractMsTestElement apiMsTestElement = ApiDataUtils.parseObject(new String(apiDefinitionBlob.getRequest()), AbstractMsTestElement.class); + AbstractMsTestElement apiMsTestElement = getApiMsTestElement(apiDefinitionBlob); apiTestCaseDTO.setInconsistentWithApi(HttpRequestParamDiffUtils.isRequestParamDiff(apiMsTestElement, msTestElement)); return apiTestCaseDTO; } @@ -649,7 +650,7 @@ public class ApiTestCaseService extends MoveNodeService { if (apiTestCaseBlob == null) { return; } - AbstractMsTestElement msTestElement = ApiDataUtils.parseObject(new String(apiTestCaseBlob.getRequest()), AbstractMsTestElement.class); + AbstractMsTestElement msTestElement = getTestElement(apiTestCaseBlob); // 获取接口中需要更新的文件 List updateFiles = apiCommonService.getApiFilesByFileId(originFileAssociation.getFileId(), msTestElement); // 替换文件的Id和name @@ -695,7 +696,7 @@ public class ApiTestCaseService extends MoveNodeService { ApiTestCaseBlob apiTestCaseBlob = apiTestCaseBlobMapper.selectByPrimaryKey(id); ApiResourceRunRequest runRequest = new ApiResourceRunRequest(); - runRequest.setTestElement(ApiDataUtils.parseObject(new String(apiTestCaseBlob.getRequest()), AbstractMsTestElement.class)); + runRequest.setTestElement(getTestElement(apiTestCaseBlob)); return executeRun(runRequest, apiTestCase, reportId, userId); } @@ -784,7 +785,7 @@ public class ApiTestCaseService extends MoveNodeService { apiParamConfig.setRetryOnFail(request.getRunModeConfig().getRetryOnFail()); apiParamConfig.setRetryConfig(request.getRunModeConfig().getRetryConfig()); - AbstractMsTestElement msTestElement = ApiDataUtils.parseObject(new String(apiTestCaseBlob.getRequest()), AbstractMsTestElement.class); + AbstractMsTestElement msTestElement = getTestElement(apiTestCaseBlob); // 设置 method 等信息 apiCommonService.setApiDefinitionExecuteInfo(msTestElement, BeanUtils.copyBean(new ApiDefinitionExecuteInfo(), apiDefinition)); @@ -951,4 +952,30 @@ public class ApiTestCaseService extends MoveNodeService { apiTestCase.setApiChange(false); apiTestCaseMapper.updateByPrimaryKeySelective(apiTestCase); } + + public ApiCaseCompareData getApiCompareData(String id) { + ApiTestCase apiTestCase = checkResourceExist(id); + ApiDefinition apiDefinition = getApiDefinition(apiTestCase.getApiDefinitionId()); + ApiDefinitionBlob apiDefinitionBlob = apiDefinitionBlobMapper.selectByPrimaryKey(apiDefinition.getId()); + AbstractMsTestElement apiMsTestElement = getApiMsTestElement(apiDefinitionBlob); + ApiTestCaseBlob apiTestCaseBlob = apiTestCaseBlobMapper.selectByPrimaryKey(id); + AbstractMsTestElement apiTestCaseMsTestElement = getTestElement(apiTestCaseBlob); + // 其他协议不处理 + if (apiMsTestElement instanceof MsHTTPElement apiHttpTestElement && apiTestCaseMsTestElement instanceof MsHTTPElement apiCaseHttpTestElement) { + apiMsTestElement = HttpRequestParamDiffUtils.getCompareHttpElement(apiHttpTestElement); + apiTestCaseMsTestElement = HttpRequestParamDiffUtils.getCompareHttpElement(apiCaseHttpTestElement); + } + ApiCaseCompareData apiCaseCompareData = new ApiCaseCompareData(); + apiCaseCompareData.setApiRequest(apiMsTestElement); + apiCaseCompareData.setCaseRequest(apiTestCaseMsTestElement); + return apiCaseCompareData; + } + + private AbstractMsTestElement getApiMsTestElement(ApiDefinitionBlob apiDefinitionBlob) { + return ApiDataUtils.parseObject(new String(apiDefinitionBlob.getRequest()), AbstractMsTestElement.class); + } + + private AbstractMsTestElement getTestElement(ApiTestCaseBlob apiTestCaseBlob) { + return ApiDataUtils.parseObject(new String(apiTestCaseBlob.getRequest()), AbstractMsTestElement.class); + } } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/utils/HttpRequestParamDiffUtils.java b/backend/services/api-test/src/main/java/io/metersphere/api/utils/HttpRequestParamDiffUtils.java index d207c1f781..1d3c2081d1 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/utils/HttpRequestParamDiffUtils.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/utils/HttpRequestParamDiffUtils.java @@ -4,13 +4,18 @@ import io.metersphere.api.dto.request.http.MsHTTPElement; import io.metersphere.api.dto.request.http.body.Body; import io.metersphere.api.dto.request.http.body.JsonBody; import io.metersphere.api.dto.request.http.body.XmlBody; +import io.metersphere.plugin.api.spi.AbstractMsTestElement; import io.metersphere.project.api.KeyValueParam; import io.metersphere.sdk.util.EnumValidator; import io.metersphere.sdk.util.JSON; +import io.metersphere.sdk.util.LogUtils; import io.metersphere.sdk.util.XMLUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.dom4j.Element; +import org.dom4j.io.XMLWriter; +import java.io.StringWriter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -81,6 +86,7 @@ public class HttpRequestParamDiffUtils { Object json2 = JSON.parseObject(jsonValue2); return !getBlankJon(json1).equals(getBlankJon(json2)); } catch (Exception e) { + LogUtils.info("json 解析异常,json1: {}, json2: {}", jsonValue1, jsonValue2); return !getJsonKeys(jsonValue1).equals(getJsonKeys(jsonValue2)); } } @@ -163,4 +169,64 @@ public class HttpRequestParamDiffUtils { .collect(Collectors.toSet()); return !keSet1.equals(keSet2); } + + /** + * 将 json 和 xml 属性值置空 + * 便于前端比较差异 + * @param httpElement + * @return + */ + public static AbstractMsTestElement getCompareHttpElement(MsHTTPElement httpElement) { + Body body = httpElement.getBody(); + if (body == null) { + return httpElement; + } + if (StringUtils.equals(body.getBodyType(), Body.BodyType.JSON.name())) { + try { + String jsonValue = body.getJsonBody().getJsonValue(); + jsonValue = replaceIllegalJsonWithMock(jsonValue); + Object blankJon = getBlankJon(JSON.parseObject(jsonValue)); + body.getJsonBody().setJsonValue(JSON.toJSONString(blankJon)); + } catch (Exception e) { + LogUtils.info("json 解析异常,json: {}", body.getJsonBody().getJsonValue()); + } + } + if (StringUtils.equals(body.getBodyType(), Body.BodyType.XML.name())) { + String xml = body.getXmlBody().getValue(); + try { + Element element = XMLUtils.stringToDocument(xml).getRootElement(); + XMLUtils.clearElementText(element); + StringWriter stringWriter = new StringWriter(); + XMLWriter writer = new XMLWriter(stringWriter); + writer.write(element); + xml = stringWriter.toString(); + } catch (Exception e) { + LogUtils.info("xml 解析异常,xml: {}", body.getXmlBody().getValue()); + xml = XMLUtils.clearElementText(xml); + } + body.getXmlBody().setValue(xml); + } + return httpElement; + } + + /** + * 如果 json 串中包含了非字符串的 mock 函数 + * 例如: + * {"a": @integer(1, 2)} + * 替换成空字符串 + * {"a": ""} + * 避免 json 序列化失败 + * @param text + * @return + */ + public static String replaceIllegalJsonWithMock(String text) { + String pattern = ":\\s*(@\\w+(\\(\\s*\\w*\\s*,?\\s*\\w*\\s*\\))*)"; + Pattern regex = Pattern.compile(pattern); + Matcher matcher = regex.matcher(text); + while (matcher.find()) { + // 这里连同:一起替换,避免替换了其他合规的参数值 + text = text.replaceFirst(pattern, ":\"\""); + } + return text; + } } diff --git a/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiTestCaseControllerTests.java b/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiTestCaseControllerTests.java index 52b46cba81..6142205c47 100644 --- a/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiTestCaseControllerTests.java +++ b/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiTestCaseControllerTests.java @@ -110,7 +110,8 @@ public class ApiTestCaseControllerTests extends BaseTest { private static final String RUN_GET = "run/{0}"; private static final String RUN_POST = "run"; private static final String BATCH_RUN = "batch/run"; - private static final String API_CHANGE_CLEAR = "api-change/clear/{id}"; + private static final String API_CHANGE_CLEAR = "api-change/clear/{0}"; + private static final String API_COMPARE = "api/compare/{0}"; private static final ResultMatcher ERROR_REQUEST_MATCHER = status().is5xxServerError(); private static ApiTestCase apiTestCase; @@ -438,6 +439,18 @@ public class ApiTestCaseControllerTests extends BaseTest { Assertions.assertEquals(apiTestCaseMapper.selectByPrimaryKey(apiTestCase.getId()).getApiChange(), true); } + @Test + @Order(3) + public void getApiCompareData() throws Exception { + // @@请求成功 + MvcResult mvcResult = this.requestGetWithOkAndReturn(API_COMPARE, apiTestCase.getId()); + Map apiCaseCompareData = (Map) parseResponse(mvcResult).get("data"); + Assertions.assertNotNull(apiCaseCompareData.get("apiRequest")); + Assertions.assertNotNull(apiCaseCompareData.get("caseRequest")); + // @@校验权限 + requestGetPermissionTest(PermissionConstants.PROJECT_API_DEFINITION_CASE_READ, API_COMPARE, apiTestCase.getId()); + } + @Test @Order(3) public void clearApiChange() throws Exception { diff --git a/backend/services/api-test/src/test/java/io/metersphere/api/utils/HttpRequestParamDiffUtilsTests.java b/backend/services/api-test/src/test/java/io/metersphere/api/utils/HttpRequestParamDiffUtilsTests.java index a21030000c..812204fba8 100644 --- a/backend/services/api-test/src/test/java/io/metersphere/api/utils/HttpRequestParamDiffUtilsTests.java +++ b/backend/services/api-test/src/test/java/io/metersphere/api/utils/HttpRequestParamDiffUtilsTests.java @@ -7,9 +7,13 @@ import io.metersphere.api.dto.request.http.RestParam; import io.metersphere.api.dto.request.http.body.*; import io.metersphere.project.api.KeyValueParam; import io.metersphere.sdk.util.JSON; +import io.metersphere.sdk.util.XMLUtils; +import org.dom4j.Element; +import org.dom4j.io.XMLWriter; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.io.StringWriter; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -332,4 +336,148 @@ public class HttpRequestParamDiffUtilsTests { msHTTPElement1.setBody(new Body()); Assertions.assertTrue(HttpRequestParamDiffUtils.isRequestParamDiff(msHTTPElement1, msHTTPElement2)); } + + @Test + public void replaceIllegalJsonWithMock() { + String replaceJon = HttpRequestParamDiffUtils.replaceIllegalJsonWithMock(""" + { + "id": "dddd", + "age": 10, + "name": @integer(1, 10), + "category": { + "id":@integer(1), + "name": @integer, + "title": @integer(1, 10) + } + } + """); + + Object result = JSON.parseObject(""" + { + "id": "dddd", + "age": 10, + "name": "", + "category": { + "id": "", + "name": "", + "title": "" + } + }"""); + + Assertions.assertEquals(JSON.parseObject(replaceJon), result); + } + + @Test + public void clearElementText() throws Exception { + String xml = """ + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.8 + + + + """; + + Element element = XMLUtils.stringToDocument(xml).getRootElement(); + XMLUtils.clearElementText(element); + StringWriter stringWriter = new StringWriter(); + XMLWriter writer = new XMLWriter(stringWriter); + writer.write(element); + stringWriter.toString(); + + String result = """ + """; + + Assertions.assertEquals(stringWriter.toString(), result); + + + String regexResult = """ + + + + + + + + + """; + Assertions.assertEquals(XMLUtils.clearElementText(xml), regexResult); + } + + @Test + public void getCompareHttpElement() { + MsHTTPElement msHTTPElement = new MsHTTPElement(); + HttpRequestParamDiffUtils.getCompareHttpElement(msHTTPElement); + + msHTTPElement.setBody(new Body()); + Body body = msHTTPElement.getBody(); + body.setJsonBody(new JsonBody()); + body.setBodyType(Body.BodyType.RAW.name()); + HttpRequestParamDiffUtils.getCompareHttpElement(msHTTPElement); + + body.setBodyType(Body.BodyType.JSON.name()); + String jsonValue = """ + { + "id": "dddd", + "age": 10, + "name": @integer(1, 10), + "category": { + "id":@integer(1), + "name": @integer, + "title": @integer(1, 10) + } + } + """; + body.getJsonBody().setJsonValue(jsonValue); + HttpRequestParamDiffUtils.getCompareHttpElement(msHTTPElement); + Assertions.assertEquals(JSON.parseObject(body.getJsonBody().getJsonValue()), JSON.parseObject(""" + { + "id": "", + "age": "", + "name": "", + "category": { + "id": "", + "name": "", + "title": "" + } + } + """)); + + String xmlValue = """ + + 4.0.0 + + org + spring + 3.2.8 + + + + """; + msHTTPElement.getBody().setBodyType(Body.BodyType.XML.name()); + body.setXmlBody(new XmlBody()); + body.getXmlBody().setValue(xmlValue); + HttpRequestParamDiffUtils.getCompareHttpElement(msHTTPElement); + + + xmlValue = """ + dx + + 4.0.0 + + org + spring + 3.2.8 + + + + """; + body.getXmlBody().setValue(xmlValue); + HttpRequestParamDiffUtils.getCompareHttpElement(msHTTPElement); + } }