Skip to content

Commit c2a066b

Browse files
authored
chore: add additional navbar tests (bootstrap-vue#2398)
1 parent c0e5f55 commit c2a066b

File tree

4 files changed

+292
-0
lines changed

4 files changed

+292
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import NavbarBrand from './navbar-brand'
2+
import { mount } from '@vue/test-utils'
3+
4+
describe('navbar-brand', async () => {
5+
it('default has tag "div"', async () => {
6+
const wrapper = mount(NavbarBrand)
7+
expect(wrapper.is('div')).toBe(true)
8+
})
9+
10+
it('default has class "navbar-brand"', async () => {
11+
const wrapper = mount(NavbarBrand)
12+
expect(wrapper.classes()).toContain('navbar-brand')
13+
expect(wrapper.classes().length).toBe(1)
14+
})
15+
16+
it('accepts custom tag', async () => {
17+
const wrapper = mount(NavbarBrand, {
18+
context: {
19+
props: { tag: 'span' }
20+
}
21+
})
22+
expect(wrapper.is('span')).toBe(true)
23+
expect(wrapper.classes()).toContain('navbar-brand')
24+
expect(wrapper.classes().length).toBe(1)
25+
})
26+
27+
it('renders link when href set', async () => {
28+
const wrapper = mount(NavbarBrand, {
29+
context: {
30+
props: { href: '#foo' }
31+
}
32+
})
33+
expect(wrapper.is('a')).toBe(true)
34+
expect(wrapper.attributes('href')).toBe('#foo')
35+
expect(wrapper.classes()).toContain('navbar-brand')
36+
expect(wrapper.classes().length).toBe(1)
37+
})
38+
})
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import NavbarNav from './navbar-nav'
2+
import { mount } from '@vue/test-utils'
3+
4+
describe('navbar-nav', async () => {
5+
it('default has tag "ul"', async () => {
6+
const wrapper = mount(NavbarNav)
7+
expect(wrapper.is('ul')).toBe(true)
8+
})
9+
10+
it('default has class "navbar-nav"', async () => {
11+
const wrapper = mount(NavbarNav)
12+
expect(wrapper.classes()).toContain('navbar-nav')
13+
expect(wrapper.classes().length).toBe(1)
14+
})
15+
16+
it('accepts custom tag', async () => {
17+
const wrapper = mount(NavbarNav, {
18+
context: {
19+
props: { tag: 'div' }
20+
}
21+
})
22+
expect(wrapper.is('div')).toBe(true)
23+
expect(wrapper.classes()).toContain('navbar-nav')
24+
expect(wrapper.classes().length).toBe(1)
25+
})
26+
27+
it('has class "nav-fill" when fill=true', async () => {
28+
const wrapper = mount(NavbarNav, {
29+
context: {
30+
props: { fill: true }
31+
}
32+
})
33+
expect(wrapper.classes()).toContain('nav-fill')
34+
expect(wrapper.classes()).toContain('navbar-nav')
35+
expect(wrapper.classes().length).toBe(2)
36+
})
37+
38+
it('has class "nav-justified" when justified=true', async () => {
39+
const wrapper = mount(NavbarNav, {
40+
context: {
41+
props: { justified: true }
42+
}
43+
})
44+
expect(wrapper.classes()).toContain('nav-justified')
45+
expect(wrapper.classes()).toContain('navbar-nav')
46+
expect(wrapper.classes().length).toBe(2)
47+
})
48+
})
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import NavbarToggle from './navbar-toggle'
2+
import { mount } from '@vue/test-utils'
3+
4+
describe('navbar-toggle', async () => {
5+
it('default has tag "button"', async () => {
6+
const wrapper = mount(NavbarToggle, {
7+
propsData: {
8+
target: 'target'
9+
}
10+
})
11+
expect(wrapper.is('button')).toBe(true)
12+
})
13+
14+
it('default has class "navbar-toggler"', async () => {
15+
const wrapper = mount(NavbarToggle, {
16+
propsData: {
17+
target: 'target'
18+
}
19+
})
20+
expect(wrapper.classes()).toContain('navbar-toggler')
21+
expect(wrapper.classes().length).toBe(1)
22+
})
23+
24+
it('default has default attributes', async () => {
25+
const wrapper = mount(NavbarToggle, {
26+
propsData: {
27+
target: 'target'
28+
}
29+
})
30+
expect(wrapper.attributes('type')).toBe('button')
31+
expect(wrapper.attributes('aria-controls')).toBe('target')
32+
expect(wrapper.attributes('aria-expanded')).toBe('false')
33+
expect(wrapper.attributes('aria-label')).toBe('Toggle navigation')
34+
})
35+
36+
it('default has inner button-close', async () => {
37+
const wrapper = mount(NavbarToggle, {
38+
propsData: {
39+
target: 'target'
40+
}
41+
})
42+
expect(wrapper.find('span.navbar-toggler-icon')).toBeDefined()
43+
})
44+
45+
it('accepts custom label when label prop is set', async () => {
46+
const wrapper = mount(NavbarToggle, {
47+
propsData: {
48+
target: 'target',
49+
label: 'foobar'
50+
}
51+
})
52+
expect(wrapper.attributes('aria-label')).toBe('foobar')
53+
})
54+
55+
it('emits click event', async () => {
56+
const wrapper = mount(NavbarToggle, {
57+
propsData: {
58+
target: 'target'
59+
}
60+
})
61+
let rootClicked = false
62+
function onRootClick () {
63+
rootClicked = true
64+
}
65+
wrapper.vm.$root.$on('bv::toggle::collapse', onRootClick)
66+
67+
expect(wrapper.emitted('click')).not.toBeDefined()
68+
expect(rootClicked).toBe(false)
69+
70+
wrapper.trigger('click')
71+
expect(wrapper.emitted('click')).toBeDefined()
72+
expect(rootClicked).toBe(true)
73+
74+
wrapper.vm.$root.$off('bv::toggle::collapse', onRootClick)
75+
})
76+
77+
it('sets areia-expanded when receives root emit for target', async () => {
78+
const wrapper = mount(NavbarToggle, {
79+
propsData: {
80+
target: 'target'
81+
}
82+
})
83+
wrapper.vm.$root.$emit('bv::collapse::state', 'target', true)
84+
expect(wrapper.attributes('aria-expanded')).toBe('true')
85+
wrapper.vm.$root.$emit('bv::collapse::state', 'target', false)
86+
expect(wrapper.attributes('aria-expanded')).toBe('false')
87+
wrapper.vm.$root.$emit('bv::collapse::state', 'foo', true)
88+
expect(wrapper.attributes('aria-expanded')).toBe('false')
89+
})
90+
})

src/components/navbar/navbar.spec.js

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import Navbar from './navbar'
2+
import { mount } from '@vue/test-utils'
3+
4+
describe('navbar', async () => {
5+
it('default has tag "nav"', async () => {
6+
const wrapper = mount(Navbar)
7+
expect(wrapper.is('nav')).toBe(true)
8+
// no role added if default tag is used
9+
expect(wrapper.attributes('role')).not.toBeDefined()
10+
})
11+
12+
it('default has class "navbar", "navbar-expand", "navbar-light"', async () => {
13+
const wrapper = mount(Navbar)
14+
expect(wrapper.classes()).toContain('navbar')
15+
expect(wrapper.classes()).toContain('navbar-expand')
16+
expect(wrapper.classes()).toContain('navbar-light')
17+
expect(wrapper.classes().length).toBe(3)
18+
})
19+
20+
it('accepts custom tag', async () => {
21+
const wrapper = mount(Navbar, {
22+
context: {
23+
props: { tag: 'div' }
24+
}
25+
})
26+
expect(wrapper.is('div')).toBe(true)
27+
expect(wrapper.attributes('role')).toBeDefined()
28+
expect(wrapper.attributes('role')).toBe('navigation')
29+
})
30+
31+
it('accepts breakpoint via toggleable prop', async () => {
32+
const wrapper = mount(Navbar, {
33+
context: {
34+
props: { toggleable: 'lg' }
35+
}
36+
})
37+
expect(wrapper.classes()).toContain('navbar')
38+
expect(wrapper.classes()).toContain('navbar-expand-lg')
39+
expect(wrapper.classes()).toContain('navbar-light')
40+
expect(wrapper.classes().length).toBe(3)
41+
})
42+
43+
it('toggleable=true has expected classes', async () => {
44+
const wrapper = mount(Navbar, {
45+
context: {
46+
props: { toggleable: true }
47+
}
48+
})
49+
expect(wrapper.classes()).toContain('navbar')
50+
expect(wrapper.classes()).toContain('navbar-light')
51+
expect(wrapper.classes().length).toBe(2)
52+
})
53+
54+
it('toggleable=xs has expected classes', async () => {
55+
const wrapper = mount(Navbar, {
56+
context: {
57+
props: { toggleable: 'xs' }
58+
}
59+
})
60+
expect(wrapper.classes()).toContain('navbar')
61+
expect(wrapper.classes()).toContain('navbar-light')
62+
expect(wrapper.classes().length).toBe(2)
63+
})
64+
65+
it('has class "fixed-top" when fixed="top"', async () => {
66+
const wrapper = mount(Navbar, {
67+
context: {
68+
props: { fixed: 'top' }
69+
}
70+
})
71+
expect(wrapper.classes()).toContain('fixed-top')
72+
expect(wrapper.classes()).toContain('navbar')
73+
expect(wrapper.classes()).toContain('navbar-expand')
74+
expect(wrapper.classes()).toContain('navbar-light')
75+
expect(wrapper.classes().length).toBe(4)
76+
})
77+
78+
it('has class "fixed-top" when fixed="top"', async () => {
79+
const wrapper = mount(Navbar, {
80+
context: {
81+
props: { fixed: 'top' }
82+
}
83+
})
84+
expect(wrapper.classes()).toContain('fixed-top')
85+
expect(wrapper.classes()).toContain('navbar')
86+
expect(wrapper.classes()).toContain('navbar-expand')
87+
expect(wrapper.classes()).toContain('navbar-light')
88+
expect(wrapper.classes().length).toBe(4)
89+
})
90+
91+
it('has class "sticky-top" when sticky=true', async () => {
92+
const wrapper = mount(Navbar, {
93+
context: {
94+
props: { sticky: true }
95+
}
96+
})
97+
expect(wrapper.classes()).toContain('sticky-top')
98+
expect(wrapper.classes()).toContain('navbar')
99+
expect(wrapper.classes()).toContain('navbar-expand')
100+
expect(wrapper.classes()).toContain('navbar-light')
101+
expect(wrapper.classes().length).toBe(4)
102+
})
103+
104+
it('accepts variant prop', async () => {
105+
const wrapper = mount(Navbar, {
106+
context: {
107+
props: { variant: 'primary' }
108+
}
109+
})
110+
expect(wrapper.classes()).toContain('bg-primary')
111+
expect(wrapper.classes()).toContain('navbar')
112+
expect(wrapper.classes()).toContain('navbar-expand')
113+
expect(wrapper.classes()).toContain('navbar-light')
114+
expect(wrapper.classes().length).toBe(4)
115+
})
116+
})

0 commit comments

Comments
 (0)