mirror of
https://github.com/lana-k/sqliteviz.git
synced 2025-12-06 18:18:53 +08:00
#89 add tests
This commit is contained in:
684
package-lock.json
generated
684
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "sqliteviz",
|
"name": "sqliteviz",
|
||||||
"version": "0.17.1",
|
"version": "0.18.0",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import $ from 'jquery'
|
|||||||
import 'pivottable'
|
import 'pivottable'
|
||||||
import 'pivottable/dist/pivot.css'
|
import 'pivottable/dist/pivot.css'
|
||||||
import PivotUi from './PivotUi'
|
import PivotUi from './PivotUi'
|
||||||
import { getPivotCanvas, getPivotHtml } from './pivotHelper'
|
import pivotHelper from './pivotHelper'
|
||||||
import Chart from '@/views/Main/Workspace/Tabs/Tab/DataView/Chart'
|
import Chart from '@/views/Main/Workspace/Tabs/Tab/DataView/Chart'
|
||||||
import chartHelper from '@/lib/chartHelper'
|
import chartHelper from '@/lib/chartHelper'
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
@@ -169,7 +169,7 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
const source = this.viewStandartChart
|
const source = this.viewStandartChart
|
||||||
? await chartHelper.getImageDataUrl(this.$refs.pivotOutput, 'png')
|
? await chartHelper.getImageDataUrl(this.$refs.pivotOutput, 'png')
|
||||||
: (await getPivotCanvas(this.$refs.pivotOutput)).toDataURL('image/png')
|
: (await pivotHelper.getPivotCanvas(this.$refs.pivotOutput)).toDataURL('image/png')
|
||||||
|
|
||||||
this.$emit('loadingImageCompleted')
|
this.$emit('loadingImageCompleted')
|
||||||
fIo.downloadFromUrl(source, 'pivot')
|
fIo.downloadFromUrl(source, 'pivot')
|
||||||
@@ -182,7 +182,7 @@ export default {
|
|||||||
} else if (this.viewStandartChart) {
|
} else if (this.viewStandartChart) {
|
||||||
return await chartHelper.getImageDataUrl(this.$refs.pivotOutput, 'png')
|
return await chartHelper.getImageDataUrl(this.$refs.pivotOutput, 'png')
|
||||||
} else {
|
} else {
|
||||||
return await getPivotCanvas(this.$refs.pivotOutput)
|
return await pivotHelper.getPivotCanvas(this.$refs.pivotOutput)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -207,7 +207,7 @@ export default {
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
fIo.exportToFile(
|
fIo.exportToFile(
|
||||||
getPivotHtml(this.$refs.pivotOutput),
|
pivotHelper.getPivotHtml(this.$refs.pivotOutput),
|
||||||
'pivot.html',
|
'pivot.html',
|
||||||
'text/html'
|
'text/html'
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -113,3 +113,8 @@ export function getPivotHtml (pivotOutput) {
|
|||||||
${pivotOutput.outerHTML}
|
${pivotOutput.outerHTML}
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
getPivotCanvas,
|
||||||
|
getPivotHtml
|
||||||
|
}
|
||||||
|
|||||||
@@ -64,7 +64,40 @@ describe('chartHelper.js', () => {
|
|||||||
expect(/^data:image\/png/.test(url)).to.equal(true)
|
expect(/^data:image\/png/.test(url)).to.equal(true)
|
||||||
|
|
||||||
url = await chartHelper.getImageDataUrl(element, 'svg')
|
url = await chartHelper.getImageDataUrl(element, 'svg')
|
||||||
console.log()
|
|
||||||
expect(/^data:image\/svg\+xml/.test(url)).to.equal(true)
|
expect(/^data:image\/svg\+xml/.test(url)).to.equal(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('getChartData returns plotly data and layout from element', async () => {
|
||||||
|
const element = document.createElement('div')
|
||||||
|
const child = document.createElement('div')
|
||||||
|
element.append(child)
|
||||||
|
child.classList.add('js-plotly-plot')
|
||||||
|
child.data = 'plotly data'
|
||||||
|
child.layout = 'plotly layout'
|
||||||
|
|
||||||
|
const chartData = chartHelper.getChartData(element)
|
||||||
|
expect(chartData).to.eql({
|
||||||
|
data: 'plotly data',
|
||||||
|
layout: 'plotly layout'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('getHtml returns valid html', async () => {
|
||||||
|
const options = {
|
||||||
|
data: 'plotly data',
|
||||||
|
layout: 'plotly layout'
|
||||||
|
}
|
||||||
|
|
||||||
|
const html = chartHelper.getHtml(options)
|
||||||
|
const doc = document.createElement('div')
|
||||||
|
doc.innerHTML = html
|
||||||
|
|
||||||
|
expect(doc.innerHTML).to.equal(html)
|
||||||
|
expect(doc.children).to.have.lengthOf(3)
|
||||||
|
expect(doc.children[0].src).to.includes('plotly-latest.js')
|
||||||
|
expect(doc.children[1].id).to.have.lengthOf(21)
|
||||||
|
expect(doc.children[2].innerHTML).to.includes(doc.children[1].id)
|
||||||
|
expect(doc.children[2].innerHTML)
|
||||||
|
.to.includes('Plotly.newPlot(el, "plotly data", "plotly layout"')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -59,6 +59,31 @@ describe('DataView.vue', () => {
|
|||||||
expect(pivot.saveAsSvg.calledOnce).to.equal(true)
|
expect(pivot.saveAsSvg.calledOnce).to.equal(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('method saveAsHtml calls the same method of the current view component', async () => {
|
||||||
|
const wrapper = mount(DataView)
|
||||||
|
|
||||||
|
// Find chart and spy the method
|
||||||
|
const chart = wrapper.findComponent({ name: 'Chart' }).vm
|
||||||
|
sinon.spy(chart, 'saveAsHtml')
|
||||||
|
|
||||||
|
// Export to html
|
||||||
|
const htmlBtn = createWrapper(wrapper.findComponent({ name: 'htmlIcon' }).vm.$parent)
|
||||||
|
await htmlBtn.trigger('click')
|
||||||
|
expect(chart.saveAsHtml.calledOnce).to.equal(true)
|
||||||
|
|
||||||
|
// Switch to pivot
|
||||||
|
const pivotBtn = createWrapper(wrapper.findComponent({ name: 'pivotIcon' }).vm.$parent)
|
||||||
|
await pivotBtn.trigger('click')
|
||||||
|
|
||||||
|
// Find pivot and spy the method
|
||||||
|
const pivot = wrapper.findComponent({ name: 'pivot' }).vm
|
||||||
|
sinon.spy(pivot, 'saveAsHtml')
|
||||||
|
|
||||||
|
// Export to svg
|
||||||
|
await htmlBtn.trigger('click')
|
||||||
|
expect(pivot.saveAsHtml.calledOnce).to.equal(true)
|
||||||
|
})
|
||||||
|
|
||||||
it('shows alert when ClipboardItem is not supported', async () => {
|
it('shows alert when ClipboardItem is not supported', async () => {
|
||||||
const ClipboardItem = window.ClipboardItem
|
const ClipboardItem = window.ClipboardItem
|
||||||
delete window.ClipboardItem
|
delete window.ClipboardItem
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import chartHelper from '@/lib/chartHelper'
|
|||||||
import fIo from '@/lib/utils/fileIo'
|
import fIo from '@/lib/utils/fileIo'
|
||||||
import $ from 'jquery'
|
import $ from 'jquery'
|
||||||
import sinon from 'sinon'
|
import sinon from 'sinon'
|
||||||
|
import pivotHelper from '@/views/Main/Workspace/Tabs/Tab/DataView/Pivot/pivotHelper'
|
||||||
|
|
||||||
describe('Pivot.vue', () => {
|
describe('Pivot.vue', () => {
|
||||||
let container
|
let container
|
||||||
@@ -271,6 +272,41 @@ describe('Pivot.vue', () => {
|
|||||||
expect(chartComponent.saveAsSvg.called).to.equal(true)
|
expect(chartComponent.saveAsSvg.called).to.equal(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('saveAsHtml calls chart method if renderer is Custom Chart', async () => {
|
||||||
|
const wrapper = mount(Pivot, {
|
||||||
|
propsData: {
|
||||||
|
dataSources: {
|
||||||
|
item: ['foo', 'bar', 'bar', 'bar'],
|
||||||
|
year: [2021, 2021, 2020, 2020]
|
||||||
|
},
|
||||||
|
initOptions: {
|
||||||
|
rows: ['item'],
|
||||||
|
cols: ['year'],
|
||||||
|
colOrder: 'key_a_to_z',
|
||||||
|
rowOrder: 'key_a_to_z',
|
||||||
|
aggregatorName: 'Count',
|
||||||
|
vals: [],
|
||||||
|
renderer: $.pivotUtilities.renderers['Custom chart'],
|
||||||
|
rendererName: 'Custom chart',
|
||||||
|
rendererOptions: {
|
||||||
|
customChartOptions: {
|
||||||
|
data: [],
|
||||||
|
layout: {},
|
||||||
|
frames: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
attachTo: container
|
||||||
|
})
|
||||||
|
|
||||||
|
const chartComponent = wrapper.vm.pivotOptions.rendererOptions.customChartComponent
|
||||||
|
sinon.stub(chartComponent, 'saveAsHtml')
|
||||||
|
|
||||||
|
await wrapper.vm.saveAsHtml()
|
||||||
|
expect(chartComponent.saveAsHtml.called).to.equal(true)
|
||||||
|
})
|
||||||
|
|
||||||
it('saveAsPng calls chart method if renderer is Custom Chart', async () => {
|
it('saveAsPng calls chart method if renderer is Custom Chart', async () => {
|
||||||
const wrapper = mount(Pivot, {
|
const wrapper = mount(Pivot, {
|
||||||
propsData: {
|
propsData: {
|
||||||
@@ -333,6 +369,66 @@ describe('Pivot.vue', () => {
|
|||||||
expect(chartHelper.getImageDataUrl.calledOnce).to.equal(true)
|
expect(chartHelper.getImageDataUrl.calledOnce).to.equal(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('saveAsHtml - standart chart', async () => {
|
||||||
|
sinon.spy(chartHelper, 'getChartData')
|
||||||
|
sinon.spy(chartHelper, 'getHtml')
|
||||||
|
|
||||||
|
const wrapper = mount(Pivot, {
|
||||||
|
propsData: {
|
||||||
|
dataSources: {
|
||||||
|
item: ['foo', 'bar', 'bar', 'bar'],
|
||||||
|
year: [2021, 2021, 2020, 2020]
|
||||||
|
},
|
||||||
|
initOptions: {
|
||||||
|
rows: ['item'],
|
||||||
|
cols: ['year'],
|
||||||
|
colOrder: 'key_a_to_z',
|
||||||
|
rowOrder: 'key_a_to_z',
|
||||||
|
aggregatorName: 'Count',
|
||||||
|
vals: [],
|
||||||
|
renderer: $.pivotUtilities.renderers['Bar Chart'],
|
||||||
|
rendererName: 'Bar Chart'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
attachTo: container
|
||||||
|
})
|
||||||
|
|
||||||
|
await wrapper.vm.saveAsHtml()
|
||||||
|
expect(chartHelper.getChartData.calledOnce).to.equal(true)
|
||||||
|
const chartData = await chartHelper.getChartData.returnValues[0]
|
||||||
|
expect(chartHelper.getHtml.calledOnceWith(chartData)).to.equal(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('saveAsHtml - table', async () => {
|
||||||
|
sinon.stub(pivotHelper, 'getPivotHtml')
|
||||||
|
sinon.stub(fIo, 'exportToFile')
|
||||||
|
|
||||||
|
const wrapper = mount(Pivot, {
|
||||||
|
propsData: {
|
||||||
|
dataSources: {
|
||||||
|
item: ['foo', 'bar', 'bar', 'bar'],
|
||||||
|
year: [2021, 2021, 2020, 2020]
|
||||||
|
},
|
||||||
|
initOptions: {
|
||||||
|
rows: ['item'],
|
||||||
|
cols: ['year'],
|
||||||
|
colOrder: 'key_a_to_z',
|
||||||
|
rowOrder: 'key_a_to_z',
|
||||||
|
aggregatorName: 'Count',
|
||||||
|
vals: [],
|
||||||
|
renderer: $.pivotUtilities.renderers.Table,
|
||||||
|
rendererName: 'Table'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
attachTo: container
|
||||||
|
})
|
||||||
|
|
||||||
|
await wrapper.vm.saveAsHtml()
|
||||||
|
expect(pivotHelper.getPivotHtml.calledOnce).to.equal(true)
|
||||||
|
const html = pivotHelper.getPivotHtml.returnValues[0]
|
||||||
|
expect(fIo.exportToFile.calledOnceWith(html, 'pivot.html', 'text/html')).to.equal(true)
|
||||||
|
})
|
||||||
|
|
||||||
it('saveAsPng - standart chart', async () => {
|
it('saveAsPng - standart chart', async () => {
|
||||||
sinon.stub(chartHelper, 'getImageDataUrl').returns('standat chart data url')
|
sinon.stub(chartHelper, 'getImageDataUrl').returns('standat chart data url')
|
||||||
sinon.stub(fIo, 'downloadFromUrl')
|
sinon.stub(fIo, 'downloadFromUrl')
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { expect } from 'chai'
|
import { expect } from 'chai'
|
||||||
import { _getDataSources, getPivotCanvas }
|
import { _getDataSources, getPivotCanvas, getPivotHtml }
|
||||||
from '@/views/Main/Workspace/Tabs/Tab/DataView/Pivot/pivotHelper'
|
from '@/views/Main/Workspace/Tabs/Tab/DataView/Pivot/pivotHelper'
|
||||||
|
|
||||||
describe('pivotHelper.js', () => {
|
describe('pivotHelper.js', () => {
|
||||||
@@ -63,4 +63,19 @@ describe('pivotHelper.js', () => {
|
|||||||
|
|
||||||
expect(await getPivotCanvas(pivotOutput)).to.be.instanceof(HTMLCanvasElement)
|
expect(await getPivotCanvas(pivotOutput)).to.be.instanceof(HTMLCanvasElement)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('getPivotHtml returns html with styles', async () => {
|
||||||
|
const pivotOutput = document.createElement('div')
|
||||||
|
pivotOutput.append('test')
|
||||||
|
|
||||||
|
const html = getPivotHtml(pivotOutput)
|
||||||
|
const doc = document.createElement('div')
|
||||||
|
doc.innerHTML = html
|
||||||
|
|
||||||
|
expect(doc.innerHTML).to.equal(html)
|
||||||
|
expect(doc.children).to.have.lengthOf(2)
|
||||||
|
expect(doc.children[0].tagName).to.equal('STYLE')
|
||||||
|
expect(doc.children[1].tagName).to.equal('DIV')
|
||||||
|
expect(doc.children[1].innerHTML).to.equal('test')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user