bootstrap-vue
Version:
With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extens
269 lines (211 loc) • 7.48 kB
JavaScript
import { mount } from '@vue/test-utils'
import { waitNT, waitRAF } from '../../../tests/utils'
import { BNavItemDropdown } from './nav-item-dropdown'
describe('nav-item-dropdown', () => {
it('has expected default structure', async () => {
const wrapper = mount(BNavItemDropdown)
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
expect(wrapper.element.tagName).toBe('LI')
expect(wrapper.element.hasAttribute('id')).toBe(true)
expect(wrapper.classes()).toContain('nav-item')
expect(wrapper.classes()).toContain('b-nav-dropdown')
expect(wrapper.classes()).toContain('dropdown')
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.element.tagName).toBe('A')
expect($toggle.element.hasAttribute('id')).toBe(true)
expect($toggle.attributes('role')).toEqual('button')
expect($toggle.attributes('aria-haspopup')).toEqual('true')
expect($toggle.attributes('aria-expanded')).toEqual('false')
expect($toggle.attributes('href')).toEqual('#')
expect($toggle.classes()).toContain('dropdown-toggle')
expect($toggle.classes()).toContain('nav-link')
const $menu = wrapper.find('.dropdown-menu')
expect($menu.element.tagName).toBe('UL')
expect($menu.attributes('tabindex')).toEqual('-1')
expect($menu.attributes('aria-labelledby')).toEqual($toggle.attributes('id'))
expect($menu.classes()).toContain('dropdown-menu')
wrapper.destroy()
})
it('should have custom toggle class when "toggle-class" prop set', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
toggleClass: 'nav-link-custom'
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.classes()).toContain('nav-link-custom')
wrapper.destroy()
})
it('should be disabled when "disabled" prop set', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
disabled: true
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.classes()).toContain('disabled')
expect($toggle.attributes('aria-disabled')).toBeDefined()
wrapper.destroy()
})
it('should have href with ID when "id" prop set', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
id: 'foo'
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
expect(wrapper.element.hasAttribute('id')).toBe(true)
expect(wrapper.attributes('id')).toEqual('foo')
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.attributes('href')).toEqual('#foo')
wrapper.destroy()
})
it('should have correct toggle content when "text" prop set [DEPRECATED]', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
text: 'foo'
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.text()).toEqual('foo')
wrapper.destroy()
})
it('should have correct toggle content when "html" prop set', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
text: 'foo',
html: '<span>bar</span>'
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.find('span').exists()).toBe(true)
expect($toggle.text()).toEqual('bar')
wrapper.destroy()
})
it('should have correct toggle content from "text" slot', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
text: 'foo',
html: '<span>bar</span>'
},
slots: {
text: '<strong>baz</strong>'
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.find('strong').exists()).toBe(true)
expect($toggle.text()).toEqual('baz')
wrapper.destroy()
})
it('should have correct toggle content from "button-content" slot', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
text: 'foo',
html: '<span>bar</span>'
},
slots: {
'button-content': '<article>foobar</article>',
text: '<strong>baz</strong>'
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
expect($toggle.find('article').exists()).toBe(true)
expect($toggle.text()).toEqual('foobar')
wrapper.destroy()
})
it('should have correct menu content for "default" slot', async () => {
let slotScope = null
const wrapper = mount(BNavItemDropdown, {
scopedSlots: {
default(scope) {
slotScope = scope
return this.$createElement('div', 'foo')
}
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $menu = wrapper.find('.dropdown-menu')
expect($menu.find('div').exists()).toBe(true)
expect($menu.text()).toEqual('foo')
expect(slotScope).toBeDefined()
expect(slotScope.hide).toBeDefined()
wrapper.destroy()
})
it('should only render menu content when visible when "lazy" prop set', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
lazy: true
},
scopedSlots: {
default() {
return this.$createElement('div', 'bar')
}
}
})
expect(wrapper.vm).toBeDefined()
expect(wrapper.vm.visible).toBe(false)
await waitNT(wrapper.vm)
const $menu = wrapper.find('.dropdown-menu')
expect($menu.find('div').exists()).toBe(false)
wrapper.vm.show()
await waitNT(wrapper.vm)
await waitRAF()
expect(wrapper.vm.visible).toBe(true)
expect($menu.find('div').exists()).toBe(true)
expect($menu.text()).toEqual('bar')
wrapper.vm.hide()
await waitNT(wrapper.vm)
await waitRAF()
expect(wrapper.vm.visible).toBe(false)
expect($menu.find('div').exists()).toBe(false)
wrapper.destroy()
})
it('should open/close on toggle click', async () => {
const wrapper = mount(BNavItemDropdown)
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
expect(wrapper.vm.visible).toBe(false)
expect($toggle.attributes('aria-expanded')).toEqual('false')
await $toggle.trigger('click')
await waitRAF()
expect(wrapper.vm.visible).toBe(true)
expect($toggle.attributes('aria-expanded')).toEqual('true')
await $toggle.trigger('click')
await waitRAF()
expect(wrapper.vm.visible).toBe(false)
expect($toggle.attributes('aria-expanded')).toEqual('false')
wrapper.destroy()
})
it('should prevent toggle click', async () => {
const wrapper = mount(BNavItemDropdown, {
propsData: {
text: 'toggle'
}
})
expect(wrapper.vm).toBeDefined()
await waitNT(wrapper.vm)
const $toggle = wrapper.find('.dropdown-toggle')
await $toggle.trigger('click')
expect(wrapper.emitted('toggle')).toBeDefined()
expect(wrapper.emitted('toggle').length).toBe(1)
expect(wrapper.emitted('toggle')[0]).toBeDefined()
expect(wrapper.emitted('toggle')[0][0].defaultPrevented).toBe(true)
wrapper.destroy()
})
})