From e33213fe4bd950f7fb25266aaf8c6b84a31358d7 Mon Sep 17 00:00:00 2001 From: qytayh <13255238145@163.com> Date: Wed, 16 Mar 2022 20:33:02 +0800 Subject: [PATCH 01/18] test(ui/popup): add test cases & snaps --- .../__snapshots__/index.spec.js.snap | 112 +++++++++ .../src/popup/__tests__/index.spec.js | 213 ++++++++++-------- 2 files changed, 229 insertions(+), 96 deletions(-) create mode 100644 packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap diff --git a/packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap new file mode 100644 index 0000000..ca1891e --- /dev/null +++ b/packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap @@ -0,0 +1,112 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test popup example 1`] = ` +"
+
弹出位置
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
遮罩层样式
+ +
+
+ +
+
+ +
+
+ +
+
+
注册事件
+ +
+
+ +
+
+
" +`; + +exports[`test popup show 1`] = ` +" +
+
+ +
+
" +`; + +exports[`test popup show 2`] = ` +" +
+
+ +
+ default slot content +
+
+
+
" +`; + +exports[`test popup show 3`] = ` +" +
+
+ +
+
" +`; diff --git a/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js index 072af1f..add169d 100644 --- a/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js @@ -8,99 +8,120 @@ test('test popup plugin', () => { expect(Vue.component(Popup.name)).toBeTruthy() }) -// const Wrapper = { -// components: { -// [VarPopup.name]: VarPopup, -// }, - -// props: ['closeOnClickOverlay', 'onOpen', 'onClose', 'onClickOverlay'], - -// data: () => ({ -// show: false, -// }), - -// template: ` -// -// default slot content -// -// `, -// } - -// test('test popup show', async () => { -// const wrapper = mount(Wrapper) -// expect(wrapper.find('.var-popup').isVisible()).toBeFalsy() -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.setData({ show: true }) -// expect(wrapper.find('.var-popup').isVisible()).toBeTruthy() -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.setData({ show: false }) -// expect(wrapper.find('.var-popup').isVisible()).toBeFalsy() -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.destroy() -// }) - -// test('test popup onOpen & onClose', async () => { -// const onOpen = jest.fn() -// const onClose = jest.fn() - -// const wrapper = mount(Wrapper, { -// listeners: { -// open: opOpen, -// close: onClose, -// }, -// }) -// await wrapper.setData({ show: true }) -// expect(onOpen).toHaveBeenCalledTimes(1) - -// await wrapper.setData({ show: false }) -// expect(onClose).toHaveBeenCalledTimes(1) - -// wrapper.destroy() -// }) - -// test('test popup close on clickOverlay', async () => { -// const onClose = jest.fn() -// const onClickOverlay = jest.fn() - -// const wrapper = mount(Wrapper, { -// listeners: { -// close: onClose, -// clickOverlay: onClickOverlay, -// }, -// }) - -// await wrapper.setData({ show: true }) - -// await wrapper.find('.var-popup__overlay').trigger('click') -// expect(onClickOverlay).toHaveBeenCalledTimes(1) -// expect(onClose).toHaveBeenCalledTimes(1) - -// await wrapper.setData({ show: true }) -// await wrapper.setProps({ closeOnClickOverlay: false }) -// await wrapper.find('.var-popup__overlay').trigger('click') -// expect(onClickOverlay).toHaveBeenCalledTimes(2) -// expect(onClose).toHaveBeenCalledTimes(1) - -// wrapper.destroy() -// }) - -// test('test popup z-index', async () => { -// const wrapper = mount(Wrapper) - -// await wrapper.setData({ show: true }) - -// const prevPopupZIndex = window.getComputedStyle(wrapper.find('.var-popup').element).zIndex -// const prevOverlayZIndex = window.getComputedStyle(wrapper.find('.var-popup__overlay').element).zIndex - -// await wrapper.setData({ show: false }) -// await wrapper.setData({ show: true }) -// expect(window.getComputedStyle(wrapper.find('.var-popup').element).zIndex).toBe(String(+prevPopupZIndex + 3)) -// expect(window.getComputedStyle(wrapper.find('.var-popup__overlay').element).zIndex).toBe( -// String(+prevOverlayZIndex + 3) -// ) - -// wrapper.destroy() -// }) +const Wrapper = { + components: { + [VarPopup.name]: VarPopup, + }, + props: ['closeOnClickOverlay', 'onOpen', 'onClose', 'onClickOverlay'], + data: () => ({ + show: false, + }), + template: ` + + default slot content + + `, +} + +test('test popup show', async () => { + const wrapper = mount(Wrapper) + expect(wrapper.find('.var-popup').isVisible()).toBeFalsy() + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.setData({ show: true }) + expect(wrapper.find('.var-popup').isVisible()).toBeTruthy() + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.setData({ show: false }) + expect(wrapper.find('.var-popup').isVisible()).toBeFalsy() + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +}) + +test('test popup onOpen & onClose', async () => { + const onOpen = jest.fn() + const onClose = jest.fn() + + const Wrapper = { + components: { + [VarPopup.name]: VarPopup, + }, + data: () => ({ + show: false, + }), + methods: { + onOpen, + onClose, + }, + template: ` + + default slot content + `, + } + + const wrapper = mount(Wrapper) + await wrapper.setData({ show: true }) + expect(onOpen).toHaveBeenCalledTimes(1) + + await wrapper.setData({ show: false }) + expect(onClose).toHaveBeenCalledTimes(1) + + wrapper.destroy() +}) + +test('test popup close on clickOverlay', async () => { + const onClose = jest.fn() + const onClickOverlay = jest.fn() + + const Wrapper = { + components: { + [VarPopup.name]: VarPopup, + }, + data: () => ({ + show: false, + closeOnClickOverlay: true, + }), + methods: { + onClickOverlay, + onClose, + }, + template: ` + + default slot content + `, + } + + const wrapper = mount(Wrapper) + + await wrapper.setData({ show: true }) + + await wrapper.find('.var-popup__overlay').trigger('click') + expect(onClickOverlay).toHaveBeenCalledTimes(1) + expect(onClose).toHaveBeenCalledTimes(1) + + await wrapper.setData({ closeOnClickOverlay: false, show: true }) + await wrapper.find('.var-popup__overlay').trigger('click') + expect(onClickOverlay).toHaveBeenCalledTimes(2) + expect(onClose).toHaveBeenCalledTimes(1) + + wrapper.destroy() +}) + +test('test popup z-index', async () => { + const wrapper = mount(Wrapper) + + await wrapper.setData({ show: true }) + + const prevPopupZIndex = window.getComputedStyle(wrapper.find('.var-popup').element).zIndex + const prevOverlayZIndex = window.getComputedStyle(wrapper.find('.var-popup__overlay').element).zIndex + + await wrapper.setData({ show: false }) + await wrapper.setData({ show: true }) + expect(window.getComputedStyle(wrapper.find('.var-popup').element).zIndex).toBe(String(+prevPopupZIndex + 3)) + expect(window.getComputedStyle(wrapper.find('.var-popup__overlay').element).zIndex).toBe( + String(+prevOverlayZIndex + 3) + ) + + wrapper.destroy() +}) From e73a18623d41d2466b28ac4c2f8544d87d9ddf7a Mon Sep 17 00:00:00 2001 From: qytayh <13255238145@163.com> Date: Wed, 16 Mar 2022 20:46:31 +0800 Subject: [PATCH 02/18] test(ui/popup): fix snaps --- .../__snapshots__/index.spec.js.snap | 80 ------------------- .../src/popup/__tests__/index.spec.js | 2 +- 2 files changed, 1 insertion(+), 81 deletions(-) diff --git a/packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap index ca1891e..6131ee8 100644 --- a/packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/popup/__tests__/__snapshots__/index.spec.js.snap @@ -1,85 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`test popup example 1`] = ` -"
-
弹出位置
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
遮罩层样式
- -
-
- -
-
- -
-
- -
-
-
注册事件
- -
-
- -
-
-
" -`; - exports[`test popup show 1`] = ` "
diff --git a/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js index add169d..f3f3936 100644 --- a/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/popup/__tests__/index.spec.js @@ -17,7 +17,7 @@ const Wrapper = { show: false, }), template: ` - + default slot content `, From ea8963587f6fd7606b0b293b1a0cd4da72cf9d29 Mon Sep 17 00:00:00 2001 From: qytayh <13255238145@163.com> Date: Wed, 16 Mar 2022 20:54:39 +0800 Subject: [PATCH 03/18] test(ui/back-top): add test cases & snaps --- .../src/back-top/__tests__/index.spec.js | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/packages/varlet-vue2-ui/src/back-top/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/back-top/__tests__/index.spec.js index 7866606..cb2b232 100644 --- a/packages/varlet-vue2-ui/src/back-top/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/back-top/__tests__/index.spec.js @@ -12,55 +12,55 @@ test('test backTop plugin', () => { test('test backTop example', () => { const wrapper = mount(example, { attachTo: document.body }) - expect(wrapper.html()).toMatchSnapshot() + wrapper.destroy() }) -// test('test backTop props', async () => { -// mockScrollTo(HTMLDivElement) +test('test backTop props', async () => { + mockScrollTo(HTMLDivElement) -// const template = ` -//
-//
-// -//
-// ` -// const clickHandle = jest.fn() + const template = ` +
+
+ +
+ ` + const clickHandle = jest.fn() -// const wrapper = mount( -// { -// components: { -// [VarBackTop.name]: VarBackTop, -// }, -// methods: { -// clickHandle, -// }, -// template, -// }, -// { attachTo: document.body } -// ) + const wrapper = mount( + { + components: { + [VarBackTop.name]: VarBackTop, + }, + methods: { + clickHandle, + }, + template, + }, + { attachTo: document.body } + ) -// await delay(0) + await delay(0) -// const backTopEl = wrapper.find('.var-back-top') + const backTopEl = wrapper.find('.var-back-top') -// expect(backTopEl.classes('var-back-top--active')).toBe(false) + expect(backTopEl.classes('var-back-top--active')).toBe(false) -// wrapper.element.scrollTop = 600 + wrapper.element.scrollTop = 600 -// await wrapper.trigger('scroll') + await wrapper.trigger('scroll') -// await delay(500) + await delay(500) -// expect(backTopEl.classes('var-back-top--active')).toBe(true) + expect(backTopEl.classes('var-back-top--active')).toBe(true) -// await backTopEl.trigger('click') + await backTopEl.trigger('click') -// await delay(500) + await delay(500) -// expect(wrapper.element.scrollTop).toBeLessThan(1) + expect(wrapper.element.scrollTop).toBeLessThan(1) -// expect(clickHandle).toHaveBeenCalledTimes(1) + expect(clickHandle).toHaveBeenCalledTimes(1) -// wrapper.destroy() -// }) + wrapper.destroy() +}) From deed762ee40e66e811ef3fa763a6314fd8e2ffba Mon Sep 17 00:00:00 2001 From: qytayh <13255238145@163.com> Date: Wed, 16 Mar 2022 22:04:02 +0800 Subject: [PATCH 04/18] test(ui/picker): add test cases & snaps --- .../__snapshots__/component.spec.js.snap | 693 ++++++++++++++++++ .../src/picker/__tests__/component.spec.js | 285 +++---- .../src/picker/__tests__/index.spec.js | 130 ++-- 3 files changed, 908 insertions(+), 200 deletions(-) create mode 100644 packages/varlet-vue2-ui/src/picker/__tests__/__snapshots__/component.spec.js.snap diff --git a/packages/varlet-vue2-ui/src/picker/__tests__/__snapshots__/component.spec.js.snap b/packages/varlet-vue2-ui/src/picker/__tests__/__snapshots__/component.spec.js.snap new file mode 100644 index 0000000..d4c96eb --- /dev/null +++ b/packages/varlet-vue2-ui/src/picker/__tests__/__snapshots__/component.spec.js.snap @@ -0,0 +1,693 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test cascade mode 1`] = ` +" +
+
+
请选择
+
+
+
+
+
+
成都市
+
+
+
无锡市
+
+
+
+
+
+
+
温江区
+
+
+
金牛区
+
+
+
+
+
+
+
+
" +`; + +exports[`test picker example 1`] = ` +"
+
函数调用
+
组件调用
+ +
+
+
请选择
+
+
+
+
+
+
0
+
+
+
1
+
+
+
2
+
+
+
3
+
+
+
4
+
+
+
5
+
+
+
6
+
+
+
7
+
+
+
8
+
+
+
9
+
+
+
10
+
+
+
11
+
+
+
12
+
+
+
13
+
+
+
14
+
+
+
15
+
+
+
16
+
+
+
17
+
+
+
18
+
+
+
19
+
+
+
+
+
+
+
+
+ +
+
+
请选择
+
+
+
+
+
+
0
+
+
+
1
+
+
+
2
+
+
+
3
+
+
+
4
+
+
+
5
+
+
+
6
+
+
+
7
+
+
+
8
+
+
+
9
+
+
+
10
+
+
+
11
+
+
+
12
+
+
+
13
+
+
+
14
+
+
+
15
+
+
+
16
+
+
+
17
+
+
+
18
+
+
+
19
+
+
+
+
+
+
+
0
+
+
+
1
+
+
+
2
+
+
+
3
+
+
+
4
+
+
+
5
+
+
+
6
+
+
+
7
+
+
+
8
+
+
+
9
+
+
+
10
+
+
+
11
+
+
+
12
+
+
+
13
+
+
+
14
+
+
+
15
+
+
+
16
+
+
+
17
+
+
+
18
+
+
+
19
+
+
+
+
+
+
+
0
+
+
+
1
+
+
+
2
+
+
+
3
+
+
+
4
+
+
+
5
+
+
+
6
+
+
+
7
+
+
+
8
+
+
+
9
+
+
+
10
+
+
+
11
+
+
+
12
+
+
+
13
+
+
+
14
+
+
+
15
+
+
+
16
+
+
+
17
+
+
+
18
+
+
+
19
+
+
+
+
+
+
+
+
+ +
+
+
请选择
+
+
+
+
+
+
北京市
+
+
+
天津市
+
+
+
河北省
+
+
+
山西省
+
+
+
内蒙古自治区
+
+
+
辽宁省
+
+
+
吉林省
+
+
+
黑龙江省
+
+
+
上海市
+
+
+
江苏省
+
+
+
浙江省
+
+
+
安徽省
+
+
+
福建省
+
+
+
江西省
+
+
+
山东省
+
+
+
河南省
+
+
+
湖北省
+
+
+
湖南省
+
+
+
广东省
+
+
+
广西壮族自治区
+
+
+
海南省
+
+
+
重庆市
+
+
+
四川省
+
+
+
贵州省
+
+
+
云南省
+
+
+
西藏自治区
+
+
+
陕西省
+
+
+
甘肃省
+
+
+
青海省
+
+
+
宁夏回族自治区
+
+
+
新疆维吾尔自治区
+
+
+
台湾省
+
+
+
香港特别行政区
+
+
+
澳门特别行政区
+
+
+
+
+
+
+
市辖区
+
+
+
+
+
+
+
东城区
+
+
+
西城区
+
+
+
朝阳区
+
+
+
丰台区
+
+
+
石景山区
+
+
+
海淀区
+
+
+
门头沟区
+
+
+
房山区
+
+
+
通州区
+
+
+
顺义区
+
+
+
昌平区
+
+
+
大兴区
+
+
+
怀柔区
+
+
+
平谷区
+
+
+
密云区
+
+
+
延庆区
+
+
+
+
+
+
+
+
+
" +`; + +exports[`test scroll down & onCancel 1`] = ` +" +
+
+
请选择
+
+
+
+
+
+
A
+
+
+
B
+
+
+
C
+
+
+
+
+
+
+
+
" +`; + +exports[`test scroll down & onCancel 2`] = ` +" +
+
+
请选择
+
+
+
+
+
+
A
+
+
+
B
+
+
+
C
+
+
+
+
+
+
+
+
" +`; + +exports[`test scroll up & onConfirm 1`] = ` +" +
+
+
请选择
+
+
+
+
+
+
A
+
+
+
B
+
+
+
C
+
+
+
+
+
+
+
+
" +`; + +exports[`test scroll up & onConfirm 2`] = ` +" +
+
+
请选择
+
+
+
+
+
+
A
+
+
+
B
+
+
+
C
+
+
+
+
+
+
+
+
" +`; diff --git a/packages/varlet-vue2-ui/src/picker/__tests__/component.spec.js b/packages/varlet-vue2-ui/src/picker/__tests__/component.spec.js index a01cef0..eb9503c 100644 --- a/packages/varlet-vue2-ui/src/picker/__tests__/component.spec.js +++ b/packages/varlet-vue2-ui/src/picker/__tests__/component.spec.js @@ -3,144 +3,159 @@ import VarPicker from '../Picker' import Vue from 'vue' import { mount } from '@vue/test-utils' import { delay, mockTranslate, trigger } from '../../utils/jest' +import example from '../example' test('test picker component plugin', () => { Vue.use(Picker.Component) expect(Vue.component(Picker.Component.name)).toBeTruthy() }) -// const columns = [['A', 'B', 'C']] - -// const triggerDrag = async (element, x, y) => { -// await trigger(element, 'touchstart', 0, 0) -// await trigger(element, 'touchmove', x / 4, y / 4) -// await trigger(element, 'touchmove', x / 3, y / 3) -// await trigger(element, 'touchmove', x / 2, y / 2) -// await trigger(element, 'touchmove', x, y) -// await delay(300) -// await trigger(element, 'touchend', x, y) -// } - -// test('test scroll up & onConfirm', async () => { -// const { mockRestore } = mockTranslate() -// const onConfirm = jest.fn() - -// const wrapper = mount(VarPicker, { -// props: { -// columns, -// onConfirm, -// }, -// }) -// expect(wrapper.html()).toMatchSnapshot() -// const { element } = wrapper.find('.var-picker__column') - -// await triggerDrag(element, 0, -600) -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.find('.var-picker__confirm-button').trigger('click') -// expect(onConfirm).lastCalledWith(['C'], [2]) - -// mockRestore() -// wrapper.unmount() -// }) - -// test('test scroll down & onCancel', async () => { -// const { mockRestore } = mockTranslate() -// const onCancel = jest.fn() - -// const wrapper = mount(VarPicker, { -// props: { -// columns, -// onCancel, -// }, -// }) -// expect(wrapper.html()).toMatchSnapshot() -// const { element } = wrapper.find('.var-picker__column') - -// await triggerDrag(element, 0, 600) -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.find('.var-picker__cancel-button').trigger('click') -// expect(onCancel).lastCalledWith(['A'], [0]) - -// mockRestore() -// wrapper.unmount() -// }) - -// test('test confirm & cancel method', async () => { -// const { mockRestore } = mockTranslate() -// const onCancel = jest.fn() -// const onConfirm = jest.fn() - -// const wrapper = mount(VarPicker, { -// props: { -// columns, -// onConfirm, -// onCancel, -// }, -// }) - -// wrapper.vm.confirm() -// wrapper.vm.cancel() - -// expect(onCancel).lastCalledWith(['A'], [0]) -// expect(onConfirm).lastCalledWith(['A'], [0]) - -// mockRestore() -// wrapper.unmount() -// }) - -// test('test cascade mode', async () => { -// const { mockRestore } = mockTranslate() -// const onConfirm = jest.fn() - -// const wrapper = mount(VarPicker, { -// props: { -// cascade: true, -// columns: [ -// { -// text: '成都市', -// children: [ -// { -// text: '温江区', -// }, -// { -// text: '金牛区', -// }, -// ], -// }, -// { -// text: '无锡市', -// children: [ -// { -// text: '新吴区', -// }, -// { -// text: '惠山区', -// }, -// ], -// }, -// ], -// onConfirm, -// }, -// }) - -// let columns = wrapper.findAll('.var-picker__column') -// expect(wrapper.html()).toMatchSnapshot() -// expect(columns.length).toBe(2) - -// const confirmButton = wrapper.find('.var-picker__confirm-button') - -// await triggerDrag(columns[0].element, 0, -44) -// await confirmButton.trigger('click') -// expect(onConfirm).lastCalledWith(['无锡市', '新吴区'], [1, 0]) - -// // find elements again for rebuild children -// columns = wrapper.findAll('.var-picker__column') -// await triggerDrag(columns[1].element, 0, -44) -// await confirmButton.trigger('click') -// expect(onConfirm).lastCalledWith(['无锡市', '惠山区'], [1, 1]) - -// mockRestore() -// wrapper.unmount() -// }) +test('test picker example', () => { + const wrapper = mount(example) + expect(wrapper.html()).toMatchSnapshot() + wrapper.destroy() +}) + +const columns = [['A', 'B', 'C']] + +const triggerDrag = async (element, x, y) => { + await trigger(element, 'touchstart', 0, 0) + await trigger(element, 'touchmove', x / 4, y / 4) + await trigger(element, 'touchmove', x / 3, y / 3) + await trigger(element, 'touchmove', x / 2, y / 2) + await trigger(element, 'touchmove', x, y) + await delay(300) + await trigger(element, 'touchend', x, y) +} + +test('test scroll up & onConfirm', async () => { + const { mockRestore } = mockTranslate() + const onConfirm = jest.fn() + + const wrapper = mount(VarPicker, { + propsData: { + columns, + }, + listeners: { + confirm: onConfirm, + }, + }) + expect(wrapper.html()).toMatchSnapshot() + const { element } = wrapper.find('.var-picker__column') + + await triggerDrag(element, 0, -600) + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.find('.var-picker__confirm-button').trigger('click') + expect(onConfirm).lastCalledWith(['C'], [2]) + + mockRestore() + wrapper.destroy() +}) + +test('test scroll down & onCancel', async () => { + const { mockRestore } = mockTranslate() + const onCancel = jest.fn() + + const wrapper = mount(VarPicker, { + propsData: { + columns, + }, + listeners: { + cancel: onCancel, + }, + }) + expect(wrapper.html()).toMatchSnapshot() + const { element } = wrapper.find('.var-picker__column') + + await triggerDrag(element, 0, 600) + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.find('.var-picker__cancel-button').trigger('click') + expect(onCancel).lastCalledWith(['A'], [0]) + + mockRestore() + wrapper.destroy() +}) + +test('test confirm & cancel method', async () => { + const { mockRestore } = mockTranslate() + const onCancel = jest.fn() + const onConfirm = jest.fn() + + const wrapper = mount(VarPicker, { + propsData: { + columns, + }, + listeners: { + confirm: onConfirm, + cancel: onCancel, + }, + }) + + wrapper.vm.confirm() + wrapper.vm.cancel() + + expect(onCancel).lastCalledWith(['A'], [0]) + expect(onConfirm).lastCalledWith(['A'], [0]) + + mockRestore() + wrapper.destroy() +}) + +test('test cascade mode', async () => { + const { mockRestore } = mockTranslate() + const onConfirm = jest.fn() + + const wrapper = mount(VarPicker, { + propsData: { + cascade: true, + columns: [ + { + text: '成都市', + children: [ + { + text: '温江区', + }, + { + text: '金牛区', + }, + ], + }, + { + text: '无锡市', + children: [ + { + text: '新吴区', + }, + { + text: '惠山区', + }, + ], + }, + ], + }, + listeners: { + confirm: onConfirm, + }, + }) + + let columns = wrapper.findAll('.var-picker__column') + expect(wrapper.html()).toMatchSnapshot() + expect(columns.length).toBe(2) + + const confirmButton = wrapper.find('.var-picker__confirm-button') + + await triggerDrag(columns.at(0).element, 0, -44) + await confirmButton.trigger('click') + expect(onConfirm).lastCalledWith(['无锡市', '新吴区'], [1, 0]) + + // find elements again for rebuild children + columns = wrapper.findAll('.var-picker__column') + await triggerDrag(columns.at(1).element, 0, -44) + await confirmButton.trigger('click') + expect(onConfirm).lastCalledWith(['无锡市', '惠山区'], [1, 1]) + + mockRestore() + wrapper.destroy() +}) diff --git a/packages/varlet-vue2-ui/src/picker/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/picker/__tests__/index.spec.js index 543289d..4813949 100644 --- a/packages/varlet-vue2-ui/src/picker/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/picker/__tests__/index.spec.js @@ -8,68 +8,68 @@ test('test picker plugin', () => { expect(Vue.component(VarPicker.name)).toBeTruthy() }) -// const columns = [['A', 'B', 'C']] - -// test('test picker functional show & close', async () => { -// const onOpen = jest.fn() -// const onOpened = jest.fn() -// const onClose = jest.fn() -// const onClosed = jest.fn() - -// Picker({ -// columns, -// onOpen, -// onOpened, -// onClose, -// onClosed, -// }) - -// await delay(16) -// expect(onOpen).toHaveBeenCalledTimes(1) -// expect(document.querySelector('.var-popup').style.display).toBe('') - -// await delay(300) -// expect(onOpened).toHaveBeenCalledTimes(1) - -// Picker.close() -// await delay(16) -// expect(onClose).toHaveBeenCalledTimes(1) - -// await delay(300) -// expect(document.querySelector('.var-popup')).toBeFalsy() -// expect(onClosed).toHaveBeenCalledTimes(1) -// }) - -// test('test picker functional confirm', async () => { -// const onConfirm = jest.fn() - -// Picker({ -// columns, -// onConfirm, -// }) -// await delay(16) -// await delay(300) - -// await trigger(document.querySelector('.var-picker__confirm-button'), 'click') -// expect(onConfirm).toHaveBeenCalledTimes(1) - -// await delay(16) -// await delay(300) -// }) - -// test('test picker functional cancel', async () => { -// const onCancel = jest.fn() - -// Picker({ -// columns, -// onCancel, -// }) -// await delay(16) -// await delay(300) - -// await trigger(document.querySelector('.var-picker__cancel-button'), 'click') -// expect(onCancel).toHaveBeenCalledTimes(1) - -// await delay(16) -// await delay(300) -// }) +const columns = [['A', 'B', 'C']] + +test('test picker functional show & close', async () => { + const onOpen = jest.fn() + const onOpened = jest.fn() + const onClose = jest.fn() + const onClosed = jest.fn() + + Picker({ + columns, + onOpen, + onOpened, + onClose, + onClosed, + }) + + await delay(16) + expect(onOpen).toHaveBeenCalledTimes(1) + expect(document.querySelector('.var-popup').style.display).toBe('') + + await delay(300) + expect(onOpened).toHaveBeenCalledTimes(1) + + Picker.close() + await delay(16) + expect(onClose).toHaveBeenCalledTimes(1) + + await delay(300) + expect(document.querySelector('.var-popup')).toBeFalsy() + expect(onClosed).toHaveBeenCalledTimes(1) +}) + +test('test picker functional confirm', async () => { + const onConfirm = jest.fn() + + Picker({ + columns, + onConfirm, + }) + await delay(16) + await delay(300) + + await trigger(document.querySelector('.var-picker__confirm-button'), 'click') + expect(onConfirm).toHaveBeenCalledTimes(1) + + await delay(16) + await delay(300) +}) + +test('test picker functional cancel', async () => { + const onCancel = jest.fn() + + Picker({ + columns, + onCancel, + }) + await delay(16) + await delay(300) + + await trigger(document.querySelector('.var-picker__cancel-button'), 'click') + expect(onCancel).toHaveBeenCalledTimes(1) + + await delay(16) + await delay(300) +}) From c80a609d2100d015af62bddc45b778ae90273aa5 Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Wed, 16 Mar 2022 22:22:51 +0800 Subject: [PATCH 05/18] test(ui/time-picker): update snap --- .../src/time-picker/TimePicker.vue | 2 +- .../__snapshots__/index.spec.js.snap | 458 ++++++++++++++++++ .../src/time-picker/__tests__/index.spec.js | 390 +++++++-------- 3 files changed, 654 insertions(+), 196 deletions(-) diff --git a/packages/varlet-vue2-ui/src/time-picker/TimePicker.vue b/packages/varlet-vue2-ui/src/time-picker/TimePicker.vue index 2753a85..d141665 100644 --- a/packages/varlet-vue2-ui/src/time-picker/TimePicker.vue +++ b/packages/varlet-vue2-ui/src/time-picker/TimePicker.vue @@ -299,7 +299,7 @@ export default defineComponent({ return } - if (this.type === 'minute' && this.useSeconds && this.sChosenUsableMinute) { + if (this.type === 'minute' && this.useSeconds && this.isChosenUsableMinute) { this.type = 'second' } }, diff --git a/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap index fc22818..39192f4 100644 --- a/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap @@ -1,5 +1,147 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`test max and min 1`] = ` +"
+
+
+
+ 11 +
: +
+ 11 +
+ + +
+
+
+ AM +
+
+ PM +
+
+
+
+
+ +
+
+
+ 12 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
+ 11 +
+ +
+
+
+
+
" +`; + +exports[`test max and min 2`] = ` +"
+
+
+
+ 11 +
: +
+ 11 +
+ + +
+
+
+ AM +
+
+ PM +
+
+
+
+
+ +
+
+
+ 12 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
+ 11 +
+ +
+
+
+
+
" +`; + exports[`test timePicker example 1`] = ` "
@@ -522,3 +664,319 @@ exports[`test timePicker example 1`] = `
" `; + +exports[`test timePicker style and format 1`] = ` +"
+
+
+
+ 05 +
: +
+ 10 +
+ + +
+
+
+ AM +
+
+ PM +
+
+
+
+
+ +
+
+
+ 12 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
+ 11 +
+ +
+
+
+
+
" +`; + +exports[`test timePicker style and format 2`] = ` +"
+
+
+
+ 05 +
: +
+ 10 +
+ + +
+ +
+
+
+ +
+
+
+ 12 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
+ 11 +
+
+
+ 00 +
+
+ 13 +
+
+ 14 +
+
+ 15 +
+
+ 16 +
+
+ 17 +
+
+ 18 +
+
+ 19 +
+
+ 20 +
+
+ 21 +
+
+ 22 +
+
+ 23 +
+
+
+
+
+
+
" +`; + +exports[`test useSeconds prop 1`] = ` +"
+
+
+
+ 11 +
: +
+ 11 +
: +
+ 00 +
+
+
+
+ AM +
+
+ PM +
+
+
+
+
+ +
+
+
+ 12 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
+ 11 +
+ +
+
+
+
+
" +`; + +exports[`test useSeconds prop 2`] = ` +"
+
+
+
+ 11 +
: +
+ 11 +
: +
+ 00 +
+
+
+
+ AM +
+
+ PM +
+
+
+
+
+ +
+
+
+ 12 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
+ 11 +
+ +
+
+
+
+
" +`; diff --git a/packages/varlet-vue2-ui/src/time-picker/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/time-picker/__tests__/index.spec.js index 76c2798..a8a0fff 100644 --- a/packages/varlet-vue2-ui/src/time-picker/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/time-picker/__tests__/index.spec.js @@ -16,198 +16,198 @@ test('test timePicker plugin', () => { expect(Vue.component(TimePicker.name)).toBeTruthy() }) -// test('test timePicker style and format', async () => { -// const template = ` -// -// ` -// const wrapper = mount({ -// components: { -// [VarTimePicker.name]: VarTimePicker, -// }, -// data() { -// return { -// format: 'ampm', -// time: '05:10', -// } -// }, -// template, -// }) - -// await delay(0) - -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.setData({ format: '24hr' }) - -// expect(wrapper.html()).toMatchSnapshot() -// }) - -// test('test max and min', async () => { -// const template = `` -// const wrapper = mount({ -// components: { -// [VarTimePicker.name]: VarTimePicker, -// }, -// data() { -// return { -// time: '11:11', -// max: '11:11', -// min: undefined, -// } -// }, -// template, -// }) - -// await delay(0) -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.setData({ max: undefined, min: '11:11' }) -// await delay(200) -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.setData({ max: '11:11', min: '11:11' }) -// await delay(200) -// const text = wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '') -// expect(text).toBe('11:11') - -// const el = wrapper.find('.var-time-picker-clock__container') -// await trigger(el, 'touchstart', 50, 30) -// await trigger(el, 'touchmove', 60, 25) -// await trigger(el, 'touchend', 60, 25) - -// await delay(200) -// expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') - -// await wrapper.find('.var-time-picker-title__btn').trigger('click') -// await wrapper.find('.var-time-picker-clock__item').trigger('click') - -// expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') -// }) - -// test('test useSeconds prop', () => { -// const wrapper = mount(VarTimePicker, { -// propsData: { -// modelValue: '11:11', -// useSeconds: true, -// }, -// }) - -// expect(wrapper.html()).toMatchSnapshot() -// }) - -// test('test readonly prop', async () => { -// const template = `` -// const wrapper = mount({ -// components: { -// [VarTimePicker.name]: VarTimePicker, -// }, -// data() { -// return { -// time: '11:11', -// } -// }, -// template, -// }) - -// await delay(0) - -// const el = wrapper.find('.var-time-picker-clock__container') - -// await trigger(el, 'touchstart', 40, 30) -// await trigger(el, 'touchmove', 20, 25) -// await trigger(el, 'touchend', 30, 25) - -// await delay(200) -// expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') - -// await wrapper.find('.var-time-picker-title__btn').trigger('click') -// await wrapper.find('.var-time-picker-clock__item').trigger('click') - -// expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') -// }) - -// test('test v-model and onChange event', async () => { -// const change = jest.fn() - -// const template = `` -// const wrapper = mount({ -// components: { -// [VarTimePicker.name]: VarTimePicker, -// }, -// data() { -// return { -// time: '11:11:11', -// } -// }, -// methods: { -// change, -// }, -// template, -// }) - -// await delay(0) - -// const el = wrapper.find('.var-time-picker-clock__container') - -// await trigger(el, 'touchstart', 40, 30) -// await trigger(el, 'touchmove', 20, 25) -// await trigger(el, 'touchend', 30, 25) - -// await delay(200) -// expect(wrapper.find('.var-time-picker-title__time').text()).not.toBe('11:11:11') -// expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(1).text()).toBe('11') -// expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).text()).toBe('11') - -// await wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(1).trigger('click') -// await delay(200) -// await trigger(el, 'touchstart', 40, 30) -// await trigger(el, 'touchmove', 20, 25) -// await trigger(el, 'touchend', 30, 25) -// expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(1).text()).not.toBe( -// '11' -// ) -// expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).text()).toBe('11') - -// await wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).trigger('click') -// await delay(200) -// await trigger(el, 'touchstart', 40, 30) -// await trigger(el, 'touchmove', 20, 25) -// await trigger(el, 'touchend', 30, 25) -// expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).text()).not.toBe( -// '11' -// ) -// expect(wrapper.vm.time).not.toBe('11:11:11') -// expect(change).toHaveBeenCalled() -// }) - -// test('test switch timePicker ampm', async () => { -// const template = `` -// const wrapper = mount({ -// components: { -// [VarTimePicker.name]: VarTimePicker, -// }, -// data() { -// return { -// format: 'ampm', -// time: '05:10:22', -// min: '2:38:38', -// } -// }, -// template, -// }) - -// await delay(0) -// await wrapper.find('.var-time-picker-title__ampm').findAll('.var-time-picker-title__btn').at(1).trigger('click') -// expect(wrapper.vm.time).toBe('17:10:22') - -// await wrapper.setData({ min: '6:00:00' }) -// await wrapper.find('.var-time-picker-title__ampm').findAll('.var-time-picker-title__btn').at(0).trigger('click') - -// expect(wrapper.vm.time).toBe('06:10:22') -// }) +test('test timePicker style and format', async () => { + const template = ` + + ` + const wrapper = mount({ + components: { + [VarTimePicker.name]: VarTimePicker, + }, + data() { + return { + format: 'ampm', + time: '05:10', + } + }, + template, + }) + + await delay(0) + + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.setData({ format: '24hr' }) + + expect(wrapper.html()).toMatchSnapshot() +}) + +test('test max and min', async () => { + const template = `` + const wrapper = mount({ + components: { + [VarTimePicker.name]: VarTimePicker, + }, + data() { + return { + time: '11:11', + max: '11:11', + min: undefined, + } + }, + template, + }) + + await delay(0) + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.setData({ max: undefined, min: '11:11' }) + await delay(200) + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.setData({ max: '11:11', min: '11:11' }) + await delay(200) + const text = wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '') + expect(text).toBe('11:11') + + const el = wrapper.find('.var-time-picker-clock__container') + await trigger(el, 'touchstart', 50, 30) + await trigger(el, 'touchmove', 60, 25) + await trigger(el, 'touchend', 60, 25) + + await delay(200) + expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') + + await wrapper.find('.var-time-picker-title__btn').trigger('click') + await wrapper.find('.var-time-picker-clock__item').trigger('click') + + expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') +}) + +test('test useSeconds prop', () => { + const wrapper = mount(VarTimePicker, { + propsData: { + value: '11:11', + useSeconds: true, + }, + }) + + expect(wrapper.html()).toMatchSnapshot() +}) + +test('test readonly prop', async () => { + const template = `` + const wrapper = mount({ + components: { + [VarTimePicker.name]: VarTimePicker, + }, + data() { + return { + time: '11:11', + } + }, + template, + }) + + await delay(0) + + const el = wrapper.find('.var-time-picker-clock__container') + + await trigger(el, 'touchstart', 40, 30) + await trigger(el, 'touchmove', 20, 25) + await trigger(el, 'touchend', 30, 25) + + await delay(200) + expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') + + await wrapper.find('.var-time-picker-title__btn').trigger('click') + await wrapper.find('.var-time-picker-clock__item').trigger('click') + + expect(wrapper.find('.var-time-picker-title__time').text().replace(/\s+/g, '')).toBe('11:11') +}) + +test('test v-model and onChange event', async () => { + const change = jest.fn() + + const template = `` + const wrapper = mount({ + components: { + [VarTimePicker.name]: VarTimePicker, + }, + data() { + return { + time: '11:11:11', + } + }, + methods: { + change, + }, + template, + }) + + await delay(0) + + const el = wrapper.find('.var-time-picker-clock__container') + + await trigger(el, 'touchstart', 40, 30) + await trigger(el, 'touchmove', 20, 25) + await trigger(el, 'touchend', 30, 25) + + await delay(200) + expect(wrapper.find('.var-time-picker-title__time').text()).not.toBe('11:11:11') + expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(1).text()).toBe('11') + expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).text()).toBe('11') + + await wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(1).trigger('click') + await delay(200) + await trigger(el, 'touchstart', 40, 30) + await trigger(el, 'touchmove', 20, 25) + await trigger(el, 'touchend', 30, 25) + expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(1).text()).not.toBe( + '11' + ) + expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).text()).toBe('11') + + await wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).trigger('click') + await delay(200) + await trigger(el, 'touchstart', 40, 30) + await trigger(el, 'touchmove', 20, 25) + await trigger(el, 'touchend', 30, 25) + expect(wrapper.find('.var-time-picker-title__time').findAll('.var-time-picker-title__btn').at(2).text()).not.toBe( + '11' + ) + expect(wrapper.vm.time).not.toBe('11:11:11') + expect(change).toHaveBeenCalled() +}) + +test('test switch timePicker ampm', async () => { + const template = `` + const wrapper = mount({ + components: { + [VarTimePicker.name]: VarTimePicker, + }, + data() { + return { + format: 'ampm', + time: '05:10:22', + min: '2:38:38', + } + }, + template, + }) + + await delay(0) + await wrapper.find('.var-time-picker-title__ampm').findAll('.var-time-picker-title__btn').at(1).trigger('click') + expect(wrapper.vm.time).toBe('17:10:22') + + await wrapper.setData({ min: '6:00:00' }) + await wrapper.find('.var-time-picker-title__ampm').findAll('.var-time-picker-title__btn').at(0).trigger('click') + + expect(wrapper.vm.time).toBe('06:10:22') +}) From 45a9f122826bd54f55e5c26f6ae438ff373fcf6b Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Wed, 16 Mar 2022 22:29:35 +0800 Subject: [PATCH 06/18] test(ui/time-picker): update snap --- .../__snapshots__/index.spec.js.snap | 72 ------------------- 1 file changed, 72 deletions(-) diff --git a/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap index 39192f4..a6ad9f1 100644 --- a/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/time-picker/__tests__/__snapshots__/index.spec.js.snap @@ -908,75 +908,3 @@ exports[`test useSeconds prop 1`] = `
" `; - -exports[`test useSeconds prop 2`] = ` -"
-
-
-
- 11 -
: -
- 11 -
: -
- 00 -
-
-
-
- AM -
-
- PM -
-
-
-
-
- -
-
-
- 12 -
-
- 1 -
-
- 2 -
-
- 3 -
-
- 4 -
-
- 5 -
-
- 6 -
-
- 7 -
-
- 8 -
-
- 9 -
-
- 10 -
-
- 11 -
- -
-
-
-
-
" -`; From bdf49ee65be12ac9fc77ccbd66ca738ecc25e3d3 Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Wed, 16 Mar 2022 22:35:49 +0800 Subject: [PATCH 07/18] test(ui/style-provider): update snap --- .../style-provider/__tests__/index.spec.js | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/varlet-vue2-ui/src/style-provider/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/style-provider/__tests__/index.spec.js index e214cc2..778883d 100644 --- a/packages/varlet-vue2-ui/src/style-provider/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/style-provider/__tests__/index.spec.js @@ -14,25 +14,25 @@ test('test styleProvider plugin', () => { expect(Vue.component(VarStyleProvider.name)).toBeTruthy() }) -// test('test styleProvider functional', async () => { -// StyleProvider({ -// 'cell-font-size': '30px', -// }) +test('test styleProvider functional', async () => { + StyleProvider({ + 'cell-font-size': '30px', + }) -// await delay(0) -// expect(getComputedStyle(document.documentElement).getPropertyValue('--cell-font-size')).toBe('30px') -// }) + await delay(0) + expect(getComputedStyle(document.documentElement).getPropertyValue('--cell-font-size')).toBe('30px') +}) -// test('test styleProvider component', async () => { -// const wrapper = mount(VarStyleProvider) +test('test styleProvider component', async () => { + const wrapper = mount(VarStyleProvider) -// const el = wrapper.find('.var-style-provider') -// expect(el.exists()).toBe(true) + const el = wrapper.find('.var-style-provider') + expect(el.exists()).toBe(true) -// await wrapper.setProps({ -// styleVars: { -// 'cell-font-size': '30px', -// }, -// }) -// expect(el.attributes('style')).toBe('--cell-font-size: 30px;') -// }) + await wrapper.setProps({ + styleVars: { + 'cell-font-size': '30px', + }, + }) + expect(el.attributes('style')).toBe('--cell-font-size: 30px;') +}) From 9d7c27d21c33e9480df0e0962e8744cf3f6703b8 Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Wed, 16 Mar 2022 22:40:44 +0800 Subject: [PATCH 08/18] test(ui/rate): update snap --- .../__snapshots__/index.spec.js.snap | 98 +++++++ .../src/rate/__tests__/index.spec.js | 246 +++++++++--------- 2 files changed, 221 insertions(+), 123 deletions(-) diff --git a/packages/varlet-vue2-ui/src/rate/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/rate/__tests__/__snapshots__/index.spec.js.snap index 21c5998..10e16df 100644 --- a/packages/varlet-vue2-ui/src/rate/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/rate/__tests__/__snapshots__/index.spec.js.snap @@ -1,5 +1,55 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`test rate count 1`] = ` +"
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
" +`; + +exports[`test rate disabled & readonly 1`] = ` +"
+
+
+
+
+
+
+
+ + + +
" +`; + +exports[`test rate disabled & readonly 2`] = ` +"
+
+
+
+
+
+
+
+ + + +
" +`; + exports[`test rate example 1`] = ` "
基础评分
@@ -289,3 +339,51 @@ exports[`test rate example 1`] = `
" `; + +exports[`test rate gap 1`] = ` +"
+
+
+
+
+
+
+
+ + + +
" +`; + +exports[`test rate validation 1`] = ` +"
+
+
+
+
+
+
+
+ +
+
至少选择一分
+
+
+
+
" +`; + +exports[`test rate validation 2`] = ` +"
+
+
+
+
+
+
+
+ + + +
" +`; diff --git a/packages/varlet-vue2-ui/src/rate/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/rate/__tests__/index.spec.js index 7cfd0c0..072fa7a 100644 --- a/packages/varlet-vue2-ui/src/rate/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/rate/__tests__/index.spec.js @@ -18,126 +18,126 @@ test('test rate plugin', () => { expect(Vue.component(Rate.name)).toBeTruthy() }) -// test('test rate onChange', async () => { -// const onChange = jest.fn() -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarRate, { -// propsData: { -// value: 0, -// }, -// listeners: { -// change: onChange, -// input: onInput, -// }, -// }) - -// await wrapper.find('.var-rate__content').trigger('click') -// expect(onChange).toHaveBeenCalledTimes(1) -// expect(wrapper.props('value')).toBe(1) - -// wrapper.destroy() -// }) - -// test('test rate half', async () => { -// const onChange = jest.fn() -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarRate, { -// propsData: { -// half: true, -// value: 0, -// }, -// listeners: { -// change: onChange, -// input: onInput, -// }, -// }) - -// await trigger(wrapper.find('.var-rate__content'), 'click') -// expect(onChange).toHaveBeenCalledTimes(1) -// expect(wrapper.props('value')).toBe(0.5) - -// wrapper.destroy() -// }) - -// test('test rate validation', async () => { -// const onChange = jest.fn() -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarRate, { -// propsData: { -// value: 0, -// rules: [(v) => v >= 1 || '至少选择一分'], -// }, -// listeners: { -// change: onChange, -// input: onInput, -// }, -// }) - -// wrapper.vm.validate() -// await delay(16) - -// expect(wrapper.find('.var-form-details__message').text()).toBe('至少选择一分') -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.find('.var-rate__content').trigger('click') -// await delay(16) -// expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.vm.reset() -// await delay(16) -// expect(wrapper.props('value')).toBe(0) - -// wrapper.destroy() -// }) - -// test('test rate disabled & readonly', async () => { -// const onChange = jest.fn() - -// const wrapper = mount(VarRate, { -// propsData: { -// disabled: true, -// readonly: false, -// }, -// listeners: { -// change: onChange, -// }, -// }) - -// await wrapper.find('.var-rate__content').trigger('click') -// expect(wrapper.html()).toMatchSnapshot() -// expect(onChange).toHaveBeenCalledTimes(0) - -// await wrapper.setProps({ disabled: false, readonly: true }) -// await wrapper.find('.var-rate__content').trigger('click') -// expect(wrapper.html()).toMatchSnapshot() -// expect(onChange).toHaveBeenCalledTimes(0) -// }) - -// test('test rate count', () => { -// const wrapper = mount(VarRate, { -// propsData: { -// count: 10, -// }, -// }) - -// expect(wrapper.findAll('.var-rate__content').length).toBe(10) -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.destroy() -// }) - -// test('test rate gap', () => { -// const wrapper = mount(VarRate, { -// propsData: { -// gap: 10, -// }, -// }) - -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.destroy() -// }) +test('test rate onChange', async () => { + const onChange = jest.fn() + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarRate, { + propsData: { + value: 0, + }, + listeners: { + change: onChange, + input: onInput, + }, + }) + + await wrapper.find('.var-rate__content').trigger('click') + expect(onChange).toHaveBeenCalledTimes(1) + expect(wrapper.props('value')).toBe(1) + + wrapper.destroy() +}) + +test('test rate half', async () => { + const onChange = jest.fn() + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarRate, { + propsData: { + half: true, + value: 0, + }, + listeners: { + change: onChange, + input: onInput, + }, + }) + + await trigger(wrapper.find('.var-rate__content'), 'click') + expect(onChange).toHaveBeenCalledTimes(1) + expect(wrapper.props('value')).toBe(0.5) + + wrapper.destroy() +}) + +test('test rate validation', async () => { + const onChange = jest.fn() + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarRate, { + propsData: { + value: 0, + rules: [(v) => v >= 1 || '至少选择一分'], + }, + listeners: { + change: onChange, + input: onInput, + }, + }) + + wrapper.vm.validate() + await delay(16) + + expect(wrapper.find('.var-form-details__message').text()).toBe('至少选择一分') + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.find('.var-rate__content').trigger('click') + await delay(16) + expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() + expect(wrapper.html()).toMatchSnapshot() + + wrapper.vm.reset() + await delay(16) + expect(wrapper.props('value')).toBe(0) + + wrapper.destroy() +}) + +test('test rate disabled & readonly', async () => { + const onChange = jest.fn() + + const wrapper = mount(VarRate, { + propsData: { + disabled: true, + readonly: false, + }, + listeners: { + change: onChange, + }, + }) + + await wrapper.find('.var-rate__content').trigger('click') + expect(wrapper.html()).toMatchSnapshot() + expect(onChange).toHaveBeenCalledTimes(0) + + await wrapper.setProps({ disabled: false, readonly: true }) + await wrapper.find('.var-rate__content').trigger('click') + expect(wrapper.html()).toMatchSnapshot() + expect(onChange).toHaveBeenCalledTimes(0) +}) + +test('test rate count', () => { + const wrapper = mount(VarRate, { + propsData: { + count: 10, + }, + }) + + expect(wrapper.findAll('.var-rate__content').length).toBe(10) + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +}) + +test('test rate gap', () => { + const wrapper = mount(VarRate, { + propsData: { + gap: 10, + }, + }) + + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +}) From d75d7bb5c0f3960ef9d2a4d5bc9b5c026cf548de Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Wed, 16 Mar 2022 22:47:25 +0800 Subject: [PATCH 09/18] test(ui/checkbox): update snap --- .../__snapshots__/index.spec.js.snap | 124 ++++ .../checkbox-group/__tests__/index.spec.js | 626 +++++++++--------- 2 files changed, 437 insertions(+), 313 deletions(-) diff --git a/packages/varlet-vue2-ui/src/checkbox-group/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/checkbox-group/__tests__/__snapshots__/index.spec.js.snap index 1cb916d..74bbb4c 100644 --- a/packages/varlet-vue2-ui/src/checkbox-group/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/checkbox-group/__tests__/__snapshots__/index.spec.js.snap @@ -139,3 +139,127 @@ exports[`test checkbox example 1`] = `
" `; + +exports[`test checkbox group layout direction 1`] = ` +"
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+ + + +
+
+ + + +
" +`; + +exports[`test checkbox group validation 1`] = ` +"
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+ + + +
+
+ +
+
至少选一个
+
+
+
+
" +`; + +exports[`test checkbox group validation 2`] = ` +"
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+ + + +
+
+ + + +
" +`; + +exports[`test checkbox validation 1`] = ` +"
+
+
+
+
+
+ +
+
您必须勾选
+
+
+
+
" +`; + +exports[`test checkbox validation 2`] = ` +"
+
+
+ +
+
+
+ + + +
" +`; diff --git a/packages/varlet-vue2-ui/src/checkbox-group/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/checkbox-group/__tests__/index.spec.js index 943f73f..dcfffd1 100644 --- a/packages/varlet-vue2-ui/src/checkbox-group/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/checkbox-group/__tests__/index.spec.js @@ -23,316 +23,316 @@ test('test checkbox plugin', () => { expect(Vue.component(Checkbox.name)).toBeTruthy() }) -// test('test checkbox check value', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarCheckbox, { -// propsData: { -// value: false, -// }, -// listeners: { -// input: onInput, -// }, -// }) - -// await wrapper.find('.var-checkbox').trigger('click') -// expect(onInput).lastCalledWith(true) -// expect(wrapper.props('value')).toBe(true) - -// await wrapper.find('.var-checkbox').trigger('click') -// expect(onInput).lastCalledWith(false) -// expect(wrapper.props('value')).toBe(false) - -// wrapper.destroy() -// }) - -// test('test checkbox check value with custom value', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarCheckbox, { -// propsData: { -// value: 0, -// uncheckedValue: 0, -// checkedValue: 1, -// }, -// listeners: { -// input: onInput, -// }, -// }) - -// await wrapper.find('.var-checkbox').trigger('click') -// expect(onInput).lastCalledWith(1) -// expect(wrapper.props('value')).toBe(1) - -// wrapper.destroy() -// }) - -// test('test checkbox onClick & onChange', async () => { -// const onClick = jest.fn() -// const onChange = jest.fn() - -// const wrapper = mount(VarCheckbox, { -// propsData: { -// value: false, -// }, -// listeners: { -// click: onClick, -// change: onChange, -// }, -// }) - -// await wrapper.find('.var-checkbox').trigger('click') -// expect(onClick).toHaveBeenCalledTimes(1) -// expect(onChange).lastCalledWith(true) - -// wrapper.destroy() -// }) - -// test('test checkbox toggle method', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarCheckbox, { -// propsData: { -// value: false, -// }, -// listeners: { -// input: onInput, -// }, -// }) - -// wrapper.vm.toggle() -// await delay(16) - -// expect(onInput).lastCalledWith(true) -// expect(wrapper.props('value')).toBe(true) - -// wrapper.destroy() -// }) - -// test('test checkbox disabled', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) -// const onClick = jest.fn() -// const onChange = jest.fn() - -// const wrapper = mount(VarCheckbox, { -// propsData: { -// value: false, -// disabled: true, -// }, -// listeners: { -// click: onClick, -// change: onChange, -// input: onInput, -// }, -// }) - -// await wrapper.find('.var-checkbox').trigger('click') - -// expect(onInput).toHaveBeenCalledTimes(0) -// expect(onClick).toHaveBeenCalledTimes(0) -// expect(onChange).toHaveBeenCalledTimes(0) -// expect(wrapper.props('value')).toBe(false) - -// wrapper.destroy() -// }) - -// test('test checkbox readonly', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) -// const onClick = jest.fn() -// const onChange = jest.fn() - -// const wrapper = mount(VarCheckbox, { -// propsData: { -// value: false, -// readonly: true, -// }, -// listeners: { -// click: onClick, -// change: onChange, -// input: onInput, -// }, -// }) - -// await wrapper.find('.var-checkbox').trigger('click') - -// expect(onInput).toHaveBeenCalledTimes(0) -// expect(onClick).toHaveBeenCalledTimes(1) -// expect(onChange).toHaveBeenCalledTimes(0) -// expect(wrapper.props('value')).toBe(false) - -// wrapper.destroy() -// }) - -// test('test checkbox with checkbox group', async () => { -// const wrapper = mount({ -// components: { -// [VarCheckboxGroup.name]: VarCheckboxGroup, -// [VarCheckbox.name]: VarCheckbox, -// }, -// data: () => ({ -// value: [], -// }), -// template: ` -// -// -// -// -// `, -// }) - -// await wrapper.find('.var-checkbox').trigger('click') -// expect(wrapper.vm.value).toStrictEqual([1]) -// await wrapper.find('.var-checkbox').trigger('click') -// expect(wrapper.vm.value).toStrictEqual([]) - -// wrapper.destroy() -// }) - -// test('test checkbox validation', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarCheckbox, { -// propsData: { -// value: false, -// rules: [(v) => v || '您必须勾选'], -// }, -// listeners: { -// input: onInput, -// }, -// }) - -// wrapper.vm.validate() -// await delay(16) - -// expect(wrapper.find('.var-form-details__message').text()).toBe('您必须勾选') -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.find('.var-checkbox').trigger('click') -// await delay(16) - -// expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.vm.reset() -// await delay(16) -// expect(wrapper.props('value')).toBe(false) - -// wrapper.destroy() -// }) - -// test('test checkbox group max', async () => { -// const wrapper = mount({ -// components: { -// [VarCheckboxGroup.name]: VarCheckboxGroup, -// [VarCheckbox.name]: VarCheckbox, -// }, -// data: () => ({ -// value: [], -// }), -// template: ` -// -// -// -// -// `, -// }) - -// const checkboxes = wrapper.findAll('.var-checkbox') - -// await checkboxes.at(0).trigger('click') -// expect(wrapper.vm.value).toStrictEqual([1]) - -// await checkboxes.at(1).trigger('click') -// expect(wrapper.vm.value).toStrictEqual([1]) - -// wrapper.destroy() -// }) - -// test('test checkbox group validation', async () => { -// const wrapper = mount({ -// components: { -// [VarCheckboxGroup.name]: VarCheckboxGroup, -// [VarCheckbox.name]: VarCheckbox, -// }, -// data: () => ({ -// value: [], -// }), -// template: ` -// -// -// -// -// `, -// }) - -// const { checkboxGroup } = wrapper.vm.$refs - -// checkboxGroup.validate() -// await delay(16) -// expect(wrapper.find('.var-form-details__message').text()).toBe('至少选一个') -// expect(wrapper.html()).toMatchSnapshot() - -// checkboxGroup.reset() -// await delay(16) -// expect(wrapper.vm.value).toStrictEqual([]) - -// await wrapper.find('.var-checkbox').trigger('click') -// await delay(16) - -// expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.destroy() -// }) - -// test('test checkbox group checkAll & inverseAll methods', async () => { -// const wrapper = mount({ -// components: { -// [VarCheckboxGroup.name]: VarCheckboxGroup, -// [VarCheckbox.name]: VarCheckbox, -// }, -// data: () => ({ -// value: [1], -// }), -// template: ` -// -// -// -// -// `, -// }) - -// await delay(16) -// const { checkboxGroup } = wrapper.vm.$refs - -// checkboxGroup.inverseAll() -// await delay(16) -// expect(wrapper.vm.value).toStrictEqual([2]) - -// checkboxGroup.checkAll() -// await delay(16) -// expect(wrapper.vm.value).toStrictEqual([1, 2]) - -// wrapper.destroy() -// }) - -// test('test checkbox group layout direction', async () => { -// const wrapper = mount({ -// components: { -// [VarCheckboxGroup.name]: VarCheckboxGroup, -// [VarCheckbox.name]: VarCheckbox, -// }, -// data: () => ({ -// value: [], -// }), -// template: ` -// -// -// -// -// `, -// }) - -// expect(wrapper.html()).toMatchSnapshot() -// wrapper.destroy() -// }) +test('test checkbox check value', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarCheckbox, { + propsData: { + value: false, + }, + listeners: { + input: onInput, + }, + }) + + await wrapper.find('.var-checkbox').trigger('click') + expect(onInput).lastCalledWith(true) + expect(wrapper.props('value')).toBe(true) + + await wrapper.find('.var-checkbox').trigger('click') + expect(onInput).lastCalledWith(false) + expect(wrapper.props('value')).toBe(false) + + wrapper.destroy() +}) + +test('test checkbox check value with custom value', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarCheckbox, { + propsData: { + value: 0, + uncheckedValue: 0, + checkedValue: 1, + }, + listeners: { + input: onInput, + }, + }) + + await wrapper.find('.var-checkbox').trigger('click') + expect(onInput).lastCalledWith(1) + expect(wrapper.props('value')).toBe(1) + + wrapper.destroy() +}) + +test('test checkbox onClick & onChange', async () => { + const onClick = jest.fn() + const onChange = jest.fn() + + const wrapper = mount(VarCheckbox, { + propsData: { + value: false, + }, + listeners: { + click: onClick, + change: onChange, + }, + }) + + await wrapper.find('.var-checkbox').trigger('click') + expect(onClick).toHaveBeenCalledTimes(1) + expect(onChange).lastCalledWith(true) + + wrapper.destroy() +}) + +test('test checkbox toggle method', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarCheckbox, { + propsData: { + value: false, + }, + listeners: { + input: onInput, + }, + }) + + wrapper.vm.toggle() + await delay(16) + + expect(onInput).lastCalledWith(true) + expect(wrapper.props('value')).toBe(true) + + wrapper.destroy() +}) + +test('test checkbox disabled', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + const onClick = jest.fn() + const onChange = jest.fn() + + const wrapper = mount(VarCheckbox, { + propsData: { + value: false, + disabled: true, + }, + listeners: { + click: onClick, + change: onChange, + input: onInput, + }, + }) + + await wrapper.find('.var-checkbox').trigger('click') + + expect(onInput).toHaveBeenCalledTimes(0) + expect(onClick).toHaveBeenCalledTimes(0) + expect(onChange).toHaveBeenCalledTimes(0) + expect(wrapper.props('value')).toBe(false) + + wrapper.destroy() +}) + +test('test checkbox readonly', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + const onClick = jest.fn() + const onChange = jest.fn() + + const wrapper = mount(VarCheckbox, { + propsData: { + value: false, + readonly: true, + }, + listeners: { + click: onClick, + change: onChange, + input: onInput, + }, + }) + + await wrapper.find('.var-checkbox').trigger('click') + + expect(onInput).toHaveBeenCalledTimes(0) + expect(onClick).toHaveBeenCalledTimes(1) + expect(onChange).toHaveBeenCalledTimes(0) + expect(wrapper.props('value')).toBe(false) + + wrapper.destroy() +}) + +test('test checkbox with checkbox group', async () => { + const wrapper = mount({ + components: { + [VarCheckboxGroup.name]: VarCheckboxGroup, + [VarCheckbox.name]: VarCheckbox, + }, + data: () => ({ + value: [], + }), + template: ` + + + + + `, + }) + + await wrapper.find('.var-checkbox').trigger('click') + expect(wrapper.vm.value).toStrictEqual([1]) + await wrapper.find('.var-checkbox').trigger('click') + expect(wrapper.vm.value).toStrictEqual([]) + + wrapper.destroy() +}) + +test('test checkbox validation', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarCheckbox, { + propsData: { + value: false, + rules: [(v) => v || '您必须勾选'], + }, + listeners: { + input: onInput, + }, + }) + + wrapper.vm.validate() + await delay(16) + + expect(wrapper.find('.var-form-details__message').text()).toBe('您必须勾选') + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.find('.var-checkbox').trigger('click') + await delay(16) + + expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() + expect(wrapper.html()).toMatchSnapshot() + + wrapper.vm.reset() + await delay(16) + expect(wrapper.props('value')).toBe(false) + + wrapper.destroy() +}) + +test('test checkbox group max', async () => { + const wrapper = mount({ + components: { + [VarCheckboxGroup.name]: VarCheckboxGroup, + [VarCheckbox.name]: VarCheckbox, + }, + data: () => ({ + value: [], + }), + template: ` + + + + + `, + }) + + const checkboxes = wrapper.findAll('.var-checkbox') + + await checkboxes.at(0).trigger('click') + expect(wrapper.vm.value).toStrictEqual([1]) + + await checkboxes.at(1).trigger('click') + expect(wrapper.vm.value).toStrictEqual([1]) + + wrapper.destroy() +}) + +test('test checkbox group validation', async () => { + const wrapper = mount({ + components: { + [VarCheckboxGroup.name]: VarCheckboxGroup, + [VarCheckbox.name]: VarCheckbox, + }, + data: () => ({ + value: [], + }), + template: ` + + + + + `, + }) + + const { checkboxGroup } = wrapper.vm.$refs + + checkboxGroup.validate() + await delay(16) + expect(wrapper.find('.var-form-details__message').text()).toBe('至少选一个') + expect(wrapper.html()).toMatchSnapshot() + + checkboxGroup.reset() + await delay(16) + expect(wrapper.vm.value).toStrictEqual([]) + + await wrapper.find('.var-checkbox').trigger('click') + await delay(16) + + expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +}) + +test('test checkbox group checkAll & inverseAll methods', async () => { + const wrapper = mount({ + components: { + [VarCheckboxGroup.name]: VarCheckboxGroup, + [VarCheckbox.name]: VarCheckbox, + }, + data: () => ({ + value: [1], + }), + template: ` + + + + + `, + }) + + await delay(16) + const { checkboxGroup } = wrapper.vm.$refs + + checkboxGroup.inverseAll() + await delay(16) + expect(wrapper.vm.value).toStrictEqual([2]) + + checkboxGroup.checkAll() + await delay(16) + expect(wrapper.vm.value).toStrictEqual([1, 2]) + + wrapper.destroy() +}) + +test('test checkbox group layout direction', async () => { + const wrapper = mount({ + components: { + [VarCheckboxGroup.name]: VarCheckboxGroup, + [VarCheckbox.name]: VarCheckbox, + }, + data: () => ({ + value: [], + }), + template: ` + + + + + `, + }) + + expect(wrapper.html()).toMatchSnapshot() + wrapper.destroy() +}) From 26688ab5fbdfbfe72a9bc0fe93e7190536c8045b Mon Sep 17 00:00:00 2001 From: running snail <13641039885@163.com> Date: Thu, 17 Mar 2022 13:42:16 +0800 Subject: [PATCH 10/18] test(ui/date-picker): add test case and snaps * fix tabs parameter error (#35) * test(ui/loading): add test case and snapshots * test(ui/collapse): add test case and snapshots * test(ui/collapse): add test case and snapshots * feat: handle pnpm-lock * chore: handle pnpm-lock * test(ui/index-bar): add test case and snapshots * fix: undo merge Code changes * test: Merge branch 'dev' from upstream * test(ui/lazy): add test case and snapshots * fix: remove test code * test(ui/action-sheet): add test case and snapshots * test(ui/date-picker): add test case and snaps * test(ui/date-picker): fix .at error * test(ui/date-picker): fix .at error --- .../__snapshots__/index.spec.js.snap | 371 ++++++++++++++++++ .../src/date-picker/__tests__/index.spec.js | 121 +++++- .../src/tabs/__tests__/index.spec.js | 9 +- 3 files changed, 479 insertions(+), 22 deletions(-) diff --git a/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap index 3256494..593d81e 100644 --- a/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap @@ -440,3 +440,374 @@ exports[`test datePicker style and type 2`] = ` " `; + +exports[`test datePicker style and type test datePicker style and date 1`] = ` +"
+
+
+ 2021 +
+
+ +
+ 04-08 星期四 +
+
+
+
+
+ +
+
+
+
+ +
2021 四月
+
+
+
+ +
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+
" +`; + +exports[`test datePicker style and type test datePicker style and month 1`] = ` +"
+
+
+ 2021 +
+
+ +
+ 四月 +
+
+
+
+
+ +
+
+
+
+ +
2021
+
+
+
+ +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
" +`; diff --git a/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js index d635217..5f11410 100644 --- a/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js @@ -2,7 +2,7 @@ import DatePicker from '..' import VarDatePicker from '../DatePicker' import { mount } from '@vue/test-utils' import Vue from 'vue' -import { delay, mockConsole } from '../../utils/jest' +import { delay, mockConsole, triggerDrag } from '../../utils/jest' import dayjs from 'dayjs/esm' const [currentYear, currentMonth] = dayjs().format('YYYY-MM').split('-') @@ -12,6 +12,62 @@ test('test datePicker plugin', () => { expect(Vue.component(DatePicker.name)).toBeTruthy() }) +describe('test datePicker style and type', () => { + test('test datePicker style and date', async () => { + const template = ` + + ` + const wrapper = mount({ + components: { + [VarDatePicker.name]: VarDatePicker, + }, + data() { + return { + date: '2021-04-08', + } + }, + template, + }) + + await delay(0) + + expect(wrapper.html()).toMatchSnapshot() + }) + test('test datePicker style and month', async () => { + const template = ` + + ` + const wrapper = mount({ + components: { + [VarDatePicker.name]: VarDatePicker, + }, + data() { + return { + date: '2021-04', + } + }, + template, + }) + + await delay(0) + + expect(wrapper.html()).toMatchSnapshot() + }) +}) + test('test datePicker style and type', async () => { const template = ` { }) await delay(0) - expect(wrapper.find('.var-day-picker__head').find('li').text()).toBe('三') + expect(wrapper.findComponent('.var-day-picker__head').findComponent('li').text()).toBe('三') }) test('test max and min', async () => { @@ -82,18 +138,18 @@ test('test max and min', async () => { }) await delay(0) - expect(wrapper.find('.var-picker-header__value').text()).toBe('2021 四月') + expect(wrapper.findComponent('.var-picker-header__value').text()).toBe('2021 四月') - await wrapper.find('.var-picker-header').find('button').trigger('click') + await wrapper.findComponent('.var-picker-header').findComponent('button').trigger('click') await delay(200) - expect(wrapper.find('.var-picker-header__value').text()).toBe('2021 四月') + expect(wrapper.findComponent('.var-picker-header__value').text()).toBe('2021 四月') - await wrapper.find('.var-picker-header__value').trigger('click') + await wrapper.findComponent('.var-picker-header__value').trigger('click') await delay(200) - await wrapper.find('.var-picker-header__value').trigger('click') + await wrapper.findComponent('.var-picker-header__value').trigger('click') await delay(200) - expect(wrapper.find('.var-year-picker__panel').findAll('li').length).toBe(1) + expect(wrapper.findComponent('.var-year-picker__panel').findAll('li').length).toBe(1) }) test('test datePicker v-model', async () => { @@ -113,22 +169,22 @@ test('test datePicker v-model', async () => { }) await delay(0) - await wrapper.find('.var-picker-header').find('button').trigger('click') + await wrapper.findComponent('.var-picker-header').findComponent('button').trigger('click') await delay(200) - await wrapper.find('.var-month-picker__content').find('ul').find('button').trigger('click') + await wrapper.findComponent('.var-month-picker__content').findComponent('ul').findComponent('button').trigger('click') expect(wrapper.vm.date).toBe('2020-01') - await wrapper.find('.var-picker-header__value').trigger('click') + await wrapper.findComponent('.var-picker-header__value').trigger('click') await delay(200) - await wrapper.find('.var-year-picker__panel').find('li').trigger('click') + await wrapper.findComponent('.var-year-picker__panel').findComponent('li').trigger('click') await delay(200) - await wrapper.find('.var-month-picker__content').find('ul').find('button').trigger('click') + await wrapper.findComponent('.var-month-picker__content').findComponent('ul').findComponent('button').trigger('click') expect(wrapper.vm.date).not.toBe('2021-01') await wrapper.setData({ type: 'date', date: '2021-05-19' }) - await wrapper.find('.var-picker-header').find('button').trigger('click') + await wrapper.findComponent('.var-picker-header').findComponent('button').trigger('click') await delay(200) - await wrapper.find('.var-day-picker__button--usable').trigger('click') + await wrapper.findComponent('.var-day-picker__button--usable').trigger('click') expect(wrapper.vm.date).toBe('2021-04-01') }) @@ -197,10 +253,9 @@ test('test datePicker range prop', async () => { await wrapper.setData({ type: 'month', date: null }) await wrapper.setData({ type: 'month', date: ['2021-05', '2021-06'] }) await delay(0) - - const lis = wrapper.find('.var-month-picker__content').find('ul').findAll('li') - await lis.at(0).find('button').trigger('click') - await lis.at(2).find('button').trigger('click') + const lis = wrapper.findComponent('.var-month-picker__content').findComponent('ul').findAll('li') + await lis.at(0).findComponent('button').trigger('click') + await lis.at(2).findComponent('button').trigger('click') expect(wrapper.vm.date).toEqual([`${currentYear}-01`, `${currentYear}-03`]) expect(fn).toHaveBeenCalledTimes(1) @@ -224,16 +279,40 @@ test('test datePicker readonly', async () => { }) await delay(0) - await wrapper.find('.var-month-picker__content').find('ul').find('button').trigger('click') + await wrapper.findComponent('.var-month-picker__content').findComponent('ul').findComponent('button').trigger('click') await delay(200) expect(wrapper.vm.date).toBe('2021-05') await wrapper.setData({ type: 'date', date: '2021-05-19' }) - await wrapper.find('.var-day-picker__button--usable').trigger('click') + await wrapper.findComponent('.var-day-picker__button--usable').trigger('click') await delay(200) expect(wrapper.vm.date).toBe('2021-05-19') }) +// test('test datePicker touchable prop', async () => { +// const wrapper = mount({ +// components: { +// [VarDatePicker.name]: VarDatePicker, +// }, +// data() { +// return { +// date: '2021-04-08', +// type: 'date', +// } +// }, +// template: ``, +// }) + +// const pickBodyEl = wrapper.findComponent('.var-date-picker-body') +// const headerEl = wrapper.findComponent('.var-picker-header__value') + +// await triggerDrag(pickBodyEl, 0, 100) +// expect(headerEl.text()).toBe('2021 四月') +// await triggerDrag(pickBodyEl, 100, 0) +// await delay(300) +// expect(headerEl.text()).toBe('2021 三月') +// }) + test('test value legal', async () => { const fn = jest.fn() const { mockRestore } = mockConsole('error', fn) diff --git a/packages/varlet-vue2-ui/src/tabs/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/tabs/__tests__/index.spec.js index ed3b626..63efffc 100644 --- a/packages/varlet-vue2-ui/src/tabs/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/tabs/__tests__/index.spec.js @@ -185,7 +185,14 @@ test('test tabs disabled', async () => { }) test('test tabs relation tabsItems', async () => { - const wrapper = mount(Wrapper) + const onClick = jest.fn() + const onChange = jest.fn() + const wrapper = mount(Wrapper, { + propsData: { + onClick, + onChange, + }, + }) await delay(100) expect(wrapper.html()).toMatchSnapshot() From 785aaed232fa4900c992f25b827ed226da9d0241 Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Thu, 17 Mar 2022 15:21:44 +0800 Subject: [PATCH 11/18] fix(ui/index-bar): change scrollable target to fix cant scroll in Android web --- packages/varlet-vue2-ui/src/index-bar/IndexBar.vue | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/varlet-vue2-ui/src/index-bar/IndexBar.vue b/packages/varlet-vue2-ui/src/index-bar/IndexBar.vue index 1761e61..4cf2652 100644 --- a/packages/varlet-vue2-ui/src/index-bar/IndexBar.vue +++ b/packages/varlet-vue2-ui/src/index-bar/IndexBar.vue @@ -26,6 +26,7 @@ import { doubleRaf, getParentScroller, getScrollLeft, + getScrollTop, nextTickFrame, requestAnimationFrame, scrollTo, @@ -41,7 +42,6 @@ export default defineComponent({ props, data: () => ({ - scrollEl: null, clickedName: '', scroller: null, anchorNameList: [], @@ -51,8 +51,7 @@ export default defineComponent({ async mounted() { await doubleRaf() this.scroller = getParentScroller(this.$refs.barEl) - this.scrollEl = this.scroller === window ? this.scroller.document.documentElement : this.scroller - this.scroller?.addEventListener('scroll', this.handleScroll) + this.scroller.addEventListener('scroll', this.handleScroll) }, beforeDestroy() { @@ -86,7 +85,9 @@ export default defineComponent({ }, handleScroll() { - const { scrollTop, scrollHeight } = this.scrollEl + const scrollTop = getScrollTop(this.scroller) + const scrollHeight = this.scroller === window ? document.body.scrollHeight : this.scroller.scrollHeight + const { offsetTop } = this.$refs.barEl this.indexAnchors.forEach((anchor, index) => { const anchorTop = anchor.ownTop @@ -112,11 +113,11 @@ export default defineComponent({ const indexAnchor = this.indexAnchors.find(({ name }) => anchorName === name) if (!indexAnchor) return const top = indexAnchor.ownTop - this.stickyOffsetTop + this.$refs.barEl.offsetTop - const left = getScrollLeft(this.scrollEl) + const left = getScrollLeft(this.scroller) this.clickedName = anchorName this.emitEvent(anchorName) - await scrollTo(this.scrollEl, { + await scrollTo(this.scroller, { left, top, animation: easeInOutCubic, From 968a09b38be6d81b8d35842b1e0664dd7ffb1298 Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Thu, 17 Mar 2022 15:31:56 +0800 Subject: [PATCH 12/18] docs(ui/collapse): fix typo --- packages/varlet-vue2-ui/src/collapse/docs/en-US.md | 6 +++--- packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/varlet-vue2-ui/src/collapse/docs/en-US.md b/packages/varlet-vue2-ui/src/collapse/docs/en-US.md index 1fd5117..3d83a0a 100644 --- a/packages/varlet-vue2-ui/src/collapse/docs/en-US.md +++ b/packages/varlet-vue2-ui/src/collapse/docs/en-US.md @@ -95,13 +95,13 @@ export default { ```html - + Hello World - + - Hello World + This is a content ``` diff --git a/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md b/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md index c3c2808..7670fe8 100644 --- a/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md +++ b/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md @@ -96,7 +96,7 @@ export default { ```html - 这是内容 + 文本 From 80e1bd078ab75222c9e3c239bd4661d30a107acc Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Thu, 17 Mar 2022 15:35:53 +0800 Subject: [PATCH 13/18] docs(ui/collapse): fix typo --- .../varlet-vue2-ui/src/collapse/docs/zh-CN.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md b/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md index 7670fe8..a2680c1 100644 --- a/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md +++ b/packages/varlet-vue2-ui/src/collapse/docs/zh-CN.md @@ -19,8 +19,8 @@ Vue.use(Collapse).use(CollapseItem) ```html - 内容 - 内容 + 文本 + 文本 ``` ```javascript @@ -42,8 +42,8 @@ export default { ```html - 内容 - 内容 + 文本 + 文本 ``` @@ -53,8 +53,8 @@ export default { ```html - 内容 - 内容 + 文本 + 文本 ``` ```javascript @@ -75,10 +75,10 @@ export default { - 内容 + 文本 - 内容 + 文本 ``` From 5e058d61bebf29fd183f53221fb33af5319f2ebe Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Thu, 17 Mar 2022 17:36:53 +0800 Subject: [PATCH 14/18] feat(ui/date-picker): suport touchable --- .../site/components/snackbar/snackbar.less | 2 +- .../src/date-picker/DatePicker.vue | 71 ++++++++++- .../__snapshots__/index.spec.js.snap | 114 ++++++++++++++++++ .../src/date-picker/__tests__/index.spec.js | 47 ++++---- .../src/date-picker/date-picker.less | 21 +++- .../src/date-picker/docs/en-US.md | 29 ++--- .../src/date-picker/docs/zh-CN.md | 33 ++--- .../varlet-vue2-ui/src/date-picker/props.ts | 4 + .../src/date-picker/src/day-picker-panel.vue | 15 ++- .../date-picker/src/month-picker-panel.vue | 15 ++- .../src/date-picker/src/panel-header.vue | 2 + .../varlet-vue2-ui/src/select/select.less | 2 +- packages/varlet-vue2-ui/types/datePicker.d.ts | 3 + 13 files changed, 290 insertions(+), 68 deletions(-) diff --git a/packages/varlet-vue2-cli/site/components/snackbar/snackbar.less b/packages/varlet-vue2-cli/site/components/snackbar/snackbar.less index 3fa5125..bc31d5c 100644 --- a/packages/varlet-vue2-cli/site/components/snackbar/snackbar.less +++ b/packages/varlet-vue2-cli/site/components/snackbar/snackbar.less @@ -105,7 +105,7 @@ position: absolute; } - &-fade-enter-from, + &-fade-enter, &-fade-leave-to { opacity: 0; transform: translateY(-30px); diff --git a/packages/varlet-vue2-ui/src/date-picker/DatePicker.vue b/packages/varlet-vue2-ui/src/date-picker/DatePicker.vue index a938b6f..386ab1c 100644 --- a/packages/varlet-vue2-ui/src/date-picker/DatePicker.vue +++ b/packages/varlet-vue2-ui/src/date-picker/DatePicker.vue @@ -45,15 +45,21 @@ -
+
@@ -86,8 +93,13 @@ import YearPickerPanel from './src/year-picker-panel.vue' import DayPickerPanel from './src/day-picker-panel.vue' import { props, MONTH_LIST, WEEK_HEADER } from './props' import { isArray, toNumber } from '../utils/shared' +import { nextTickFrame } from '../utils/elements' import { pack } from '../locale' +let startX = 0 +let startY = 0 +let checkType = '' +let touchDirection const currentDate = dayjs().format('YYYY-MM-D') const [currentYear, currentMonth] = currentDate?.split('-') const monthDes = MONTH_LIST.find((month) => month.index === currentMonth) @@ -223,6 +235,17 @@ export default defineComponent({ isSameMonth() { return this.chooseMonth?.index === this.previewMonth.index }, + + getPanelType() { + if (this.isYearPanel) return 'year' + if (this.type === 'month' || this.isMonthPanel) return 'month' + if (this.type === 'date') return 'date' + return '' + }, + + isUntouchable() { + return !this.touchable || ['', 'year'].includes(this.getPanelType) + }, }, watch: { @@ -245,6 +268,10 @@ export default defineComponent({ }, immediate: true, }, + + getPanelType() { + this.resetState() + }, }, methods: { @@ -441,6 +468,42 @@ export default defineComponent({ this.previewMonth = monthDes this.previewYear = yearValue }, + + handleTouchstart(event) { + if (this.isUntouchable) return + const { clientX, clientY } = event.touches[0] + startX = clientX + startY = clientY + }, + + getDirection(x, y) { + return x >= y && x > 20 ? 'x' : 'y' + }, + + handleTouchmove(event) { + if (this.isUntouchable) return + const { clientX, clientY } = event.touches[0] + const x = clientX - startX + const y = clientY - startY + touchDirection = this.getDirection(Math.abs(x), Math.abs(y)) + checkType = x > 0 ? 'prev' : 'next' + }, + + handleTouchend() { + if (this.isUntouchable || touchDirection !== 'x') return + const componentRef = this.getPanelType === 'month' ? 'monthPanelEl' : 'dayPanelEl' + nextTickFrame(() => { + this.$refs[componentRef].forwardRef(checkType) + this.resetState() + }) + }, + + resetState() { + startY = 0 + startX = 0 + checkType = '' + touchDirection = undefined + }, }, }) diff --git a/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap index 593d81e..b15d82f 100644 --- a/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap @@ -52,6 +52,120 @@ exports[`test allowedDates prop 1`] = `
" `; +exports[`test datePicker style and month 1`] = ` +"
+
+
+ 2021 +
+
+ +
+ 四月 +
+
+
+
+
+ +
+
+
+
+ +
2021
+
+
+
+ +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
" +`; + exports[`test datePicker style and type 1`] = ` "
diff --git a/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js index 5f11410..5f9292f 100644 --- a/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/date-picker/__tests__/index.spec.js @@ -39,6 +39,7 @@ describe('test datePicker style and type', () => { expect(wrapper.html()).toMatchSnapshot() }) + test('test datePicker style and month', async () => { const template = ` { expect(wrapper.vm.date).toBe('2021-05-19') }) -// test('test datePicker touchable prop', async () => { -// const wrapper = mount({ -// components: { -// [VarDatePicker.name]: VarDatePicker, -// }, -// data() { -// return { -// date: '2021-04-08', -// type: 'date', -// } -// }, -// template: ``, -// }) - -// const pickBodyEl = wrapper.findComponent('.var-date-picker-body') -// const headerEl = wrapper.findComponent('.var-picker-header__value') - -// await triggerDrag(pickBodyEl, 0, 100) -// expect(headerEl.text()).toBe('2021 四月') -// await triggerDrag(pickBodyEl, 100, 0) -// await delay(300) -// expect(headerEl.text()).toBe('2021 三月') -// }) +test('test datePicker touchable prop', async () => { + const wrapper = mount({ + components: { + [VarDatePicker.name]: VarDatePicker, + }, + data() { + return { + date: '2021-04-08', + type: 'date', + } + }, + template: ``, + }) + + const pickBodyEl = wrapper.findComponent('.var-date-picker-body') + const headerEl = wrapper.findComponent('.var-picker-header__value') + + await triggerDrag(pickBodyEl, 0, 100) + expect(headerEl.text()).toBe('2021 四月') + await triggerDrag(pickBodyEl, 100, 0) + await delay(300) + expect(headerEl.text()).toBe('2021 三月') +}) test('test value legal', async () => { const fn = jest.fn() diff --git a/packages/varlet-vue2-ui/src/date-picker/date-picker.less b/packages/varlet-vue2-ui/src/date-picker/date-picker.less index c4544f1..3128533 100644 --- a/packages/varlet-vue2-ui/src/date-picker/date-picker.less +++ b/packages/varlet-vue2-ui/src/date-picker/date-picker.less @@ -162,6 +162,7 @@ overflow: hidden; font-weight: 700; cursor: pointer; + user-select: none; div { width: 100%; @@ -196,6 +197,11 @@ &__button[var-date-picker-color-cover='true'] { color: var(--date-picker-main-color); } + + &__button-disabled { + color: var(--color-text-disabled) !important; + cursor: not-allowed; + } } .var-year-picker { @@ -258,9 +264,14 @@ &__button[var-date-picker-color-cover='true'] { color: var(--date-picker-main-color); } + + &__button-disabled { + color: var(--color-text-disabled) !important; + cursor: not-allowed; + } } - &-translatey-enter-from { + &-translatey-enter { opacity: 0; transform: translateY(100%); } @@ -281,7 +292,7 @@ transform: translateY(-100%); } - &-reverse-translatey-enter-from { + &-reverse-translatey-enter { opacity: 0; transform: translateY(-100%); } @@ -291,7 +302,7 @@ transform: translateY(100%); } - &-panel-fade-enter-from, + &-panel-fade-enter, &-panel-fade-leave-to { transition: 0.3s var(--cubic-bezier); opacity: 0; @@ -301,12 +312,12 @@ position: absolute; } - &-translatex-enter-from { + &-translatex-enter { opacity: 0; transform: translateX(100%); } - &-reverse-translatex-enter-from { + &-reverse-translatex-enter { opacity: 0; transform: translateX(-100%); } diff --git a/packages/varlet-vue2-ui/src/date-picker/docs/en-US.md b/packages/varlet-vue2-ui/src/date-picker/docs/en-US.md index 0986d34..5e248fd 100644 --- a/packages/varlet-vue2-ui/src/date-picker/docs/en-US.md +++ b/packages/varlet-vue2-ui/src/date-picker/docs/en-US.md @@ -124,21 +124,22 @@ export default { ### Props -| Prop | Description | Type | Default | -| ----- | -------------- | -------- | ---------- | -| `v-model` | Selected date(ISO 8601 format, `YYYY-MM-DD` or `YYYY-MM`)| _string[] \| string_ | `undefined` | -| `type` | Picker type, optional values`date, month` | _string_ | `date` | -| `allowed-dates` | Restricts which dates can be selected | _function_ | `-` | -| `color` | Picker color | _string_ | `#2979ff` | +| Prop | Description | Type | Default | +| ----- |-------------------------------------------------------------------------------------------------------------------| -------- | ---------- | +| `v-model` | Selected date(ISO 8601 format, `YYYY-MM-DD` or `YYYY-MM`) | _string[] \| string_ | `undefined` | +| `type` | Picker type, optional values`date, month` | _string_ | `date` | +| `allowed-dates` | Restricts which dates can be selected | _function_ | `-` | +| `color` | Picker color | _string_ | `#2979ff` | | `header-color` | Color of picker header. If not specified it will use the color defined by color prop or the default picker color. | _string_ | `#2979ff` | -| `shadow` | Whether to add a shadow | _boolean_ | `false` | -| `first-day-of-week` | Sets the first day of the week, starting with 0 for Sunday. | _string \| number_ | `0` | -| `min` | Minimum allowed date/month (ISO 8601 format) | _string_ | `-` | -| `max` | Maximum allowed date/month (ISO 8601 format) | _string_ | `-` | -| `show-current` | Whether to display the current date | _boolean_ | `true` | -| `readonly` | readonly | _boolean_ | `false` | -| `multiple` | Allow the selection of multiple dates | _boolean_ | `false` | -| `range` | Allow the selection of date range | _boolean_ | `false` | +| `shadow` | Whether to add a shadow | _boolean_ | `false` | +| `first-day-of-week` | Sets the first day of the week, starting with 0 for Sunday. | _string \| number_ | `0` | +| `min` | Minimum allowed date/month (ISO 8601 format) | _string_ | `-` | +| `max` | Maximum allowed date/month (ISO 8601 format) | _string_ | `-` | +| `show-current` | Whether to display the current date | _boolean_ | `true` | +| `readonly` | readonly | _boolean_ | `false` | +| `multiple` | Allow the selection of multiple dates | _boolean_ | `false` | +| `range` | Allow the selection of date range | _boolean_ | `false` | +| `touchable` | Allow switch panel by touch | _boolean_ | `true` | ### Events diff --git a/packages/varlet-vue2-ui/src/date-picker/docs/zh-CN.md b/packages/varlet-vue2-ui/src/date-picker/docs/zh-CN.md index cfcbaeb..5c5e31e 100644 --- a/packages/varlet-vue2-ui/src/date-picker/docs/zh-CN.md +++ b/packages/varlet-vue2-ui/src/date-picker/docs/zh-CN.md @@ -117,21 +117,22 @@ export default { ### 属性 -| 参数 | 说明 | 类型 | 默认值 | -|---------------------| -------------- | -------- | ---------- | -| `v-model` | 被选择的日期(ISO 8601 格式,`YYYY-MM-DD` 或 `YYYY-MM`)| _string[] \| string_ | `undefined` | -| `type` | 选择器类型,可选值为 `date month` | _string_ | `date` | -| `allowed-dates` | 限制可以选择的日期 | _function_ | `-` | -| `color` | 选择器的颜色 | _string_ | `#2979ff` | -| `header-color` | 标题背景色。如果未指定,将使用由 color 属性或默认颜色。 | _string_ | `#2979ff` | -| `shadow` | 是否添加阴影 | _boolean_ | `false` | -| `first-day-of-week` | 设置一周的第一天,从周日的 0 开始。 | _string \| number_ | `0` | -| `min` | 允许的最小日期/月份(ISO 8601格式) | _string_ | `-` | -| `max` | 允许的最大日期/月份(ISO 8601格式) | _string_ | `-` | -| `show-current` | 是否显示当前日期 | _boolean_ | `true` | -| `readonly` | 是否只读 | _boolean_ | `false` | -| `multiple` | 是否支持选择多个日期 | _boolean_ | `false` | -| `range` | 是否支持选择一个范围 | _boolean_ | `false` | +| 参数 | 说明 | 类型 | 默认值 | +|---------------------|----------------------------------------------| -------- | ---------- | +| `v-model` | 被选择的日期(ISO 8601 格式,`YYYY-MM-DD` 或 `YYYY-MM`) | _string[] \| string_ | `undefined` | +| `type` | 选择器类型,可选值为 `date month` | _string_ | `date` | +| `allowed-dates` | 限制可以选择的日期 | _function_ | `-` | +| `color` | 选择器的颜色 | _string_ | `#2979ff` | +| `header-color` | 标题背景色。如果未指定,将使用由 color 属性或默认颜色。 | _string_ | `#2979ff` | +| `shadow` | 是否添加阴影 | _boolean_ | `false` | +| `first-day-of-week` | 设置一周的第一天,从周日的 0 开始。 | _string \| number_ | `0` | +| `min` | 允许的最小日期/月份(ISO 8601格式) | _string_ | `-` | +| `max` | 允许的最大日期/月份(ISO 8601格式) | _string_ | `-` | +| `show-current` | 是否显示当前日期 | _boolean_ | `true` | +| `readonly` | 是否只读 | _boolean_ | `false` | +| `multiple` | 是否支持选择多个日期 | _boolean_ | `false` | +| `range` | 是否支持选择一个范围 | _boolean_ | `false` | +| `touchable` | 是否支持拖动切换面板 | _boolean_ | `true` | ### 事件 @@ -151,7 +152,7 @@ export default { | `multiple` | 自定义标题中的多选 | `choose: ['YYYY-MM-DD' \| 'YYYY-MM']` | ### 样式变量 -以下为组件使用的 css 变量,可以使用 [StyleProvider 组件](#/zh-CN/style-provider)进行样式定制 +以下为组件使用的 css 变量,可以使用 [StyleProvider 组件](#/zh-CN/style-provider) 进行样式定制 | 变量名 | 默认值 | | --- | --- | diff --git a/packages/varlet-vue2-ui/src/date-picker/props.ts b/packages/varlet-vue2-ui/src/date-picker/props.ts index eea964c..1d3d97c 100644 --- a/packages/varlet-vue2-ui/src/date-picker/props.ts +++ b/packages/varlet-vue2-ui/src/date-picker/props.ts @@ -163,4 +163,8 @@ export const props = { type: Boolean, default: false, }, + touchable: { + type: Boolean, + default: true, + }, } diff --git a/packages/varlet-vue2-ui/src/date-picker/src/day-picker-panel.vue b/packages/varlet-vue2-ui/src/date-picker/src/day-picker-panel.vue index af5ac9d..b45ee31 100644 --- a/packages/varlet-vue2-ui/src/date-picker/src/day-picker-panel.vue +++ b/packages/varlet-vue2-ui/src/date-picker/src/day-picker-panel.vue @@ -2,6 +2,7 @@
{{ filterDay(day) }} @@ -286,6 +287,9 @@ export default defineComponent({ outline: computeOutline(), textColor: isCover ? '' : textColorOrCover(), 'var-date-picker-color-cover': isCover, + class: { + 'var-day-picker__button-disabled': disabled, + }, } }, @@ -295,9 +299,16 @@ export default defineComponent({ this.$emit('check-preview', 'month', checkType) }, - chooseDay(day) { + chooseDay(day, event) { + const buttonEl = event.currentTarget + if (buttonEl.classList.contains('var-day-picker__button-disabled')) return + this.$emit('choose-day', day) }, + + forwardRef(checkType) { + this.$refs.headerEl.checkDate(checkType) + }, }, }) diff --git a/packages/varlet-vue2-ui/src/date-picker/src/month-picker-panel.vue b/packages/varlet-vue2-ui/src/date-picker/src/month-picker-panel.vue index dc9441d..8da199d 100644 --- a/packages/varlet-vue2-ui/src/date-picker/src/month-picker-panel.vue +++ b/packages/varlet-vue2-ui/src/date-picker/src/month-picker-panel.vue @@ -2,6 +2,7 @@
{{ getMonthAbbr(month.index) }} @@ -217,10 +218,16 @@ export default defineComponent({ color: !computeText() ? color : '', textColor: isCover ? '' : textColorOrCover(), 'var-date-picker-color-cover': isCover, + class: { + 'var-month-picker__button-disabled': disabled, + }, } }, - chooseMonth(month) { + chooseMonth(month, event) { + const buttonEl = event.currentTarget + if (buttonEl.classList.contains('var-month-picker__button-disabled')) return + this.$emit('choose-month', month) }, @@ -229,6 +236,10 @@ export default defineComponent({ this.panelKey += checkType === 'prev' ? -1 : 1 this.$emit('check-preview', 'year', checkType) }, + + forwardRef(checkType) { + this.$refs.headerEl.checkDate(checkType) + }, }, }) diff --git a/packages/varlet-vue2-ui/src/date-picker/src/panel-header.vue b/packages/varlet-vue2-ui/src/date-picker/src/panel-header.vue index 933ee6a..9285334 100644 --- a/packages/varlet-vue2-ui/src/date-picker/src/panel-header.vue +++ b/packages/varlet-vue2-ui/src/date-picker/src/panel-header.vue @@ -77,6 +77,8 @@ export default defineComponent({ methods: { checkDate(checkType) { + if ((checkType === 'prev' && this.disabled.left) || (checkType === 'next' && this.disabled.right)) return + this.$emit('check-date', checkType) this.reverse = checkType === 'prev' this.forwardOrBackNum += checkType === 'prev' ? -1 : 1 diff --git a/packages/varlet-vue2-ui/src/select/select.less b/packages/varlet-vue2-ui/src/select/select.less index 6121463..bff9b0f 100644 --- a/packages/varlet-vue2-ui/src/select/select.less +++ b/packages/varlet-vue2-ui/src/select/select.less @@ -35,7 +35,7 @@ } .var { - &-select-footer-margin-enter-from, + &-select-footer-margin-enter, &-select-footer-margin-leave-to { opacity: 0; margin-top: 2px !important; diff --git a/packages/varlet-vue2-ui/types/datePicker.d.ts b/packages/varlet-vue2-ui/types/datePicker.d.ts index 631b1b4..32cd566 100644 --- a/packages/varlet-vue2-ui/types/datePicker.d.ts +++ b/packages/varlet-vue2-ui/types/datePicker.d.ts @@ -14,6 +14,9 @@ export interface DatePickerProps { readonly?: boolean multiple?: boolean range?: boolean + touchable?: boolean + onChange?: (value: string | string[]) => void + onInput?: (value: string | string[]) => void } export class DatePicker extends VarComponent { From 2429a64d1ef9f94e123ec042d3897bb7af52f514 Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Thu, 17 Mar 2022 17:44:34 +0800 Subject: [PATCH 15/18] test(ui/date-picker): update snap --- .../__snapshots__/index.spec.js.snap | 114 ------------------ 1 file changed, 114 deletions(-) diff --git a/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap index b15d82f..593d81e 100644 --- a/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/date-picker/__tests__/__snapshots__/index.spec.js.snap @@ -52,120 +52,6 @@ exports[`test allowedDates prop 1`] = `
" `; -exports[`test datePicker style and month 1`] = ` -"
-
-
- 2021 -
-
- -
- 四月 -
-
-
-
-
- -
-
-
-
- -
2021
-
-
-
- -
    -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
-
-
-
-
-
-
" -`; - exports[`test datePicker style and type 1`] = ` "
From 1468f595c4518eba8f6c5986a92d147bbd09b5d3 Mon Sep 17 00:00:00 2001 From: ayang <473033518@qq.com> Date: Thu, 17 Mar 2022 20:47:54 +0800 Subject: [PATCH 16/18] fix(ui/counter): fix the bug that the long-press event of the counter component does not take effect --- packages/varlet-vue2-ui/src/counter/Counter.vue | 12 ++++++------ packages/varlet-vue2-ui/src/icon/Icon.vue | 3 +++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/varlet-vue2-ui/src/counter/Counter.vue b/packages/varlet-vue2-ui/src/counter/Counter.vue index 2899e21..8f1c772 100644 --- a/packages/varlet-vue2-ui/src/counter/Counter.vue +++ b/packages/varlet-vue2-ui/src/counter/Counter.vue @@ -19,9 +19,9 @@ disabled: !ripple || disabled || readonly || disableDecrement || !decrementButton || isMin, }" @click="decrement" - @touchstart="pressDecrement" - @touchend="releaseDecrement" - @touchcancel="releaseDecrement" + @touchstart.native="pressDecrement" + @touchend.native="releaseDecrement" + @touchcancel.native="releaseDecrement" />
diff --git a/packages/varlet-vue2-ui/src/icon/Icon.vue b/packages/varlet-vue2-ui/src/icon/Icon.vue index c5bff72..ed77d73 100644 --- a/packages/varlet-vue2-ui/src/icon/Icon.vue +++ b/packages/varlet-vue2-ui/src/icon/Icon.vue @@ -56,8 +56,11 @@ export default defineComponent({ methods: { toSizeUnit, + isURL, + toNumber, + onClickIcon() { this.getListeners().onClick?.() }, From af6f5fa6dc517aee5e233eefda41b41031d07cd9 Mon Sep 17 00:00:00 2001 From: running snail <13641039885@163.com> Date: Thu, 17 Mar 2022 22:30:41 +0800 Subject: [PATCH 17/18] test(ui/counter): add test case and snapshots (#36) * test(ui/loading): add test case and snapshots * test(ui/collapse): add test case and snapshots * test(ui/collapse): add test case and snapshots * feat: handle pnpm-lock * chore: handle pnpm-lock * test(ui/index-bar): add test case and snapshots * fix: undo merge Code changes * test: Merge branch 'dev' from upstream * test(ui/lazy): add test case and snapshots * fix: remove test code * test(ui/action-sheet): add test case and snapshots * test(ui/date-picker): add test case and snaps * test(ui/date-picker): fix .at error * test(ui/date-picker): fix .at error * test(ui/counter): add test case --- .../__snapshots__/index.spec.js.snap | 12 + .../src/counter/__tests__/index.spec.js | 329 ++++++++++-------- 2 files changed, 195 insertions(+), 146 deletions(-) diff --git a/packages/varlet-vue2-ui/src/counter/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/counter/__tests__/__snapshots__/index.spec.js.snap index 7b5bd48..7861902 100644 --- a/packages/varlet-vue2-ui/src/counter/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/counter/__tests__/__snapshots__/index.spec.js.snap @@ -68,3 +68,15 @@ exports[`test counter example 1`] = `
" `; + +exports[`test counter validation 1`] = ` +"
+
+ +
+
必须大于0
+
+
+
+
" +`; diff --git a/packages/varlet-vue2-ui/src/counter/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/counter/__tests__/index.spec.js index 7acd0b3..cb7782a 100644 --- a/packages/varlet-vue2-ui/src/counter/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/counter/__tests__/index.spec.js @@ -16,158 +16,195 @@ test('test counter plugin', () => { expect(Vue.component(Counter.name)).toBeTruthy() }) -// const Wrapper = { -// components: { -// [VarCounter.name]: VarCounter, -// }, -// data: () => ({ -// value: 0, -// }), -// template: ``, -// } - -// test('test counter increment & decrement', async () => { -// const wrapper = mount(Wrapper) - -// await wrapper.find('.var-counter__increment-button').trigger('click') -// expect(wrapper.vm.value).toBe(1) -// await wrapper.find('.var-counter__decrement-button').trigger('click') -// expect(wrapper.vm.value).toBe(0) - -// wrapper.destroy() -// }) - -// test('test counter initial value over max', async () => { -// const wrapper = mount({ -// ...Wrapper, -// data: () => ({ -// value: 11, -// }), -// template: ``, -// }) - -// expect(wrapper.vm.value).toBe(10) - -// wrapper.destroy() -// }) - -// test('test counter initial value less min', async () => { -// const wrapper = mount({ -// ...Wrapper, -// data: () => ({ -// value: -1, -// }), -// template: ``, -// }) - -// expect(wrapper.vm.value).toBe(0) - -// wrapper.destroy() -// }) - -// test('test counter onChange', async () => { -// const onChange = jest.fn() - -// const wrapper = mount({ -// ...Wrapper, -// methods: { -// onChange, -// }, -// template: ``, -// }) - -// wrapper.find('.var-counter__input').setValue('1') -// await wrapper.find('.var-counter__input').trigger('change') -// expect(onChange).lastCalledWith(1) - -// wrapper.destroy() -// }) - -// test('test counter press increment', async () => { -// const wrapper = mount(Wrapper) - -// await trigger(wrapper.find('.var-counter__increment-button'), 'touchstart') -// await delay(800) - -// const current = wrapper.vm.value -// expect(current).toBeGreaterThan(0) - -// await trigger(wrapper.find('.var-counter__increment-button'), 'touchend') -// await delay(100) -// expect(wrapper.vm.value).toBe(current) - -// wrapper.destroy() -// }) - -// test('test counter press decrement', async () => { -// const wrapper = mount(Wrapper) - -// await trigger(wrapper.find('.var-counter__decrement-button'), 'touchstart') -// await delay(750) - -// const current = wrapper.vm.value -// expect(current).toBeLessThan(0) - -// await trigger(wrapper.find('.var-counter__decrement-button'), 'touchend') -// await delay(750) -// expect(wrapper.vm.value).toBe(current) - -// wrapper.destroy() -// }) - -// test('test counter lazy change', async () => { -// const wrapper = mount({ -// ...Wrapper, -// methods: { -// onBeforeChange(value, change) { -// const isInc = value > wrapper.vm.value -// change(isInc ? value + 1 : value - 1) -// }, -// }, -// template: ``, -// }) - -// await wrapper.find('.var-counter__increment-button').trigger('click') -// expect(wrapper.vm.value).toBe(2) - -// await wrapper.find('.var-counter__decrement-button').trigger('click') -// expect(wrapper.vm.value).toBe(0) +test('test counter increment & decrement', async () => { + const wrapper = mount({ + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 0, + }), + template: ``, + }) + + await wrapper.find('.var-counter__increment-button').trigger('click') + expect(wrapper.vm.value).toBe(1) + await wrapper.find('.var-counter__decrement-button').trigger('click') + expect(wrapper.vm.value).toBe(0) -// wrapper.destroy() -// }) - -// test('test counter disabled', async () => { -// const wrapper = mount({ -// ...Wrapper, -// template: ``, -// }) + wrapper.destroy() +}) + +test('test counter initial value over max', async () => { + const wrapper = mount({ + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 11, + }), + template: ``, + }) + expect(wrapper.vm.value).toBe(10) + + wrapper.destroy() +}) + +test('test counter initial value less min', async () => { + const Wrapper = { + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: -1, + }), + template: ``, + } + const wrapper = mount(Wrapper) + expect(wrapper.vm.value).toBe(0) + + wrapper.destroy() +}) + +test('test counter onChange', async () => { + const onChange = jest.fn() + const Wrapper = { + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 0, + }), + methods: { + onChange, + }, + template: ``, + } + const wrapper = mount(Wrapper) + + wrapper.find('.var-counter__input').setValue('1') + await wrapper.find('.var-counter__input').trigger('change') + expect(onChange).lastCalledWith(1) + + wrapper.destroy() +}) + +test('test counter press increment', async () => { + const wrapper = mount({ + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 0, + }), + template: ``, + }) + + await trigger(wrapper.find('.var-counter__increment-button'), 'touchstart') + await delay(800) + + const current = wrapper.vm.value + expect(current).toBeGreaterThan(0) -// await wrapper.find('.var-counter__increment-button').trigger('click') -// expect(wrapper.vm.value).toBe(0) + await trigger(wrapper.find('.var-counter__increment-button'), 'touchend') + await delay(100) + expect(wrapper.vm.value).toBe(current) -// await wrapper.find('.var-counter__decrement-button').trigger('click') -// expect(wrapper.vm.value).toBe(0) -// }) + wrapper.destroy() +}) + +test('test counter press decrement', async () => { + const wrapper = mount({ + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 0, + }), + template: ``, + }) -// test('test counter validation', async () => { -// const wrapper = mount({ -// ...Wrapper, -// template: ``, -// }) + await trigger(wrapper.find('.var-counter__decrement-button'), 'touchstart') + await delay(750) -// const { counter } = wrapper.vm.$refs + const current = wrapper.vm.value + expect(current).toBeLessThan(0) -// counter.validate() -// await delay(16) + await trigger(wrapper.find('.var-counter__decrement-button'), 'touchend') + await delay(750) + expect(wrapper.vm.value).toBe(current) -// expect(wrapper.html()).toMatchSnapshot() -// expect(wrapper.find('.var-form-details__message').text()).toBe('必须大于0') + wrapper.destroy() +}) -// await wrapper.find('.var-counter__increment-button').trigger('click') -// await delay(16) -// expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() +test('test counter lazy change', async () => { + const wrapper = mount({ + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 0, + }), + methods: { + onBeforeChange(value, change) { + const isInc = value > wrapper.vm.value + change(isInc ? value + 1 : value - 1) + }, + }, + template: ``, + }) + + await wrapper.find('.var-counter__increment-button').trigger('click') + expect(wrapper.vm.value).toBe(2) + + await wrapper.find('.var-counter__decrement-button').trigger('click') + expect(wrapper.vm.value).toBe(0) -// counter.reset() -// await delay(16) -// expect(wrapper.vm.value).toBe(0) -// }) + wrapper.destroy() +}) + +test('test counter disabled', async () => { + const wrapper = mount({ + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 0, + }), + template: ``, + }) + + await wrapper.find('.var-counter__increment-button').trigger('click') + expect(wrapper.vm.value).toBe(0) + + await wrapper.find('.var-counter__decrement-button').trigger('click') + expect(wrapper.vm.value).toBe(0) +}) + +test('test counter validation', async () => { + const wrapper = mount({ + components: { + [VarCounter.name]: VarCounter, + }, + data: () => ({ + value: 0, + }), + template: ``, + }) + + const { counter } = wrapper.vm.$refs + + counter.validate() + await delay(16) + + expect(wrapper.html()).toMatchSnapshot() + expect(wrapper.find('.var-form-details__message').text()).toBe('必须大于0') + + await wrapper.find('.var-counter__increment-button').trigger('click') + await delay(16) + expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() + + counter.reset() + await delay(16) + expect(wrapper.vm.value).toBe(0) +}) From f228373861fec3192f463610918230c419bce41c Mon Sep 17 00:00:00 2001 From: qytayh <13255238145@163.com> Date: Thu, 17 Mar 2022 22:54:11 +0800 Subject: [PATCH 18/18] fix(ui/input): delete extra space & add lost param in handleInput --- packages/varlet-vue2-ui/src/input/Input.vue | 4 +- .../__snapshots__/index.spec.js.snap | 172 ++++++++ .../src/input/__tests__/index.spec.js | 404 +++++++++--------- 3 files changed, 377 insertions(+), 203 deletions(-) diff --git a/packages/varlet-vue2-ui/src/input/Input.vue b/packages/varlet-vue2-ui/src/input/Input.vue index 9d9965a..bb901ad 100644 --- a/packages/varlet-vue2-ui/src/input/Input.vue +++ b/packages/varlet-vue2-ui/src/input/Input.vue @@ -158,7 +158,7 @@ export default defineComponent({ if (this.isEmpty(value)) return `0 / ${maxlength}` - return `${String(value).length} / ${maxlength}` + return `${String(value).length}/${maxlength}` }, formReadonly() { @@ -229,7 +229,7 @@ export default defineComponent({ handleInput(e) { const { value } = e.target - this.getListeners().onInput?.(value) + this.getListeners().onInput?.(value, e) this.validateWithTrigger('onInput') }, diff --git a/packages/varlet-vue2-ui/src/input/__tests__/__snapshots__/index.spec.js.snap b/packages/varlet-vue2-ui/src/input/__tests__/__snapshots__/index.spec.js.snap index c45f5dd..dffc6e9 100644 --- a/packages/varlet-vue2-ui/src/input/__tests__/__snapshots__/index.spec.js.snap +++ b/packages/varlet-vue2-ui/src/input/__tests__/__snapshots__/index.spec.js.snap @@ -1,5 +1,24 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`test input clear 1`] = ` +"
+
+
+
+
+
+
+
+
+
+ + + +
" +`; + exports[`test input example 1`] = ` "
基本使用
@@ -173,3 +192,156 @@ exports[`test input example 1`] = `
" `; + +exports[`test input focus & blur 1`] = ` +"
+
+
+
+
+
+ +
+
+
+
+
+ + + +
" +`; + +exports[`test input focus & blur 2`] = ` +"
+
+
+
+
+
+ +
+
+
+
+
+ + + +
" +`; + +exports[`test input hint to be false 1`] = ` +"
+
+
+
+
+
+ +
+
+
+
+
+ + + +
" +`; + +exports[`test input maxlength 1`] = ` +"
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
4/100
+
+
+
" +`; + +exports[`test input validation 1`] = ` +"
+
+
+
+
+
+ +
+
+
+
+
+ +
+
长度必须大于3
+
+
+
+
" +`; + +exports[`test input validation 2`] = ` +"
+
+
+
+
+
+ +
+
+
+
+
+ + + +
" +`; + +exports[`test input validation 3`] = ` +"
+
+
+
+
+
+ +
+
+
+
+
+ + + +
" +`; diff --git a/packages/varlet-vue2-ui/src/input/__tests__/index.spec.js b/packages/varlet-vue2-ui/src/input/__tests__/index.spec.js index 459e328..0c76469 100644 --- a/packages/varlet-vue2-ui/src/input/__tests__/index.spec.js +++ b/packages/varlet-vue2-ui/src/input/__tests__/index.spec.js @@ -16,204 +16,206 @@ test('test input plugin', () => { expect(Vue.component(Input.name)).toBeTruthy() }) -// test('test input focus & blur', async () => { -// const onFocus = jest.fn() -// const onBlur = jest.fn() - -// const wrapper = mount(VarInput, { -// listeners: { -// focus: onFocus, -// blur: onBlur, -// }, -// }) - -// wrapper.vm.focus() -// await wrapper.find('.var-input__input').trigger('focus') -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.vm.blur() -// await wrapper.find('.var-input__input').trigger('blur') -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.destroy() -// }) - -// test('test input onInput & onChange & onClick', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) -// const onChange = jest.fn() -// const onClick = jest.fn() - -// const wrapper = mount(VarInput, { -// propsData: { -// value: '', -// }, -// listeners: { -// input: onInput, -// change: onChange, -// click: onClick, -// }, -// }) - -// await wrapper.trigger('click') -// expect(onClick).toHaveBeenCalledTimes(1) - -// wrapper.find('.var-input__input').setValue('t') - -// await wrapper.find('.var-input__input').trigger('input') -// expect(onInput).lastCalledWith('t', new Event('input')) -// expect(wrapper.props('value')).toBe('t') - -// await wrapper.find('.var-input__input').trigger('change') -// expect(onChange).lastCalledWith('t', new Event('input')) - -// wrapper.destroy() -// }) - -// test('test input maxlength', () => { -// const wrapper = mount(VarInput, { -// propsData: { -// value: 'text', -// maxlength: 100, -// }, -// }) - -// expect(wrapper.find('.var-form-details__length').text()).toBe('4/100') -// expect(wrapper.html()).toMatchSnapshot() -// }) - -// test('test input hint to be false', () => { -// const wrapper = mount(VarInput, { -// propsData: { -// value: 'text', -// hint: false, -// }, -// }) - -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.destroy() -// }) - -// test('test input clear', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) -// const onClear = jest.fn() - -// const wrapper = mount(VarInput, { -// propsData: { -// value: 'text', -// clearable: true, -// }, -// listeners: { -// clear: onClear, -// input: onInput, -// }, -// }) - -// expect(wrapper.html()).toMatchSnapshot() - -// await wrapper.find('.var-input__clear-icon').trigger('click') -// expect(onClear).lastCalledWith('') -// expect(wrapper.props('value')).toBe('') - -// wrapper.destroy() -// }) - -// const triggerEvents = async (wrapper) => { -// await wrapper.find('.var-input__input').trigger('input') -// await wrapper.find('.var-input__input').trigger('change') -// await wrapper.find('.var-input__clear-icon').trigger('click') -// await wrapper.trigger('click') -// } - -// test('test input disabled', async () => { -// const onClear = jest.fn() -// const onClick = jest.fn() -// const onInput = jest.fn() -// const onChange = jest.fn() - -// const wrapper = mount(VarInput, { -// propsData: { -// value: 'hello', -// clearable: true, -// disabled: true, -// }, -// listeners: { -// input: onInput, -// clear: onClear, -// click: onClick, -// change: onChange, -// }, -// }) - -// await triggerEvents(wrapper) - -// expect(onInput).toHaveBeenCalledTimes(0) -// expect(onClear).toHaveBeenCalledTimes(0) -// expect(onClick).toHaveBeenCalledTimes(0) -// expect(onChange).toHaveBeenCalledTimes(0) - -// wrapper.destroy() -// }) - -// test('test input readonly', async () => { -// const onClear = jest.fn() -// const onClick = jest.fn() -// const onInput = jest.fn() -// const onChange = jest.fn() - -// const wrapper = mount(VarInput, { -// propsData: { -// value: 'hello', -// clearable: true, -// readonly: true, -// }, -// listeners: { -// input: onInput, -// clear: onClear, -// click: onClick, -// chnage: onChange, -// }, -// }) - -// await triggerEvents(wrapper) - -// expect(onInput).toHaveBeenCalledTimes(0) -// expect(onClear).toHaveBeenCalledTimes(0) -// expect(onClick).toHaveBeenCalledTimes(2) -// expect(onChange).toHaveBeenCalledTimes(0) - -// wrapper.destroy() -// }) - -// test('test input validation', async () => { -// const onInput = jest.fn((value) => wrapper.setProps({ value })) - -// const wrapper = mount(VarInput, { -// propsData: { -// value: '', -// rules: [(v) => v.length > 3 || '长度必须大于3'], -// }, -// listeners: { -// input: onInput, -// }, -// }) - -// wrapper.find('.var-input__input').setValue('1') -// await wrapper.find('.var-input__input').trigger('input') -// await delay(16) -// expect(wrapper.find('.var-form-details__message').text()).toBe('长度必须大于3') -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.vm.reset() -// await delay(16) -// expect(wrapper.props('value')).toBe('') -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.find('.var-input__input').setValue('1234') -// await wrapper.find('.var-input__input').trigger('input') -// await delay(16) -// expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() -// expect(wrapper.html()).toMatchSnapshot() - -// wrapper.destroy() -// }) +test('test input focus & blur', async () => { + const onFocus = jest.fn() + const onBlur = jest.fn() + + const wrapper = mount(VarInput, { + listeners: { + focus: onFocus, + blur: onBlur, + }, + }) + + wrapper.vm.focus() + await wrapper.find('.var-input__input').trigger('focus') + expect(wrapper.html()).toMatchSnapshot() + + wrapper.vm.blur() + await wrapper.find('.var-input__input').trigger('blur') + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +}) + +test('test input onInput & onChange & onClick', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + const onChange = jest.fn() + const onClick = jest.fn() + + const wrapper = mount(VarInput, { + propsData: { + value: '', + }, + listeners: { + input: onInput, + change: onChange, + click: onClick, + }, + }) + + await wrapper.trigger('click') + expect(onClick).toHaveBeenCalledTimes(1) + + wrapper.find('.var-input__input').setValue('t') + + await wrapper.find('.var-input__input').trigger('input') + expect(onInput).lastCalledWith('t', new Event('input')) + expect(wrapper.props('value')).toBe('t') + + await wrapper.find('.var-input__input').trigger('change') + expect(onChange).lastCalledWith('t', new Event('input')) + + wrapper.destroy() +}) + +test('test input maxlength', () => { + const wrapper = mount(VarInput, { + propsData: { + value: 'text', + maxlength: 100, + }, + }) + + expect(wrapper.find('.var-form-details__length').text()).toBe('4/100') + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +}) + +test('test input hint to be false', () => { + const wrapper = mount(VarInput, { + propsData: { + value: 'text', + hint: false, + }, + }) + + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +}) + +test('test input clear', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + const onClear = jest.fn() + + const wrapper = mount(VarInput, { + propsData: { + value: 'text', + clearable: true, + }, + listeners: { + clear: onClear, + input: onInput, + }, + }) + + expect(wrapper.html()).toMatchSnapshot() + + await wrapper.find('.var-input__clear-icon').trigger('click') + expect(onClear).lastCalledWith('') + expect(wrapper.props('value')).toBe('') + + wrapper.destroy() +}) + +const triggerEvents = async (wrapper) => { + await wrapper.find('.var-input__input').trigger('input') + await wrapper.find('.var-input__input').trigger('change') + await wrapper.find('.var-input__clear-icon').trigger('click') + await wrapper.trigger('click') +} + +test('test input disabled', async () => { + const onClear = jest.fn() + const onClick = jest.fn() + const onInput = jest.fn() + const onChange = jest.fn() + + const wrapper = mount(VarInput, { + propsData: { + value: 'hello', + clearable: true, + disabled: true, + }, + listeners: { + input: onInput, + clear: onClear, + click: onClick, + change: onChange, + }, + }) + + await triggerEvents(wrapper) + + expect(onInput).toHaveBeenCalledTimes(0) + expect(onClear).toHaveBeenCalledTimes(0) + expect(onClick).toHaveBeenCalledTimes(0) + expect(onChange).toHaveBeenCalledTimes(0) + + wrapper.destroy() +}) + +test('test input readonly', async () => { + const onClear = jest.fn() + const onClick = jest.fn() + const onInput = jest.fn() + const onChange = jest.fn() + + const wrapper = mount(VarInput, { + propsData: { + value: 'hello', + clearable: true, + readonly: true, + }, + listeners: { + input: onInput, + clear: onClear, + click: onClick, + chnage: onChange, + }, + }) + + await triggerEvents(wrapper) + + expect(onInput).toHaveBeenCalledTimes(0) + expect(onClear).toHaveBeenCalledTimes(0) + expect(onClick).toHaveBeenCalledTimes(2) + expect(onChange).toHaveBeenCalledTimes(0) + + wrapper.destroy() +}) + +test('test input validation', async () => { + const onInput = jest.fn((value) => wrapper.setProps({ value })) + + const wrapper = mount(VarInput, { + propsData: { + value: '', + rules: [(v) => v.length > 3 || '长度必须大于3'], + }, + listeners: { + input: onInput, + }, + }) + + wrapper.find('.var-input__input').setValue('1') + await wrapper.find('.var-input__input').trigger('input') + await delay(16) + expect(wrapper.find('.var-form-details__message').text()).toBe('长度必须大于3') + expect(wrapper.html()).toMatchSnapshot() + + wrapper.vm.reset() + await delay(16) + expect(wrapper.props('value')).toBe('') + expect(wrapper.html()).toMatchSnapshot() + + wrapper.find('.var-input__input').setValue('1234') + await wrapper.find('.var-input__input').trigger('input') + await delay(16) + expect(wrapper.find('.var-form-details__message').exists()).toBeFalsy() + expect(wrapper.html()).toMatchSnapshot() + + wrapper.destroy() +})