fix:main,js 添加组动化测试 ,缓存topology 图片 只请求一次

This commit is contained in:
zhangyu
2022-04-19 11:54:15 +08:00
parent 99d31e2059
commit 2efb5dccb6
13 changed files with 138 additions and 23 deletions

View File

@@ -24,6 +24,11 @@ For a detailed explanation on how things work, check out the [guide](http://vuej
需要配置 config.json 为 {"baseUrl":"http://192.168.40.42:8080/", "version": "21.04"} 需要配置 config.json 为 {"baseUrl":"http://192.168.40.42:8080/", "version": "21.04"}
#自动化测试
npm run unit
根目录下 /test/jest.conf.js collectCoverageFrom 变量配置需要测试报告的文件 (因为暂时不测所有 只能一个个引入)
specs 配置对应的测试用例 https://docs.geedge.net/pages/viewpage.action?pageId=58310079 参考匹配器)
#思维导图 #思维导图
https://docs.geedge.net/pages/viewpage.action?pageId=67209306 https://docs.geedge.net/pages/viewpage.action?pageId=67209306

View File

@@ -145,7 +145,6 @@ export default {
} }
}, },
handleLegendAlias (legend, aliasExpression) { handleLegendAlias (legend, aliasExpression) {
console.log(legend, aliasExpression)
if (/\{\{.+\}\}/.test(aliasExpression)) { if (/\{\{.+\}\}/.test(aliasExpression)) {
const labelValue = aliasExpression.replace(/(\{\{.+?\}\})/g, function (i) { const labelValue = aliasExpression.replace(/(\{\{.+?\}\})/g, function (i) {
const label = i.substr(i.indexOf('{{') + 2, i.indexOf('}}') - i.indexOf('{{') - 2) const label = i.substr(i.indexOf('{{') + 2, i.indexOf('}}') - i.indexOf('{{') - 2)
@@ -294,7 +293,6 @@ export default {
} }
}, },
mounted () { mounted () {
this.chartId = `${this.chartInfo.id}${this.isFullscreen ? '-fullscreen' : ''}` this.chartId = `${this.chartInfo.id}${this.isFullscreen ? '-fullscreen' : ''}`
}, },
beforeDestroy () { beforeDestroy () {

View File

@@ -34,6 +34,7 @@ export function getHexagon (key) {
const topologyCache = {} const topologyCache = {}
export function getTopology (key) { export function getTopology (key) {
// console.log(topologyCache, 'topologyCache')
return topologyCache[`topology${key}`] return topologyCache[`topology${key}`]
} }
@@ -41,6 +42,18 @@ export function setTopology (key, value) {
topologyCache[`topology${key}`] = value topologyCache[`topology${key}`] = value
} }
// const topologyImgList = localStorage.getItem('nz-imgList') ? JSON.parse(localStorage.getItem('nz-imgList')) : {}
export function getTopologyImg (key) {
// console.log(topologyCache, 'topologyCache')
// console.log(localStorage.getItem('nz-img-' + key), !localStorage.getItem('nz-img-' + key))
return localStorage.getItem('nz-img-' + key)
}
export function setTopologyImg (key, img) {
localStorage.setItem('nz-img-' + key, img)
}
export function setHexagon (key, value) { export function setHexagon (key, value) {
hexagonCache[`hexagon${key}`] = value hexagonCache[`hexagon${key}`] = value
} }

View File

@@ -351,7 +351,7 @@ import {
myCubec, myCubec,
myCubeAnchors myCubeAnchors
} from './L5/services/canvas.js' } from './L5/services/canvas.js'
import { getTopology, setTopology } from '../js/common' import { getTopology, setTopology, getTopologyImg, setTopologyImg } from '../js/common'
import CanvasProps from './L5/CanvasProps' import CanvasProps from './L5/CanvasProps'
import topologyTopTool from './L5//topologyTopTool' import topologyTopTool from './L5//topologyTopTool'
import CanvasContextMenu from './L5/CanvasContextMenu' import CanvasContextMenu from './L5/CanvasContextMenu'
@@ -1723,13 +1723,21 @@ export default {
res.data.list.forEach((item, index) => { res.data.list.forEach((item, index) => {
item.imageName = item.name item.imageName = item.name
delete item.name delete item.name
if (getTopologyImg(item.id)) {
promiseArr.push(getTopologyImg(item.id))
} else {
promiseArr.push(this.dealImg(`monitor/project/topo/icon/${item.id}/1`)) promiseArr.push(this.dealImg(`monitor/project/topo/icon/${item.id}/1`))
}
imgArr.push({ ...item }) imgArr.push({ ...item })
}) })
Promise.all(promiseArr).then((res2, header) => { Promise.all(promiseArr).then((res2, header) => {
this.iconArray = [...res.data.list] this.iconArray = [...res.data.list]
this.iconArray.forEach((item, index) => { this.iconArray.forEach((item, index) => {
item.image = res2[index].data console.log(res2[index])
item.image = res2[index].data || res2[index]
if (!getTopologyImg(item.id)) {
setTopologyImg(item.id, item.image)
}
const group = this.tools.find(tool => tool.group === item.unit) const group = this.tools.find(tool => tool.group === item.unit)
if (group) { if (group) {
group.children.push({ group.children.push({
@@ -1780,7 +1788,11 @@ export default {
} }
imgidList.forEach((item, index) => { imgidList.forEach((item, index) => {
if (item.data.imageId && imageAllId.data.list.find(image => item.data.imageId === image.id)) { if (item.data.imageId && imageAllId.data.list.find(image => item.data.imageId === image.id)) {
if (getTopologyImg(item.data.imageId)) {
promiseArr.push(getTopologyImg(item.data.imageId))
} else {
promiseArr.push(this.dealImg(`monitor/project/topo/icon/${item.data.imageId}/1`)) promiseArr.push(this.dealImg(`monitor/project/topo/icon/${item.data.imageId}/1`))
}
} else if (item.data.imageId) { } else if (item.data.imageId) {
promiseArr.push(imgDefault) promiseArr.push(imgDefault)
} else { } else {
@@ -1795,7 +1807,10 @@ export default {
}) })
this.iconArray.forEach((item, index) => { this.iconArray.forEach((item, index) => {
if (item.id) { if (item.id) {
item.image = res2[index].data item.image = res2[index].data || res2[index]
if (!getTopologyImg(item.id)) {
setTopologyImg(item.id, item.image)
}
} }
}) })
this.imgInit = true this.imgInit = true
@@ -2254,6 +2269,10 @@ export default {
if (getTopology(this.topologyIndex)) { if (getTopology(this.topologyIndex)) {
getTopology(this.topologyIndex).destroy() getTopology(this.topologyIndex).destroy()
setTopology(this.topologyIndex, null) setTopology(this.topologyIndex, null)
window.topology = null
window.Le5leTopologyPoint = null
window.topologyPoint = null
window.topologyRect = null
} }
if (document.getElementById('topology-canvas' + this.topologyIndexF)) { if (document.getElementById('topology-canvas' + this.topologyIndexF)) {
document.getElementById('topology-canvas' + this.topologyIndexF).removeEventListener('mousemove', this.canvasMove) document.getElementById('topology-canvas' + this.topologyIndexF).removeEventListener('mousemove', this.canvasMove)

View File

@@ -36,6 +36,18 @@ import myDatePicker from '@/components/common/myDatePicker'
import vSelectPage from '@/components/common/v-selectpagenew' import vSelectPage from '@/components/common/v-selectpagenew'
import nzDataList from '@/components/common/table/nzDataList' import nzDataList from '@/components/common/table/nzDataList'
import htmlToPdf from '@/components/common/js/htmlToPdf' import htmlToPdf from '@/components/common/js/htmlToPdf'
import { registerNode } from '@topology/core'
import {
myAnchors,
myCubeAnchors,
myCubec,
myIconRect,
myShape,
myTextRect
} from '@/components/common/project/L5/services/canvas'
// 注册到画布
registerNode('rectangleImg', myShape, myAnchors, myIconRect, myTextRect)
registerNode('myCube', myCubec, myCubeAnchors, null, null)
Vue.use(htmlToPdf) Vue.use(htmlToPdf)
Vue.use(vSelectPage, { Vue.use(vSelectPage, {
dataLoad: function (vue, url, params) { dataLoad: function (vue, url, params) {

View File

@@ -2,6 +2,7 @@ import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import user from './user' import user from './user'
import panel from './panel' import panel from './panel'
// import topology from './topology'
Vue.use(Vuex) Vue.use(Vuex)
const store = new Vuex.Store({ const store = new Vuex.Store({

View File

@@ -0,0 +1,24 @@
const topology = {
state: {
imgList: localStorage.getItem('nz-topology-imgList') || {}
},
mutations: {
setImgList (state, imgList) {
state.imgList = imgList
},
setImgListItem (state, item) {
state.imgList[item.key] = item.img
}
},
getters: {
getImgList (state) {
return state.imgList
}
},
actions: {
dispatchAddImgList (store, obj) {
store.commit('setImgListItem', obj)
}
}
}
export default topology

View File

@@ -1 +1 @@
{"baseUrl":"/", "version": "21.04"} {"baseUrl":"http://192.168.40.42:8080/", "version": "21.04"}

View File

@@ -1,3 +1,7 @@
module.exports = { module.exports = {
get: jest.fn(() => Promise.resolve({ status: 200 })) get: jest.fn(() => Promise.resolve({ status: 200 })),
post: jest.fn(() => Promise.resolve({ status: 200 })),
put: jest.fn(() => Promise.resolve({ status: 200 })),
del: jest.fn(() => Promise.resolve({ status: 200 })),
requestsArr: []
} }

View File

@@ -1 +1,5 @@
module.exports = 'test-file-stub'; module.exports = {
'test-file-stub': 'test-file-stub',
getters: {},
commit: ()=>{}
}

View File

@@ -0,0 +1,3 @@
module.exports = {
t: () => { return 'i18n' }
}

View File

@@ -8,25 +8,39 @@ module.exports = {
'^.+\\.js$': '<rootDir>/node_modules/babel-jest', '^.+\\.js$': '<rootDir>/node_modules/babel-jest',
'.*\\.(vue)$': '<rootDir>/node_modules/vue-jest' '.*\\.(vue)$': '<rootDir>/node_modules/vue-jest'
}, },
// moduleFileExtensions: [ moduleFileExtensions: [
// 'js', 'js',
// 'json', 'json',
// 'vue' 'vue'
// ], ],
transformIgnorePatterns: ['/node_modules/(?!vue-awesome)', 'element-ui'], transformIgnorePatterns: ['/node_modules/(?!vue-awesome)', 'element-ui'],
moduleNameMapper: { moduleNameMapper: { // 处理引入报错的文件 将其改为引入空文件 或者自定义的 function
'element-ui/*': '<rootDir>/test/unit/__mocks__/fileMock.js', 'element-ui/*': '<rootDir>/test/unit/__mocks__/fileMock.js',
// 'libs/*': '<rootDir>/test/unit/__mocks__/fileMock.js', 'css/font/*': '<rootDir>/test/unit/__mocks__/fileMock.js',
'/i18n': '<rootDir>/test/unit/__mocks__/fileMock.js', 'store/*': '<rootDir>/test/unit/__mocks__/fileMock.js',
// 'libs/*': '<rootDir>/test/unit/__mocks__/fileMock.js', 'elSelect/MyElSelect': '<rootDir>/test/unit/__mocks__/fileMock.js',
'^@\/(.*?\.?(js|vue)?|)$': '<rootDir>/src/$1', // @路径转换,例如:@/components/Main.vue -> rootDir/src/components/Main.vue '/chartList': '<rootDir>/test/unit/__mocks__/fileMock.js',
'/myDatePicker/': '<rootDir>/test/unit/__mocks__/fileMock.js',
'v-selectpage/': '<rootDir>/test/unit/__mocks__/fileMock.js',
'@topology/': '<rootDir>/test/unit/__mocks__/fileMock.js',
'/diagram': '<rootDir>/test/unit/__mocks__/fileMock.js',
'/topology': '<rootDir>/test/unit/__mocks__/fileMock.js',
'@svgdotjs': '<rootDir>/test/unit/__mocks__/fileMock.js',
'@interactjs': '<rootDir>/test/unit/__mocks__/fileMock.js',
'pl-table': '<rootDir>/test/unit/__mocks__/fileMock.js',
'/htmlToPdf': '<rootDir>/test/unit/__mocks__/fileMock.js',
'\/*\/http': '<rootDir>/test/unit/__mocks__/axios.js',
// '\/*\/permission': '<rootDir>/test/unit/__mocks__/fileMock.js',
'/i18n': '<rootDir>/test/unit/__mocks__/i18nMock.js',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/test/unit/__mocks__/fileMock.js', // 模拟加载静态文件 '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/test/unit/__mocks__/fileMock.js', // 模拟加载静态文件
'\\.(css|less|scss|sass)$': '<rootDir>/test/unit/__mocks__/styleMock.js'  // 模拟加载样式文件 '\\.(css|less|scss|sass)$': '<rootDir>/test/unit/__mocks__/styleMock.js', // 模拟加载样式文件
'\\.(css|less|scss|sass|style)$': 'jest-css-modules',
'^@\/(.*?\.?(js|vue)?|)$': '<rootDir>/src/$1' // @路径转换,例如:@/components/Main.vue -> rootDir/src/components/Main.vue
}, },
testMatch: [ // 匹配测试用例的文件 testMatch: [ // 匹配测试用例的文件
'<rootDir>/test/unit/specs/*.spec.js', '<rootDir>/test/unit/specs/*.spec.js',
'<rootDir>/test/unit/specs/lib/*.spec.js', '<rootDir>/test/unit/specs/lib/*.spec.js',
'<rootDir>/test/unit/specs/components/*.spec.js', '<rootDir>/test/unit/specs/components/*.spec.js'
], ],
moduleDirectories: [ moduleDirectories: [
'node_modules' 'node_modules'
@@ -41,8 +55,9 @@ module.exports = {
// 'test/unit/specs/*.(js)', // 'test/unit/specs/*.(js)',
'src/components/common/js/example.js', 'src/components/common/js/example.js',
'src/libs/bus.js', 'src/libs/bus.js',
'src/main.js',
// 'src/components/common/js/tools.js', // 'src/components/common/js/tools.js',
'!src/*.(js)', // '!src/*.(js)',
'!src/http.js', '!src/http.js',
'!src/router/index.js', '!src/router/index.js',
'!**/node_modules/**' '!**/node_modules/**'

View File

@@ -0,0 +1,17 @@
import main from '@/main'
import bus from '@/libs/bus'
describe('时间函数', () => {
// 测试代码可读性最好
// 分组
// const str = 'node_load1{module="node-exporter",endpoint_id="69",project="Common",datacenter="xin_xi_gang_DC",asset_id="11",endpoint="node-exporter-192.168.44.18",module_id="165",nz_agent_id="75",project_id="17",olap="node_exporter_nacos",asset="Bifang-CM-Server2",datacenter_id="4"} '
// it('正常替换一个', () => {
// expect(dealLegendAlias(str, '{{module}}')).toBe('node-exporter')
// })
it('正常替换一个', () => {
expect(main.utcTimeToTimezone(1650006960000)).toBe(1650006960000)
})
it('2', () => {
expect(main.utcTimeToTimezone('2022-04-15 15:16:00')).toBe(1650006960000)
})
})