1
0
mirror of https://github.com/lana-k/sqliteviz.git synced 2025-12-06 18:18:53 +08:00

add tests for Pivot and Chart

This commit is contained in:
lana-k
2021-09-03 15:25:23 +02:00
parent 4ebb3715d6
commit 69e0b2129b
2 changed files with 242 additions and 49 deletions

View File

@@ -4,8 +4,11 @@ import { mount, shallowMount } from '@vue/test-utils'
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 * as dereference from 'react-chart-editor/lib/lib/dereference' import * as dereference from 'react-chart-editor/lib/lib/dereference'
import fIo from '@/lib/utils/fileIo'
describe('Chart.vue', () => { describe('Chart.vue', () => {
let container
afterEach(() => { afterEach(() => {
sinon.restore() sinon.restore()
}) })
@@ -63,4 +66,24 @@ describe('Chart.vue', () => {
await wrapper.setProps({ dataSources: null }) await wrapper.setProps({ dataSources: null })
expect(dereference.default.called).to.equal(false) expect(dereference.default.called).to.equal(false)
}) })
it('saveAsPng', async () => {
sinon.spy(fIo, 'downloadFromUrl')
const dataSources = {
id: [1],
name: ['foo']
}
const wrapper = mount(Chart, {
propsData: { dataSources }
})
sinon.spy(wrapper.vm, 'prepareCopy')
await wrapper.vm.$nextTick() // chart is rendered
await wrapper.vm.saveAsPng()
const url = await wrapper.vm.prepareCopy.returnValues[0]
expect(wrapper.emitted().loadingImageCompleted.length).to.equal(1)
expect(fIo.downloadFromUrl.calledOnceWith(url, 'chart'))
})
}) })

View File

@@ -1,13 +1,24 @@
import { expect } from 'chai' import { expect } from 'chai'
import { mount } from '@vue/test-utils' import { mount } from '@vue/test-utils'
import Pivot from '@/views/Main/Workspace/Tabs/Tab/DataView/Pivot' import Pivot from '@/views/Main/Workspace/Tabs/Tab/DataView/Pivot'
import chartHelper from '@/lib/chartHelper'
import fIo from '@/lib/utils/fileIo'
import $ from 'jquery' import $ from 'jquery'
import sinon from 'sinon' import sinon from 'sinon'
describe('Pivot.vue', () => { describe('Pivot.vue', () => {
let container
beforeEach(() => {
container = document.createElement('div')
document.body.appendChild(container)
})
afterEach(() => { afterEach(() => {
container.remove()
sinon.restore() sinon.restore()
}) })
it('renders pivot table', () => { it('renders pivot table', () => {
const wrapper = mount(Pivot, { const wrapper = mount(Pivot, {
propsData: { propsData: {
@@ -92,55 +103,6 @@ describe('Pivot.vue', () => {
expect(rows.at(2).find('td.rowTotal').text()).to.equal('2') expect(rows.at(2).find('td.rowTotal').text()).to.equal('2')
}) })
it('updates when pivot settings changes', 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: [],
rendererName: 'Table'
}
}
})
await wrapper.findComponent({ name: 'pivotUi' }).vm.$emit('input', {
rows: ['year'],
cols: ['item'],
colOrder: 'key_a_to_z',
rowOrder: 'key_a_to_z',
aggregator: $.pivotUtilities.aggregators.Count(),
aggregatorName: 'Count',
renderer: $.pivotUtilities.renderers.Table,
rendererName: 'Table',
rendererOptions: undefined,
vals: []
})
const colLabels = wrapper.findAll('.pivot-output thead th.pvtColLabel')
expect(colLabels.at(0).text()).to.equal('bar')
expect(colLabels.at(1).text()).to.equal('foo')
const rows = wrapper.findAll('.pivot-output tbody tr')
// row0: 2020 - 2 -
expect(rows.at(0).find('th').text()).to.equal('2020')
expect(rows.at(0).find('td.col0').text()).to.equal('2')
expect(rows.at(0).find('td.col1').text()).to.equal('')
expect(rows.at(0).find('td.rowTotal').text()).to.equal('2')
// row1: 2021 - 1 - 1
expect(rows.at(1).find('th').text()).to.equal('2021')
expect(rows.at(1).find('td.col0').text()).to.equal('1')
expect(rows.at(1).find('td.col1').text()).to.equal('1')
expect(rows.at(1).find('td.rowTotal').text()).to.equal('2')
})
it('returns options for save', async () => { it('returns options for save', async () => {
const wrapper = mount(Pivot, { const wrapper = mount(Pivot, {
propsData: { propsData: {
@@ -216,4 +178,212 @@ describe('Pivot.vue', () => {
}) })
expect(optionsForSave.vals).to.eql([]) expect(optionsForSave.vals).to.eql([])
}) })
it('prepareCopy returns canvas for tables and url for plotly charts', 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: [],
rendererName: 'Table'
}
},
attachTo: container
})
expect(await wrapper.vm.prepareCopy()).to.be.instanceof(HTMLCanvasElement)
await wrapper.findComponent({ name: 'pivotUi' }).vm.$emit('input', {
rows: ['item'],
cols: ['year'],
colOrder: 'value_a_to_z',
rowOrder: 'value_z_to_a',
aggregator: $.pivotUtilities.aggregators.Count(),
aggregatorName: 'Count',
renderer: $.pivotUtilities.renderers['Custom chart'],
rendererName: 'Custom chart',
rendererOptions: {
customChartComponent: {
$mount: sinon.stub(),
prepareCopy: sinon.stub().returns(URL.createObjectURL(new Blob()))
}
},
vals: []
})
expect(await wrapper.vm.prepareCopy()).to.be.a('string')
await wrapper.findComponent({ name: 'pivotUi' }).vm.$emit('input', {
rows: ['item'],
cols: ['year'],
colOrder: 'value_a_to_z',
rowOrder: 'value_z_to_a',
aggregator: $.pivotUtilities.aggregators.Count(),
aggregatorName: 'Count',
renderer: $.pivotUtilities.renderers['Bar Chart'],
rendererName: 'Bar Chart',
vals: []
})
expect(await wrapper.vm.prepareCopy()).to.be.a('string')
})
it('saveAsSvg 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: {}
}
}
},
attachTo: container
})
const chartComponent = wrapper.vm.pivotOptions.rendererOptions.customChartComponent
sinon.stub(chartComponent, 'saveAsSvg')
await wrapper.vm.saveAsSvg()
expect(chartComponent.saveAsSvg.called).to.equal(true)
})
it('saveAsPng 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: {}
}
}
},
attachTo: container
})
const chartComponent = wrapper.vm.pivotOptions.rendererOptions.customChartComponent
sinon.stub(chartComponent, 'saveAsPng')
await wrapper.vm.saveAsPng()
expect(chartComponent.saveAsPng.called).to.equal(true)
})
it('saveAsSvg - standart chart', async () => {
sinon.spy(chartHelper, 'getImageDataUrl')
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.saveAsSvg()
expect(chartHelper.getImageDataUrl.calledOnce).to.equal(true)
})
it('saveAsPng - standart chart', async () => {
sinon.stub(chartHelper, 'getImageDataUrl').returns('standat chart data url')
sinon.stub(fIo, 'downloadFromUrl')
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.saveAsPng()
expect(chartHelper.getImageDataUrl.calledOnce).to.equal(true)
await chartHelper.getImageDataUrl.returnValues[0]
expect(wrapper.emitted().loadingImageCompleted.length).to.equal(1)
expect(fIo.downloadFromUrl.calledOnceWith('standat chart data url', 'pivot')).to.equal(true)
})
it('saveAsPng - table', async () => {
sinon.stub(HTMLCanvasElement.prototype, 'toDataURL').returns('canvas data url')
sinon.stub(fIo, 'downloadFromUrl')
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.saveAsPng()
expect(HTMLCanvasElement.prototype.toDataURL.calledOnce).to.equal(true)
await HTMLCanvasElement.prototype.toDataURL.returnValues[0]
expect(wrapper.emitted().loadingImageCompleted.length).to.equal(1)
expect(fIo.downloadFromUrl.calledOnceWith('canvas data url', 'pivot')).to.equal(true)
})
}) })