fix(项目设置): 修改环境配置-全局断言中json文档断言添加失败的缺陷

--bug=1019018 --user=宋天阳 [项目设置]项目环境-编辑项目环境-全局断言添加文档结果校验json格式失败
https://www.tapd.cn/55049933/s/1280284
This commit is contained in:
song-tianyang 2022-10-27 15:36:20 +08:00 committed by 刘瑞斌
parent 55401c04b3
commit f8ad0fb0a8
13 changed files with 48 additions and 39 deletions

View File

@ -246,14 +246,14 @@ export default {
this.environment.config.authManager.hashTree = []; this.environment.config.authManager.hashTree = [];
} }
if (!this.environment.config.assertions) { if (!this.environment.config.assertions) {
this.environment.config.assertions = { this.$set(this.environment.config, 'assertions', {
duration: {duration: 0}, duration: {duration: 0},
regex: [], regex: [],
jsonPath: [], jsonPath: [],
xpath2: [], xpath2: [],
jsr223: [], jsr223: [],
document: {type: "json", data: {json: [], xml: []}}, document: {type: "JSON", data: {json: [], xml: []}},
}; });
} }
}, },
@ -295,14 +295,14 @@ export default {
this.environment.config.authManager.hashTree = []; this.environment.config.authManager.hashTree = [];
} }
if (!this.environment.config.assertions) { if (!this.environment.config.assertions) {
this.environment.config.assertions = { this.$set(this.environment.config, 'assertions', {
duration: {duration: 0}, duration: {duration: 0},
regex: [], regex: [],
jsonPath: [], jsonPath: [],
xpath2: [], xpath2: [],
jsr223: [], jsr223: [],
document: {type: "json", data: {json: [], xml: []}}, document: {type: "JSON", data: {json: [], xml: []}},
}; });
} }
this.isRefresh = false; this.isRefresh = false;

View File

@ -10,9 +10,11 @@
</el-col> </el-col>
<el-col class="assertion-btn"> <el-col class="assertion-btn">
<el-tooltip :content="$t('test_resource_pool.enable_disable')" placement="top" v-if="edit"> <el-tooltip :content="$t('test_resource_pool.enable_disable')" placement="top" v-if="edit">
<el-switch v-model="duration.enable" class="enable-switch" size="mini" :disabled="isReadOnly" style="width: 30px;margin-right: 10px"/> <el-switch v-model="duration.enable" class="enable-switch" size="mini" :disabled="isReadOnly"
style="width: 30px;margin-right: 10px"/>
</el-tooltip> </el-tooltip>
<el-button :disabled="isReadOnly" type="danger" size="mini" icon="el-icon-delete" circle @click="remove" v-if="edit"/> <el-button :disabled="isReadOnly" type="danger" size="mini" icon="el-icon-delete" circle @click="remove"
v-if="edit"/>
<el-button :disabled="isReadOnly" type="primary" size="mini" @click="add" v-else> <el-button :disabled="isReadOnly" type="primary" size="mini" @click="add" v-else>
{{ $t('api_test.request.assertions.add') }} {{ $t('api_test.request.assertions.add') }}
</el-button> </el-button>
@ -71,7 +73,7 @@ export default {
<style scoped> <style scoped>
.assertion-btn { .assertion-btn {
text-align: center; text-align: right;
width: 80px; width: 180px;
} }
</style> </style>

View File

@ -27,9 +27,11 @@
</el-col> </el-col>
<el-col class="assertion-btn"> <el-col class="assertion-btn">
<el-tooltip :content="$t('test_resource_pool.enable_disable')" placement="top" v-if="edit"> <el-tooltip :content="$t('test_resource_pool.enable_disable')" placement="top" v-if="edit">
<el-switch v-model="jsonPath.enable" class="enable-switch" size="mini" :disabled="isReadOnly" style="width: 30px;margin-right: 10px"/> <el-switch v-model="jsonPath.enable" class="enable-switch" size="mini" :disabled="isReadOnly"
style="width: 30px;margin-right: 10px"/>
</el-tooltip> </el-tooltip>
<el-button :disabled="isReadOnly" type="danger" size="mini" icon="el-icon-delete" circle @click="remove" v-if="edit"/> <el-button :disabled="isReadOnly" type="danger" size="mini" icon="el-icon-delete" circle @click="remove"
v-if="edit"/>
<el-button :disabled="isReadOnly" type="primary" size="mini" @click="add" v-else> <el-button :disabled="isReadOnly" type="primary" size="mini" @click="add" v-else>
{{ $t('api_test.request.assertions.add') }} {{ $t('api_test.request.assertions.add') }}
</el-button> </el-button>
@ -124,7 +126,7 @@ export default {
} }
.assertion-btn { .assertion-btn {
text-align: center; text-align: right;
width: 80px; width: 180px;
} }
</style> </style>

View File

@ -116,7 +116,7 @@ export default {
} }
.assertion-btn { .assertion-btn {
text-align: center; text-align: right;
width: 180px; width: 180px;
} }
</style> </style>

View File

@ -7,9 +7,11 @@
</el-col> </el-col>
<el-col class="assertion-btn"> <el-col class="assertion-btn">
<el-tooltip :content="$t('test_resource_pool.enable_disable')" placement="top" v-if="edit"> <el-tooltip :content="$t('test_resource_pool.enable_disable')" placement="top" v-if="edit">
<el-switch v-model="xPath2.enable" class="enable-switch" size="mini" :disabled="isReadOnly" style="width: 30px;margin-right:10px"/> <el-switch v-model="xPath2.enable" class="enable-switch" size="mini" :disabled="isReadOnly"
style="width: 30px;margin-right:10px"/>
</el-tooltip> </el-tooltip>
<el-button :disabled="isReadOnly" type="danger" size="mini" icon="el-icon-delete" circle @click="remove" v-if="edit"/> <el-button :disabled="isReadOnly" type="danger" size="mini" icon="el-icon-delete" circle @click="remove"
v-if="edit"/>
<el-button :disabled="isReadOnly" type="primary" size="mini" @click="add" v-else> <el-button :disabled="isReadOnly" type="primary" size="mini" @click="add" v-else>
{{ $t('api_test.request.assertions.add') }} {{ $t('api_test.request.assertions.add') }}
</el-button> </el-button>
@ -60,7 +62,7 @@ export default {
<style scoped> <style scoped>
.assertion-btn { .assertion-btn {
text-align: center; text-align: right;
width: 80px; width: 180px;
} }
</style> </style>

View File

@ -116,7 +116,7 @@ export default {
computed: { computed: {
isShow() { isShow() {
let rt = this.assertions.duration; let rt = this.assertions.duration;
return rt.value && rt.value !== 0; return rt.value && rt.value !== 0;
}, },
isDocument() { isDocument() {
return this.assertions.document && this.assertions.document.data && (this.assertions.document.data.json.length > 0 || this.assertions.document.data.xml.length > 0); return this.assertions.document && this.assertions.document.data && (this.assertions.document.data.json.length > 0 || this.assertions.document.data.xml.length > 0);
@ -176,7 +176,7 @@ export default {
} }
.assertion-remove-btn { .assertion-remove-btn {
text-align: center; text-align: right;
width: 80px; width: 180px;
} }
</style> </style>

View File

@ -38,7 +38,7 @@
</template> </template>
<script> <script>
import {Regex, ASSERTION_REGEX_SUBJECT} from "../../../model/ApiTestModel"; import {ASSERTION_REGEX_SUBJECT, Regex} from "../../../model/ApiTestModel";
export default { export default {
name: "MsApiAssertionText", name: "MsApiAssertionText",
@ -123,6 +123,6 @@ export default {
} }
.assertion-btn { .assertion-btn {
width: 60px; width: 180px;
} }
</style> </style>

View File

@ -37,7 +37,7 @@ export default {
methods: { methods: {
add() { add() {
let obj = new AssertionDocument({id: "root"}); let obj = new AssertionDocument({id: "root"});
if (this.document.type === "JSON" && this.document.data.json.length === 0) { if (this.document.type === "JSON" || this.document.type === "json" && this.document.data.json.length === 0) {
this.document.data.json.push(obj); this.document.data.json.push(obj);
} }
if (this.document.type === "XML" && this.document.data.xml.length === 0) { if (this.document.type === "XML" && this.document.data.xml.length === 0) {
@ -62,7 +62,7 @@ export default {
<style scoped> <style scoped>
.assertion-btn { .assertion-btn {
text-align: center; text-align: right;
width: 60px; width: 180px;
} }
</style> </style>

View File

@ -112,9 +112,7 @@
<script> <script>
import { import {getCurrentProjectID, getCurrentUserId} from "metersphere-frontend/src/utils/token";
getCurrentProjectID, getCurrentUserId
} from "metersphere-frontend/src/utils/token";
import {listenGoBack, removeGoBackListener} from "metersphere-frontend/src/utils"; import {listenGoBack, removeGoBackListener} from "metersphere-frontend/src/utils";
import MsFormDivider from "metersphere-frontend/src/components/MsFormDivider"; import MsFormDivider from "metersphere-frontend/src/components/MsFormDivider";
import {ASSERTION_REGEX_SUBJECT, ASSERTION_TYPE, Regex} from "metersphere-frontend/src/model/ApiTestModel"; import {ASSERTION_REGEX_SUBJECT, ASSERTION_TYPE, Regex} from "metersphere-frontend/src/model/ApiTestModel";
@ -154,7 +152,7 @@ export default {
jsonPath: [], jsonPath: [],
xpath2: [], xpath2: [],
jsr223: [], jsr223: [],
document: {type: "json", data: {json: [], xml: []}}, document: {type: "JSON", data: {json: [], xml: []}},
}, },
}, },
rules: { rules: {

View File

@ -54,6 +54,6 @@ public class HistoryReportController {
@PostMapping("/selectById") @PostMapping("/selectById")
public ReportStatisticsWithBLOBs selectById(@RequestBody ReportStatisticsSaveRequest request) { public ReportStatisticsWithBLOBs selectById(@RequestBody ReportStatisticsSaveRequest request) {
return reportStatisticsService.selectById(request.getId()); return reportStatisticsService.selectById(request.getId(), false);
} }
} }

View File

@ -18,6 +18,6 @@ public class ReportStatShareController {
@PostMapping("/select/report/by/id") @PostMapping("/select/report/by/id")
public ReportStatisticsWithBLOBs selectById(@RequestBody ReportStatisticsSaveRequest request) { public ReportStatisticsWithBLOBs selectById(@RequestBody ReportStatisticsSaveRequest request) {
return reportStatisticsService.selectById(request.getId()); return reportStatisticsService.selectById(request.getId(), true);
} }
} }

View File

@ -476,7 +476,7 @@ public class EnterpriseTestReportService {
List<ReportStatisticsWithBLOBs> bloBsList = new ArrayList<>(); List<ReportStatisticsWithBLOBs> bloBsList = new ArrayList<>();
for (EnterpriseReportContentStep step : stepList) { for (EnterpriseReportContentStep step : stepList) {
//定时任务触发的数据需要检查图片是否需要重新生成 //定时任务触发的数据需要检查图片是否需要重新生成
ReportStatisticsWithBLOBs reportStatisticsWithBLOBs = reportStatisticsService.selectById(step.getReportRecordId()); ReportStatisticsWithBLOBs reportStatisticsWithBLOBs = reportStatisticsService.selectById(step.getReportRecordId(), false);
if (reportStatisticsWithBLOBs != null) { if (reportStatisticsWithBLOBs != null) {
boolean needSyncImage = reportStatisticsService.isReportNeedUpdate(reportStatisticsWithBLOBs); boolean needSyncImage = reportStatisticsService.isReportNeedUpdate(reportStatisticsWithBLOBs);
if (needSyncImage) { if (needSyncImage) {

View File

@ -4,10 +4,7 @@ import io.metersphere.base.domain.ReportStatistics;
import io.metersphere.base.domain.ReportStatisticsExample; import io.metersphere.base.domain.ReportStatisticsExample;
import io.metersphere.base.domain.ReportStatisticsWithBLOBs; import io.metersphere.base.domain.ReportStatisticsWithBLOBs;
import io.metersphere.base.mapper.ReportStatisticsMapper; import io.metersphere.base.mapper.ReportStatisticsMapper;
import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.*;
import io.metersphere.commons.utils.JSON;
import io.metersphere.commons.utils.LogUtil;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.dto.BaseSystemConfigDTO; import io.metersphere.dto.BaseSystemConfigDTO;
import io.metersphere.reportstatistics.dto.*; import io.metersphere.reportstatistics.dto.*;
import io.metersphere.reportstatistics.dto.charts.Series; import io.metersphere.reportstatistics.dto.charts.Series;
@ -74,11 +71,16 @@ public class ReportStatisticsService {
return reportStatisticsMapper.deleteByPrimaryKey(id); return reportStatisticsMapper.deleteByPrimaryKey(id);
} }
public ReportStatisticsWithBLOBs selectById(String id) { public ReportStatisticsWithBLOBs selectById(String id, boolean isRemoteRequest) {
ReportStatisticsWithBLOBs blob = reportStatisticsMapper.selectByPrimaryKey(id); ReportStatisticsWithBLOBs blob = reportStatisticsMapper.selectByPrimaryKey(id);
if (blob == null) { if (blob == null) {
return null; return null;
} }
if (isRemoteRequest) {
//通过接口进行的请求时没有session的
HttpHeaderUtils.runAsUser(blob.getCreateUser());
}
Map<String, Object> selectOption = JSON.parseObject(blob.getSelectOption(), Map.class); Map<String, Object> selectOption = JSON.parseObject(blob.getSelectOption(), Map.class);
Map<String, Object> dataOption = JSON.parseObject(blob.getDataOption(), Map.class); Map<String, Object> dataOption = JSON.parseObject(blob.getDataOption(), Map.class);
boolean isReportNeedUpdate = this.isReportNeedUpdate(blob); boolean isReportNeedUpdate = this.isReportNeedUpdate(blob);
@ -90,6 +92,9 @@ public class ReportStatisticsService {
} }
} }
if (isRemoteRequest) {
HttpHeaderUtils.clearUser();
}
if (!dataOption.containsKey("showTable")) { if (!dataOption.containsKey("showTable")) {
if (dataOption.get("tableData") != null) { if (dataOption.get("tableData") != null) {
String tableDataJsonStr = JSON.toJSONString(dataOption.get("tableData")); String tableDataJsonStr = JSON.toJSONString(dataOption.get("tableData"));