From 4ebb3715d6f2a739f08b7d342d30371e256f8907 Mon Sep 17 00:00:00 2001 From: lana-k Date: Fri, 3 Sep 2021 15:22:48 +0200 Subject: [PATCH] add tests for RinResult --- .../Main/Workspace/Tabs/Tab/RunResult.vue | 2 +- .../Main/Workspace/Tabs/Tab/RunResult.spec.js | 155 ++++++++++++++++++ 2 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 tests/views/Main/Workspace/Tabs/Tab/RunResult.spec.js diff --git a/src/views/Main/Workspace/Tabs/Tab/RunResult.vue b/src/views/Main/Workspace/Tabs/Tab/RunResult.vue index e2aac8d..a5f24aa 100644 --- a/src/views/Main/Workspace/Tabs/Tab/RunResult.vue +++ b/src/views/Main/Workspace/Tabs/Tab/RunResult.vue @@ -137,7 +137,7 @@ export default { } } else { alert( - "Your browser doesn't support copying images into the clipboard. " + + "Your browser doesn't support copying into the clipboard. " + 'If you use Firefox you can enable it ' + 'by setting dom.events.asyncClipboard.clipboardItem to true.' ) diff --git a/tests/views/Main/Workspace/Tabs/Tab/RunResult.spec.js b/tests/views/Main/Workspace/Tabs/Tab/RunResult.spec.js new file mode 100644 index 0000000..958d590 --- /dev/null +++ b/tests/views/Main/Workspace/Tabs/Tab/RunResult.spec.js @@ -0,0 +1,155 @@ +import { expect } from 'chai' +import { mount, createWrapper } from '@vue/test-utils' +import RunResult from '@/views/Main/Workspace/Tabs/Tab/RunResult' +import csv from '@/lib/csv' +import sinon from 'sinon' + +describe('RunResult.vue', () => { + afterEach(() => { + sinon.restore() + }) + + it('shows alert when ClipboardItem is not supported', async () => { + const ClipboardItem = window.ClipboardItem + delete window.ClipboardItem + sinon.spy(window, 'alert') + const wrapper = mount(RunResult, { + propsData: { + result: { + columns: ['id', 'name'], + values: { + id: [1], + name: ['foo'] + } + } + } + }) + + const copyBtn = createWrapper(wrapper.findComponent({ name: 'clipboardIcon' }).vm.$parent) + await copyBtn.trigger('click') + + expect( + window.alert.calledOnceWith( + "Your browser doesn't support copying into the clipboard. " + + 'If you use Firefox you can enable it ' + + 'by setting dom.events.asyncClipboard.clipboardItem to true.' + ) + ).to.equal(true) + + window.ClipboardItem = ClipboardItem + }) + + it('copy to clipboard more than 1 sec', async () => { + sinon.stub(window.navigator.clipboard, 'writeText').resolves() + const clock = sinon.useFakeTimers() + const wrapper = mount(RunResult, { + propsData: { + result: { + columns: ['id', 'name'], + values: { + id: [1], + name: ['foo'] + } + } + } + }) + sinon.stub(csv, 'serialize').callsFake(() => { + clock.tick(5000) + }) + + // Click copy to clipboard + const copyBtn = createWrapper(wrapper.findComponent({ name: 'clipboardIcon' }).vm.$parent) + await copyBtn.trigger('click') + + // The dialog is shown... + expect(wrapper.find('[data-modal="prepareCSVCopy"]').exists()).to.equal(true) + + // ... with Building message... + expect(wrapper.find('.dialog-body').text()).to.equal('Building CSV...') + + // Switch to microtasks (let serialize run) + clock.tick(0) + await wrapper.vm.$nextTick() + + // The dialog is shown... + expect(wrapper.find('[data-modal="prepareCSVCopy"]').exists()).to.equal(true) + + // ... with Ready message... + expect(wrapper.find('.dialog-body').text()).to.equal('CSV is ready') + + // Click copy + await wrapper.find('.dialog-buttons-container button.primary').trigger('click') + + // The dialog is not shown... + expect(wrapper.find('[data-modal="prepareCSVCopy"]').exists()).to.equal(false) + }) + + it('copy to clipboard less than 1 sec', async () => { + sinon.stub(window.navigator.clipboard, 'writeText').resolves() + const clock = sinon.useFakeTimers() + const wrapper = mount(RunResult, { + propsData: { + result: { + columns: ['id', 'name'], + values: { + id: [1], + name: ['foo'] + } + } + } + }) + sinon.spy(wrapper.vm, 'copyToClipboard') + sinon.stub(csv, 'serialize').callsFake(() => { + clock.tick(500) + }) + + // Click copy to clipboard + const copyBtn = createWrapper(wrapper.findComponent({ name: 'clipboardIcon' }).vm.$parent) + await copyBtn.trigger('click') + + // Switch to microtasks (let serialize run) + clock.tick(0) + await wrapper.vm.$nextTick() + + // The dialog is not shown... + expect(wrapper.find('[data-modal="prepareCSVCopy"]').exists()).to.equal(false) + // copyToClipboard is called + expect(wrapper.vm.copyToClipboard.calledOnce).to.equal(true) + }) + + it('cancel long copy', async () => { + sinon.stub(window.navigator.clipboard, 'writeText').resolves() + const clock = sinon.useFakeTimers() + const wrapper = mount(RunResult, { + propsData: { + result: { + columns: ['id', 'name'], + values: { + id: [1], + name: ['foo'] + } + } + } + }) + sinon.spy(wrapper.vm, 'copyToClipboard') + sinon.stub(csv, 'serialize').callsFake(() => { + clock.tick(5000) + }) + + // Click copy to clipboard + const copyBtn = createWrapper(wrapper.findComponent({ name: 'clipboardIcon' }).vm.$parent) + await copyBtn.trigger('click') + + // Switch to microtasks (let serialize run) + clock.tick(0) + await wrapper.vm.$nextTick() + + // Click cancel + await wrapper.find('.dialog-buttons-container button.secondary').trigger('click') + + // The dialog is not shown... + expect(wrapper.find('[data-modal="prepareCSVCopy"]').exists()).to.equal(false) + // copyToClipboard is not called + expect(wrapper.vm.copyToClipboard.calledOnce).to.equal(false) + }) +})