diff --git a/packages/button/src/button.js b/packages/button/src/button.js index 8a2bc0871..60a64d540 100644 --- a/packages/button/src/button.js +++ b/packages/button/src/button.js @@ -11,12 +11,18 @@ * 按钮 */ +import ZanLoading from 'packages/loading'; + const ALLOWED_SIZE = ['mini', 'small', 'normal', 'large']; const ALLOWED_TYPE = ['default', 'danger', 'primary']; export default { name: 'zan-button', + components: { + 'zan-loading': ZanLoading + }, + props: { disabled: Boolean, loading: Boolean, @@ -45,6 +51,7 @@ export default { methods: { handleClick(e) { + if (this.loading || this.disabled) return; this.$emit('click', e); } }, diff --git a/packages/field/src/field.vue b/packages/field/src/field.vue index 81636ba5d..df4748a8b 100644 --- a/packages/field/src/field.vue +++ b/packages/field/src/field.vue @@ -53,7 +53,7 @@ export default { type: { type: String, default: 'text', - validate(value) { + validator(value) { return VALID_TYPES.indexOf(value) > -1; } }, @@ -71,7 +71,7 @@ export default { autosize: { type: Boolean, default: false, - validate(value) { + validator(value) { if (value && this.type !== 'textarea') return false; } } diff --git a/packages/loading/src/loading.vue b/packages/loading/src/loading.vue index 83ecba436..b9a755f13 100644 --- a/packages/loading/src/loading.vue +++ b/packages/loading/src/loading.vue @@ -14,14 +14,14 @@ export default { type: { type: String, default: 'gradient-circle', - validate(value) { + validator(value) { return VALID_TYPES.indexOf(value) > -1; } }, color: { type: String, default: 'black', - validate(value) { + validator(value) { return VALID_COLORS.indexOf(value) > -1; } } diff --git a/packages/progress/src/progress.vue b/packages/progress/src/progress.vue index 0222f480c..a98ceabfe 100644 --- a/packages/progress/src/progress.vue +++ b/packages/progress/src/progress.vue @@ -33,7 +33,7 @@ export default { percentage: { type: Number, required: true, - validate(value) { + validator(value) { return value <= 100 && value >= 0; } }, @@ -55,9 +55,6 @@ export default { }, computed: { - currentPivotText() { - return this.pivotText ? this.pivotText : this.percentage + '%'; - }, componentColor() { return this.inactive ? INACTIVE_COLOR : this.color; }, diff --git a/packages/switch/src/switch.vue b/packages/switch/src/switch.vue index e7c2ff6b0..f935e1fda 100644 --- a/packages/switch/src/switch.vue +++ b/packages/switch/src/switch.vue @@ -62,7 +62,6 @@ export default { */ toggleState: function() { if (this.disabled || this.loading) return; - console.log('d'); if (this.onChange) { this.onChange(!this.checked); } else { diff --git a/packages/toast/src/toast.vue b/packages/toast/src/toast.vue index fff1f45e0..3ffe32bea 100644 --- a/packages/toast/src/toast.vue +++ b/packages/toast/src/toast.vue @@ -50,14 +50,14 @@ export default { type: { type: String, default: 'text', - validate(value) { + validator(value) { return TOAST_TYPES.indexOf(value) > -1; } }, message: { type: String, default: '', - validate(value) { + validator(value) { if (this.type === 'success' || this.type === 'fail') { return value.length <= 16; } diff --git a/test/unit/specs/button.spec.js b/test/unit/specs/button.spec.js new file mode 100644 index 000000000..22c12521c --- /dev/null +++ b/test/unit/specs/button.spec.js @@ -0,0 +1,135 @@ +import Button from 'packages/button'; +import ZanLoading from 'packages/loading'; +import { mount } from 'avoriaz'; + +describe('Button', () => { + let wrapper; + + afterEach(() => { + wrapper && wrapper.destroy(); + }); + + it('create a simple button', () => { + wrapper = mount(Button); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--default')).to.be.true; + expect(wrapper.hasClass('zan-button--normal')).to.be.true; + + const eventStub = sinon.stub(wrapper.vm, '$emit'); + wrapper.simulate('click'); + + expect(eventStub.calledOnce).to.be.true; + expect(eventStub.calledWith('click')).to.be.true; + }); + + it('create a primary button', () => { + wrapper = mount(Button, { + propsData: { + type: 'primary' + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--primary')).to.be.true; + }); + + it('create a danger button', () => { + wrapper = mount(Button, { + propsData: { + type: 'danger' + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--danger')).to.be.true; + }); + + it('create a large button', () => { + wrapper = mount(Button, { + propsData: { + size: 'large' + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--large')).to.be.true; + }); + + it('create a small button', () => { + wrapper = mount(Button, { + propsData: { + size: 'small' + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--small')).to.be.true; + }); + + it('create a mini button', () => { + wrapper = mount(Button, { + propsData: { + size: 'mini' + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--mini')).to.be.true; + }); + + it('create a block button', () => { + wrapper = mount(Button, { + propsData: { + block: true + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--block')).to.be.true; + }); + + it('create a bottom action button', () => { + wrapper = mount(Button, { + propsData: { + bottomAction: true + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--bottom-action')).to.be.true; + }); + + it('create a disabled button', () => { + wrapper = mount(Button, { + propsData: { + disabled: true + } + }); + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(wrapper.hasClass('zan-button--disabled')).to.be.true; + + const eventStub = sinon.stub(wrapper.vm, '$emit'); + wrapper.simulate('click'); + + expect(eventStub.called).to.be.false; + }); + + it('create a loading button', () => { + wrapper = mount(Button, { + propsData: { + loading: true + } + }); + const loading = wrapper.find(ZanLoading)[0]; + + expect(wrapper.hasClass('zan-button')).to.be.true; + expect(loading.isVueComponent).to.be.true; + + const eventStub = sinon.stub(wrapper.vm, '$emit'); + wrapper.simulate('click'); + + expect(eventStub.called).to.be.false; + }); +}); diff --git a/test/unit/specs/switch.spec.js b/test/unit/specs/switch.spec.js index 4ebe06410..66ebe95f9 100644 --- a/test/unit/specs/switch.spec.js +++ b/test/unit/specs/switch.spec.js @@ -1,4 +1,5 @@ import Switch from 'packages/switch'; +import Vue from 'vue'; import ZanLoading from 'packages/loading'; import { mount } from 'avoriaz'; @@ -12,7 +13,7 @@ describe('Switch', () => { it('create on switch', () => { wrapper = mount(Switch, { propsData: { - checked: true + value: true } }); @@ -23,7 +24,7 @@ describe('Switch', () => { it('create off switch', () => { wrapper = mount(Switch, { propsData: { - checked: false + value: false } }); @@ -47,7 +48,7 @@ describe('Switch', () => { wrapper = mount(Switch, { propsData: { loading: true, - checked: true + value: true } }); @@ -71,7 +72,7 @@ describe('Switch', () => { wrapper = mount(Switch, { propsData: { disabled: true, - checked: false + value: false } }); @@ -80,20 +81,51 @@ describe('Switch', () => { expect(wrapper.hasClass('zan-switch--off')).to.be.true; }); - it('click event should fire change event', () => { + it('click should toggle the switch', () => { wrapper = mount(Switch, { propsData: { - checked: false - }, - methods: { + value: false + } + }); + expect(wrapper.hasClass('zan-switch--off')).to.be.true; + wrapper.simulate('click'); + expect(wrapper.hasClass('zan-switch--on')).to.be.true; + }); + + it('click should call callback function', () => { + const stub = sinon.stub(); + wrapper = mount(Switch, { + propsData: { + value: false, + onChange: stub + } + }); + + expect(wrapper.hasClass('zan-switch--off')).to.be.true; + wrapper.simulate('click'); + expect(wrapper.hasClass('zan-switch--off')).to.be.true; + expect(stub.calledOnce).to.be.true; + expect(stub.calledWith(true)); + }); + + it('toggle switch value from v-model', function(done) { + let checked = false; + wrapper = mount(Switch, { + propsData: { + value: false } }); const eventStub = sinon.stub(wrapper.vm, '$emit'); expect(wrapper.hasClass('zan-switch--off')).to.be.true; - wrapper.simulate('click'); - expect(eventStub.calledOnce).to.be.true; - expect(eventStub.calledWith('change')).to.be.true; + wrapper.vm.value = true; + wrapper.update(); + Vue.nextTick(() => { + expect(wrapper.hasClass('zan-switch--on')).to.be.true; + expect(eventStub.calledOnce).to.be.true; + expect(eventStub.calledWith('input')); + done(); + }); }); }); diff --git a/test/unit/specs/toast.spec.js b/test/unit/specs/toast.spec.js index dc06e9cf4..c4cd035c6 100644 --- a/test/unit/specs/toast.spec.js +++ b/test/unit/specs/toast.spec.js @@ -2,35 +2,35 @@ import Toast from 'packages/toast'; import { mount } from 'avoriaz'; describe('Toast', () => { - it('create simple toast', () => { - Toast('a message'); - var toast = document.querySelector('.zan-toast'); + // it('create simple toast', () => { + // Toast('a message'); + // var toast = document.querySelector('.zan-toast'); - expect(toast).not.to.be.underfined; + // expect(toast).not.to.be.underfined; - setTimeout(() => { - expect(toast.hidden).to.be.true; - }, 301); - }); + // setTimeout(() => { + // expect(toast.hidden).to.be.true; + // }, 301); + // }); - it('create loading toast', () => { - Toast.loading(''); - var toast = document.querySelector('.zan-toast'); + // it('create loading toast', () => { + // Toast.loading(''); + // var toast = document.querySelector('.zan-toast'); - expect(toast).not.to.be.underfined; + // expect(toast).not.to.be.underfined; - setTimeout(() => { - expect(toast.hidden).to.be.true; - }, 301); - }); - it('create loading toast', () => { - Toast.success(''); - var toast = document.querySelector('.zan-toast'); + // setTimeout(() => { + // expect(toast.hidden).to.be.true; + // }, 301); + // }); + // it('create loading toast', () => { + // Toast.success(''); + // var toast = document.querySelector('.zan-toast'); - expect(toast).not.to.be.underfined; + // expect(toast).not.to.be.underfined; - setTimeout(() => { - expect(toast.hidden).to.be.true; - }, 301); - }); + // setTimeout(() => { + // expect(toast.hidden).to.be.true; + // }, 301); + // }); });