UNPKG

quasar

Version:

Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time

795 lines (630 loc) 20.3 kB
import { mount, flushPromises } from '@vue/test-utils' import { describe, test, expect } from 'vitest' import QChip, { defaultSizes } from './QChip.js' describe('[QChip API]', () => { describe('[Props]', () => { describe('[(prop)dense]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.classes() ).not.toContain('q-chip--dense') await wrapper.setProps({ dense: true }) await flushPromises() expect( target.classes() ).toContain('q-chip--dense') }) }) describe('[(prop)size]', () => { test('type String has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.$style('font-size') ).not.toBe('100px') await wrapper.setProps({ size: '100px' }) await flushPromises() expect( target.$style('font-size') ).toBe('100px') await wrapper.setProps({ size: 'sm' }) expect( target.$style('font-size') ).toBe(`${ defaultSizes.sm }px`) }) }) describe('[(prop)dark]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.classes() ).not.toContain('q-chip--dark') await wrapper.setProps({ dark: true }) await flushPromises() expect( target.classes() ).toContain('q-chip--dark') }) test('type null has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.classes() ).not.toContain('q-chip--dense') await wrapper.setProps({ dark: null }) await flushPromises() expect( target.classes() ).not.toContain('q-chip--dense') }) }) describe('[(prop)icon]', () => { test('type String has effect', async () => { const propVal = 'map' const wrapper = mount(QChip) expect( wrapper.find('.q-icon').exists() ).toBe(false) await wrapper.setProps({ icon: propVal }) await flushPromises() expect( wrapper.get('.q-icon').text() ).toContain(propVal) }) }) describe('[(prop)icon-right]', () => { test('type String has effect', async () => { const propVal = 'map' const wrapper = mount(QChip) expect( wrapper.find('.q-icon').exists() ).toBe(false) await wrapper.setProps({ iconRight: propVal }) await flushPromises() expect( wrapper.get('.q-icon').text() ).toContain(propVal) }) }) describe('[(prop)icon-remove]', () => { test('type String has effect', async () => { const propVal = 'map' const wrapper = mount(QChip) expect( wrapper.find('.q-icon').exists() ).toBe(false) await wrapper.setProps({ removable: true, iconRemove: propVal }) await flushPromises() expect( wrapper.get('.q-icon.q-chip__icon--remove') .text() ).toBe(propVal) }) }) describe('[(prop)icon-selected]', () => { test('type String has effect', async () => { const propVal = 'map' const wrapper = mount(QChip) expect( wrapper.find('.q-icon').exists() ).toBe(false) await wrapper.setProps({ selected: true, iconSelected: propVal }) await flushPromises() expect( wrapper.get('.q-chip.q-chip--selected') .get('.q-icon') .text() ).toBe(propVal) }) }) describe('[(prop)label]', () => { test.each([ [ 'String', 'John Doe' ], [ 'Number', 22 ] ])('type %s has effect', async (_, propVal) => { const wrapper = mount(QChip) expect( wrapper.get('.q-chip__content') .text() ).not.toBe('' + propVal) await wrapper.setProps({ label: propVal }) await flushPromises() expect( wrapper.get('.q-chip__content') .text() ).toBe('' + propVal) }) }) describe('[(prop)color]', () => { test('with default design', async () => { const propVal = 'red' const wrapper = mount(QChip) const target = wrapper.get('.q-chip') let cls = target.classes() expect(cls).not.toContain('text-red') expect(cls).not.toContain('bg-red') await wrapper.setProps({ color: propVal }) await flushPromises() cls = target.classes() expect(cls).not.toContain('text-red') expect(cls).toContain('bg-red') }) test('with outline design', async () => { const propVal = 'red' const wrapper = mount(QChip, { props: { outline: true } }) const target = wrapper.get('.q-chip') let cls = target.classes() expect(cls).not.toContain('text-red') expect(cls).not.toContain('bg-red') await wrapper.setProps({ color: propVal }) await flushPromises() cls = target.classes() expect(cls).toContain('text-red') expect(cls).not.toContain('bg-red') }) }) describe('[(prop)text-color]', () => { test('with default design', async () => { const propVal = 'red' const wrapper = mount(QChip) const target = wrapper.get('.q-chip') let cls = target.classes() expect(cls).not.toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).not.toContain('q-chip--colored') await wrapper.setProps({ textColor: propVal }) await flushPromises() cls = target.classes() expect(cls).toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).toContain('q-chip--colored') }) test('with default design + color', async () => { const propVal = 'red' const wrapper = mount(QChip, { props: { color: 'blue' } }) const target = wrapper.get('.q-chip') let cls = target.classes() expect(cls).not.toContain('text-blue') expect(cls).toContain('bg-blue') expect(cls).not.toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).not.toContain('q-chip--colored') await wrapper.setProps({ textColor: propVal }) await flushPromises() cls = target.classes() expect(cls).not.toContain('text-blue') expect(cls).toContain('bg-blue') expect(cls).toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).toContain('q-chip--colored') }) test('with outline design', async () => { const propVal = 'red' const wrapper = mount(QChip, { props: { outline: true } }) const target = wrapper.get('.q-chip') let cls = target.classes() expect(cls).not.toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).not.toContain('q-chip--colored') await wrapper.setProps({ textColor: propVal }) await flushPromises() cls = target.classes() expect(cls).toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).toContain('q-chip--colored') }) test('with outline design + color', async () => { const propVal = 'red' const wrapper = mount(QChip, { props: { color: 'blue', outline: true } }) const target = wrapper.get('.q-chip') let cls = target.classes() expect(cls).not.toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).toContain('text-blue') expect(cls).not.toContain('bg-blue') expect(cls).toContain('q-chip--colored') await wrapper.setProps({ textColor: propVal }) await flushPromises() cls = target.classes() expect(cls).toContain('text-blue') expect(cls).not.toContain('bg-blue') expect(cls).not.toContain('text-red') expect(cls).not.toContain('bg-red') expect(cls).toContain('q-chip--colored') }) }) describe('[(prop)model-value]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip, { props: { modelValue: true } }) expect( wrapper.find('.q-chip').exists() ).toBe(true) await wrapper.setProps({ modelValue: false }) await flushPromises() expect( wrapper.find('.q-chip') .exists() ).toBe(false) }) }) describe('[(prop)selected]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.classes() ).not.toContain('q-chip--selected') await wrapper.setProps({ selected: true, 'onUpdate:selected': val => { wrapper.setProps({ selected: val }) } }) await flushPromises() expect( target.classes() ).toContain('q-chip--selected') }) test('type null has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.classes() ).not.toContain('q-chip--selected') await wrapper.setProps({ selected: null, 'onUpdate:selected': val => { wrapper.setProps({ selected: val }) } }) await flushPromises() expect( target.classes() ).not.toContain('q-chip--selected') }) }) describe('[(prop)square]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.classes() ).not.toContain('q-chip--square') await wrapper.setProps({ square: true }) await flushPromises() expect( target.classes() ).toContain('q-chip--square') expect( target.$computedStyle('border-radius') ).toBe('4px') }) }) describe('[(prop)outline]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.classes() ).not.toContain('q-chip--outline') await wrapper.setProps({ outline: true }) await flushPromises() expect( target.classes() ).toContain('q-chip--outline') }) }) describe('[(prop)clickable]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) const target = wrapper.get('.q-chip') expect( target.attributes('tabindex') ).toBeUndefined() await wrapper.setProps({ clickable: true }) await flushPromises() expect( target.attributes('tabindex') ).toBe('0') expect( target.$computedStyle('cursor') ).toBe('pointer') }) }) describe('[(prop)removable]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) expect( wrapper.find('.q-icon.q-chip__icon--remove') .exists() ).not.toBe(true) await wrapper.setProps({ removable: true }) await flushPromises() expect( wrapper.find('.q-icon.q-chip__icon--remove') .exists() ).toBe(true) }) }) describe('[(prop)ripple]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) expect( wrapper.find('.q-ripple') .exists() ).toBe(false) await wrapper.setProps({ ripple: true }) await flushPromises() await wrapper.trigger('click') expect( wrapper.find('.q-ripple') .exists() ).toBe(true) }) test('type Object has effect', async () => { const propVal = { center: true, color: 'teal', keyCodes: [] } const wrapper = mount(QChip) expect( wrapper.find('.q-ripple') .exists() ).toBe(false) await wrapper.setProps({ ripple: propVal }) await flushPromises() await wrapper.trigger('click') expect( wrapper.find('.q-ripple') .exists() ).toBe(true) }) }) describe('[(prop)remove-aria-label]', () => { test('type String has effect', async () => { const propVal = 'Remove item' const wrapper = mount(QChip, { props: { removable: true } }) const removeIcon = wrapper.get('.q-chip__icon--remove') expect( removeIcon.attributes('aria-label') ).not.toBe(propVal) await wrapper.setProps({ removeAriaLabel: propVal }) await flushPromises() expect( removeIcon.attributes('aria-label') ).toBe(propVal) expect( removeIcon.attributes('tabindex') ).toBe('0') }) }) describe('[(prop)tabindex]', () => { test.each([ [ 'Number', 100 ], [ 'String', '100' ] ])('type %s has effect', async (_, propVal) => { const wrapper = mount(QChip, { props: { clickable: true, tabindex: propVal } }) expect( wrapper.attributes('tabindex') ).toBe('' + propVal) // we'll test clickable + disable await wrapper.setProps({ disable: true }) await flushPromises() expect( wrapper.attributes('tabindex') ).toBeUndefined() expect( wrapper.attributes('aria-disabled') ).toBeUndefined() // we'll now test removable + disable await wrapper.setProps({ clickable: false, removable: true }) await flushPromises() let removeIcon = wrapper.get('.q-chip__icon--remove') expect( removeIcon.attributes('tabindex') ).toBe('-1') expect( removeIcon.attributes('aria-disabled') ).toBe('true') // we'll now test removable await wrapper.setProps({ disable: false }) await flushPromises() removeIcon = wrapper.get('.q-chip__icon--remove') expect( removeIcon.attributes('tabindex') ).toBe('' + propVal) expect( removeIcon.attributes('aria-disabled') ).toBeUndefined() }) }) describe('[(prop)disable]', () => { test('type Boolean has effect', async () => { const wrapper = mount(QChip) expect( wrapper.get('.q-chip').classes() ).not.toContain('disabled') await wrapper.setProps({ disable: true }) await flushPromises() expect( wrapper.get('.q-chip').classes() ).toContain('disabled') }) }) }) describe('[Slots]', () => { describe('[(slot)default]', () => { test('renders the content', () => { const slotContent = 'some-slot-content' const wrapper = mount(QChip, { slots: { default: () => slotContent } }) expect(wrapper.text()).toContain(slotContent) }) }) }) describe('[Events]', () => { describe('[(event)click]', () => { test('is emitting when clickable', async () => { const wrapper = mount(QChip, { props: { clickable: true } }) await wrapper.trigger('click') const eventList = wrapper.emitted() expect(eventList).toHaveProperty('click') expect(eventList.click).toHaveLength(1) const [ evt ] = eventList.click[ 0 ] expect(evt).toBeInstanceOf(Event) }) test('is emitting when selected', async () => { const wrapper = mount(QChip, { props: { selected: true } }) await wrapper.trigger('click') const eventList = wrapper.emitted() expect(eventList).toHaveProperty('click') expect(eventList.click).toHaveLength(1) const [ evt ] = eventList.click[ 0 ] expect(evt).toBeInstanceOf(Event) }) test('is NOT emitting when not clickable or removable', async () => { const wrapper = mount(QChip) await wrapper.trigger('click') const eventList = wrapper.emitted() expect(eventList).not.toHaveProperty('click') }) test('is NOT emitting when disable + clickable', async () => { const wrapper = mount(QChip, { props: { clickable: true, disable: true } }) await wrapper.trigger('click') const eventList = wrapper.emitted() expect(eventList).not.toHaveProperty('click') }) test('is NOT emitting when disable + selected', async () => { const wrapper = mount(QChip, { props: { selected: true, disable: true } }) await wrapper.trigger('click') const eventList = wrapper.emitted() expect(eventList).not.toHaveProperty('click') }) }) describe('[(event)update:selected]', () => { test('is emitting', async () => { const wrapper = mount(QChip, { props: { selected: false, 'onUpdate:selected': val => { wrapper.setProps({ selected: val }) } } }) await wrapper.trigger('click') await flushPromises() const eventList = wrapper.emitted() expect(eventList).toHaveProperty('update:selected') expect(eventList[ 'update:selected' ]).toHaveLength(1) const [ state ] = eventList[ 'update:selected' ][ 0 ] expect(state).toBeTypeOf('boolean') }) test('is NOT emitting when disable', async () => { const wrapper = mount(QChip, { props: { disable: true, selected: false, 'onUpdate:selected': val => { wrapper.setProps({ selected: val }) } } }) await wrapper.trigger('click') await flushPromises() const eventList = wrapper.emitted() expect(eventList).not.toHaveProperty('update:selected') }) }) describe('[(event)remove]', () => { test('is emitting', async () => { const wrapper = mount(QChip, { props: { removable: true } }) await wrapper.get('.q-chip__icon--remove') .trigger('click') const eventList = wrapper.emitted() expect(eventList).toHaveProperty('remove') expect(eventList.remove).toHaveLength(1) expect(eventList.remove[ 0 ]).toHaveLength(0) }) }) describe('[(event)update:model-value]', () => { test('is emitting', async () => { const wrapper = mount(QChip, { props: { removable: true, modelValue: true, 'onUpdate:modelValue': val => { wrapper.setProps({ modelValue: val }) } } }) await wrapper.get('.q-chip__icon--remove') .trigger('click') const eventList = wrapper.emitted() expect(eventList).toHaveProperty('update:modelValue') expect(eventList[ 'update:modelValue' ]).toHaveLength(1) const [ value ] = eventList[ 'update:modelValue' ][ 0 ] expect(value).toBe(false) }) }) }) })