11import { mount } from '@vue/test-utils'
2+ import { waitNT } from '../../../tests/utils'
23import { BNavItemDropdown } from './nav-item-dropdown'
34
45describe ( 'nav-item-dropdown' , ( ) => {
5- it ( 'should have custom toggle class in nav-item-dropdown ' , async ( ) => {
6+ it ( 'has expected default structure ' , async ( ) => {
67 const wrapper = mount ( BNavItemDropdown , {
78 propsData : {
8- text : 'toggle' ,
9- toggleClass : 'nav-link-custom'
9+ text : 'toggle'
1010 }
1111 } )
12+
1213 expect ( wrapper . vm ) . toBeDefined ( )
13- expect ( wrapper . findAll ( '.dropdown-toggle' ) . length ) . toBe ( 1 )
14- const $toggle = wrapper . find ( '.dropdown-toggle' )
14+ await waitNT ( wrapper . vm )
1515
16- expect ( $toggle . classes ( ) ) . toContain ( 'nav-link' )
16+ expect ( wrapper . element . tagName ) . toBe ( 'LI' )
17+ expect ( wrapper . element . hasAttribute ( 'id' ) ) . toBe ( true )
18+ expect ( wrapper . classes ( ) ) . toContain ( 'nav-item' )
19+ expect ( wrapper . classes ( ) ) . toContain ( 'b-nav-dropdown' )
20+ expect ( wrapper . classes ( ) ) . toContain ( 'dropdown' )
21+
22+ const $toggle = wrapper . find ( '.dropdown-toggle' )
23+ expect ( $toggle . element . tagName ) . toBe ( 'A' )
24+ expect ( $toggle . element . hasAttribute ( 'id' ) ) . toBe ( true )
25+ expect ( $toggle . attributes ( 'role' ) ) . toEqual ( 'button' )
26+ expect ( $toggle . attributes ( 'aria-haspopup' ) ) . toEqual ( 'true' )
27+ expect ( $toggle . attributes ( 'aria-expanded' ) ) . toEqual ( 'false' )
28+ expect ( $toggle . attributes ( 'href' ) ) . toEqual ( `#${ $toggle . attributes ( 'id' ) } ` )
1729 expect ( $toggle . classes ( ) ) . toContain ( 'dropdown-toggle' )
18- expect ( $toggle . classes ( ) ) . toContain ( 'nav-link-custom' )
30+ expect ( $toggle . classes ( ) ) . toContain ( 'nav-link' )
31+
32+ const $menu = wrapper . find ( '.dropdown-menu' )
33+ expect ( $menu . element . tagName ) . toBe ( 'UL' )
34+ expect ( $menu . attributes ( 'tabindex' ) ) . toEqual ( '-1' )
35+ expect ( $menu . attributes ( 'aria-labelledby' ) ) . toEqual ( $toggle . attributes ( 'id' ) )
36+ expect ( $menu . classes ( ) ) . toContain ( 'dropdown-menu' )
1937
2038 wrapper . destroy ( )
2139 } )
@@ -26,31 +44,83 @@ describe('nav-item-dropdown', () => {
2644 text : 'toggle'
2745 }
2846 } )
29- expect ( wrapper . vm ) . toBeDefined ( )
3047
48+ expect ( wrapper . vm ) . toBeDefined ( )
3149 expect ( wrapper . vm . isNav ) . toBe ( true )
3250
3351 wrapper . destroy ( )
3452 } )
3553
54+ it ( 'should have custom toggle class in nav-item-dropdown' , async ( ) => {
55+ const wrapper = mount ( BNavItemDropdown , {
56+ propsData : {
57+ text : 'toggle' ,
58+ toggleClass : 'nav-link-custom'
59+ }
60+ } )
61+
62+ expect ( wrapper . vm ) . toBeDefined ( )
63+
64+ await waitNT ( wrapper . vm )
65+
66+ const $toggle = wrapper . find ( '.dropdown-toggle' )
67+ expect ( $toggle . element . tagName ) . toBe ( 'A' )
68+ expect ( $toggle . attributes ( 'href' ) ) . toEqual ( `#${ $toggle . attributes ( 'id' ) } ` )
69+ expect ( $toggle . classes ( ) ) . toContain ( 'nav-link' )
70+ expect ( $toggle . classes ( ) ) . toContain ( 'dropdown-toggle' )
71+ expect ( $toggle . classes ( ) ) . toContain ( 'nav-link-custom' )
72+
73+ wrapper . destroy ( )
74+ } )
75+
3676 it ( 'should be disabled when disabled prop set' , async ( ) => {
3777 const wrapper = mount ( BNavItemDropdown , {
3878 propsData : {
3979 text : 'toggle' ,
4080 disabled : true
4181 }
4282 } )
83+
4384 expect ( wrapper . vm ) . toBeDefined ( )
44- expect ( wrapper . findAll ( '.dropdown-toggle' ) . length ) . toBe ( 1 )
85+
86+ await waitNT ( wrapper . vm )
87+
4588 const $toggle = wrapper . find ( '.dropdown-toggle' )
4689 expect ( $toggle . element . tagName ) . toBe ( 'A' )
47-
48- expect ( $toggle . attributes ( 'aria-disabled' ) ) . toBeDefined ( )
49- expect ( $toggle . attributes ( 'href' ) ) . toEqual ( '#' )
90+ expect ( $toggle . attributes ( 'role' ) ) . toEqual ( 'button' )
91+ expect ( $toggle . attributes ( 'href' ) ) . toEqual ( `#${ $toggle . attributes ( 'id' ) } ` )
92+ expect ( $toggle . classes ( ) ) . toContain ( 'nav-link' )
93+ expect ( $toggle . classes ( ) ) . toContain ( 'dropdown-toggle' )
5094 expect ( $toggle . classes ( ) ) . toContain ( 'disabled' )
95+ expect ( $toggle . attributes ( 'aria-disabled' ) ) . toBeDefined ( )
96+
97+ wrapper . destroy ( )
98+ } )
99+
100+ it ( 'should prevent click when custom href is set' , async ( ) => {
101+ const wrapper = mount ( BNavItemDropdown , {
102+ propsData : {
103+ text : 'toggle' ,
104+ href : '/foobar'
105+ }
106+ } )
107+
108+ expect ( wrapper . vm ) . toBeDefined ( )
109+
110+ await waitNT ( wrapper . vm )
111+
112+ const $toggle = wrapper . find ( '.dropdown-toggle' )
113+ expect ( $toggle . element . tagName ) . toBe ( 'A' )
114+ expect ( $toggle . attributes ( 'href' ) ) . toEqual ( '/foobar' )
51115 expect ( $toggle . classes ( ) ) . toContain ( 'nav-link' )
52116 expect ( $toggle . classes ( ) ) . toContain ( 'dropdown-toggle' )
53117
118+ await $toggle . trigger ( 'click' )
119+ expect ( wrapper . emitted ( 'toggle' ) ) . toBeDefined ( )
120+ expect ( wrapper . emitted ( 'toggle' ) . length ) . toBe ( 1 )
121+ expect ( wrapper . emitted ( 'toggle' ) [ 0 ] ) . toBeDefined ( )
122+ expect ( wrapper . emitted ( 'toggle' ) [ 0 ] [ 0 ] . defaultPrevented ) . toBe ( true )
123+
54124 wrapper . destroy ( )
55125 } )
56126} )
0 commit comments