bootstrap-vue
Version:
BootstrapVue, with over 40 plugins and more than 80 custom components, custom directives, and over 300 icons, provides one of the most comprehensive implementations of Bootstrap v4 components and grid system for Vue.js. With extensive and automated WAI-AR
341 lines (279 loc) • 8.82 kB
JavaScript
import { mount } from '@vue/test-utils'
import { waitNT, waitRAF } from '../../../tests/utils'
import { BTab } from './tab'
describe('tab', () => {
it('default has expected classes, attributes and structure', async () => {
const wrapper = mount(BTab)
expect(wrapper).toBeDefined()
await waitNT(wrapper.vm)
expect(wrapper.is('div')).toBe(true)
expect(wrapper.classes()).toContain('tab-pane')
expect(wrapper.classes()).not.toContain('disabled')
expect(wrapper.classes()).not.toContain('active')
expect(wrapper.classes()).not.toContain('show')
expect(wrapper.classes()).not.toContain('fade')
expect(wrapper.classes()).not.toContain('card-body')
expect(wrapper.attributes('role')).toBe('tabpanel')
expect(wrapper.attributes('aria-hidden')).toBe('true')
expect(wrapper.attributes('labelledby')).not.toBeDefined()
expect(wrapper.attributes('tabindex')).not.toBeDefined()
expect(wrapper.attributes('id')).toBeDefined()
wrapper.destroy()
})
it('default has expected data state', async () => {
const wrapper = mount(BTab)
expect(wrapper.vm._isTab).toBe(true)
expect(wrapper.vm.localActive).toBe(false)
expect(wrapper.vm.show).toBe(false)
wrapper.destroy()
})
it('has class disabled when disabled=true', async () => {
const wrapper = mount(BTab, {
propsData: { disabled: true }
})
expect(wrapper.classes()).toContain('disabled')
expect(wrapper.classes()).toContain('tab-pane')
expect(wrapper.classes()).not.toContain('active')
expect(wrapper.classes()).not.toContain('card-body')
wrapper.destroy()
})
it('has class active when active=true', async () => {
const wrapper = mount(BTab, {
propsData: { active: true }
})
expect(wrapper.classes()).toContain('active')
expect(wrapper.classes()).not.toContain('disabled')
expect(wrapper.classes()).not.toContain('card-body')
wrapper.destroy()
})
it('does not have class active when active=true and disabled=true', async () => {
const wrapper = mount(BTab, {
propsData: {
active: true,
disabled: true
}
})
expect(wrapper.classes()).not.toContain('active')
expect(wrapper.classes()).toContain('disabled')
expect(wrapper.classes()).toContain('tab-pane')
expect(wrapper.classes()).not.toContain('card-body')
wrapper.destroy()
})
it('has class active and show when localActive becomes true', async () => {
const wrapper = mount(BTab, {
mountToDocument: true,
stubs: {
// The builtin stub doesn't execute the transition hooks
// so we let it use the real transition component
transition: false
}
})
expect(wrapper.classes()).not.toContain('active')
expect(wrapper.classes()).not.toContain('disabled')
expect(wrapper.classes()).not.toContain('card-body')
wrapper.setData({ localActive: true })
await waitNT(wrapper.vm)
await waitRAF()
expect(wrapper.classes()).toContain('active')
expect(wrapper.classes()).not.toContain('disabled')
expect(wrapper.classes()).not.toContain('card-body')
wrapper.setData({ localActive: false })
await waitNT(wrapper.vm)
await waitRAF()
expect(wrapper.classes()).not.toContain('active')
expect(wrapper.classes()).not.toContain('disabled')
expect(wrapper.classes()).not.toContain('card-body')
wrapper.destroy()
})
it('emits event "update:active" when localActive becomes true', async () => {
const wrapper = mount(BTab)
let called = false
let value = null
wrapper.vm.$on('update:active', val => {
called = true
value = val
})
expect(called).toBe(false)
expect(value).toBe(null)
wrapper.setData({ localActive: true })
expect(called).toBe(true)
expect(value).toBe(true)
wrapper.destroy()
})
it('has class card-body when parent has card=true', async () => {
const wrapper = mount(BTab, {
provide() {
return {
bvTabs: {
fade: false,
lazy: false,
card: true,
noKeyNav: true
}
}
}
})
expect(wrapper.classes()).toContain('card-body')
expect(wrapper.classes()).toContain('tab-pane')
expect(wrapper.classes()).not.toContain('disabled')
expect(wrapper.classes()).not.toContain('active')
wrapper.destroy()
})
it('does not have class card-body when parent has card=true and prop no-body is set', async () => {
const wrapper = mount(BTab, {
provide() {
return {
bvTabs: {
fade: false,
lazy: false,
card: true,
noKeyNav: true
}
}
},
propsData: {
noBody: true
}
})
expect(wrapper.classes()).not.toContain('card-body')
expect(wrapper.classes()).toContain('tab-pane')
expect(wrapper.classes()).not.toContain('disabled')
expect(wrapper.classes()).not.toContain('active')
wrapper.destroy()
})
it("calls parent's updateButton() when title slot provided", async () => {
let called = false
let vm = null
const wrapper = mount(BTab, {
provide() {
return {
bvTabs: {
fade: false,
lazy: false,
card: false,
noKeyNav: false,
updateButton(tab) {
called = true
vm = tab
return true
}
}
}
},
slots: {
title: '<b>foobar</b>'
}
})
wrapper.setData({ localActive: true })
expect(called).toBe(true)
expect(vm).toEqual(wrapper.vm)
wrapper.destroy()
})
it('calls parent de/activateTab() when prop active changes', async () => {
let activateCalled = false
let activateVm = null
let deactivateCalled = false
let deactivateVm = null
const wrapper = mount(BTab, {
provide() {
return {
bvTabs: {
fade: false,
lazy: false,
card: false,
noKeyNav: false,
activateTab(tab) {
activateCalled = true
activateVm = tab
tab.localActive = true
return true
},
deactivateTab(tab) {
deactivateCalled = true
deactivateVm = tab
tab.localActive = false
return true
}
}
}
}
})
expect(activateCalled).toBe(false)
expect(activateVm).toBe(null)
expect(deactivateCalled).toBe(false)
expect(deactivateVm).toBe(null)
wrapper.setProps({ active: true })
expect(activateCalled).toBe(true)
expect(activateVm).toBe(wrapper.vm)
expect(deactivateCalled).toBe(false)
expect(deactivateVm).toBe(null)
activateCalled = false
activateVm = null
deactivateCalled = false
deactivateVm = null
wrapper.setProps({ active: false })
expect(activateCalled).toBe(false)
expect(activateVm).toBe(null)
expect(deactivateCalled).toBe(true)
expect(deactivateVm).toBe(wrapper.vm)
wrapper.destroy()
})
it('does not call parent activateTab() when prop active changes and disabled=true', async () => {
let activateCalled = false
let activateVm = null
const wrapper = mount(BTab, {
provide() {
return {
bvTabs: {
fade: false,
lazy: false,
card: false,
noKeyNav: false,
activateTab(tab) {
activateCalled = true
activateVm = tab
tab.localActive = true
return true
}
}
}
},
propsData: { disabled: true }
})
expect(activateCalled).toBe(false)
expect(activateVm).toBe(null)
wrapper.setProps({ active: true })
expect(activateCalled).toBe(false)
expect(activateVm).toBe(null)
wrapper.destroy()
})
it('does not call parent deactivateTab() when deactivate() called and not active', async () => {
let deactivateCalled = false
let deactivateVm = null
const wrapper = mount(BTab, {
provide() {
return {
bvTabs: {
fade: false,
lazy: false,
card: false,
noKeyNav: false,
deactivateTab(tab) {
deactivateCalled = true
deactivateVm = tab
tab.localActive = false
return true
}
}
}
}
})
expect(deactivateCalled).toBe(false)
expect(deactivateVm).toBe(null)
const result = wrapper.vm.deactivate()
expect(deactivateCalled).toBe(false)
expect(deactivateVm).toBe(null)
expect(result).toBe(false)
wrapper.destroy()
})
})