collapse.test.tsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import { nextTick } from 'vue'
  2. import { mount } from '@vue/test-utils'
  3. import { describe, expect, test, vi } from 'vitest'
  4. import Collapse from '../src/collapse.vue'
  5. import CollapseItem from '../src/collapse-item.vue'
  6. import type { VueWrapper } from '@vue/test-utils'
  7. import type { CollapseItemInstance } from '../src/instance'
  8. describe('Collapse.vue', () => {
  9. test('create', async () => {
  10. const wrapper = mount({
  11. data() {
  12. return {
  13. activeNames: ['1'],
  14. }
  15. },
  16. render() {
  17. return (
  18. <Collapse v-model={this.activeNames}>
  19. <CollapseItem title="title1" name="1">
  20. <div class="content">111</div>
  21. </CollapseItem>
  22. <CollapseItem title="title2" name="2">
  23. <div class="content">222</div>
  24. </CollapseItem>
  25. <CollapseItem title="title3" name="3">
  26. <div class="content">333</div>
  27. </CollapseItem>
  28. <CollapseItem title="title4" name="4">
  29. <div class="content">444</div>
  30. </CollapseItem>
  31. </Collapse>
  32. )
  33. },
  34. })
  35. const vm = wrapper.vm
  36. const collapseWrapper = wrapper.findComponent(Collapse)
  37. const collapseItemWrappers = collapseWrapper.findAllComponents(
  38. CollapseItem
  39. ) as VueWrapper<CollapseItemInstance>[]
  40. const collapseItemHeaderEls = vm.$el.querySelectorAll(
  41. '.el-collapse-item__header'
  42. )
  43. expect(collapseItemWrappers[0].vm.isActive).toBe(true)
  44. collapseItemHeaderEls[2].click()
  45. await nextTick()
  46. expect(collapseItemWrappers[0].vm.isActive).toBe(true)
  47. expect(collapseItemWrappers[2].vm.isActive).toBe(true)
  48. collapseItemHeaderEls[0].click()
  49. await nextTick()
  50. expect(collapseItemWrappers[0].vm.isActive).toBe(false)
  51. })
  52. test('accordion', async () => {
  53. const wrapper = mount({
  54. data() {
  55. return {
  56. activeNames: ['1'],
  57. }
  58. },
  59. render() {
  60. return (
  61. <Collapse accordion v-model={this.activeNames}>
  62. <CollapseItem title="title1" name="1">
  63. <div class="content">111</div>
  64. </CollapseItem>
  65. <CollapseItem title="title2" name="2">
  66. <div class="content">222</div>
  67. </CollapseItem>
  68. <CollapseItem title="title3" name="3">
  69. <div class="content">333</div>
  70. </CollapseItem>
  71. <CollapseItem title="title4" name="4">
  72. <div class="content">444</div>
  73. </CollapseItem>
  74. </Collapse>
  75. )
  76. },
  77. })
  78. const vm = wrapper.vm
  79. const collapseWrapper = wrapper.findComponent(Collapse)
  80. const collapseItemWrappers = collapseWrapper.findAllComponents(
  81. CollapseItem
  82. ) as VueWrapper<CollapseItemInstance>[]
  83. const collapseItemHeaderEls = vm.$el.querySelectorAll(
  84. '.el-collapse-item__header'
  85. )
  86. expect(collapseItemWrappers[0].vm.isActive).toBe(true)
  87. collapseItemHeaderEls[2].click()
  88. await nextTick()
  89. expect(collapseItemWrappers[0].vm.isActive).toBe(false)
  90. expect(collapseItemWrappers[2].vm.isActive).toBe(true)
  91. collapseItemHeaderEls[0].click()
  92. await nextTick()
  93. expect(collapseItemWrappers[0].vm.isActive).toBe(true)
  94. expect(collapseItemWrappers[2].vm.isActive).toBe(false)
  95. })
  96. test('event:change', async () => {
  97. const onChange = vi.fn()
  98. const wrapper = mount({
  99. data() {
  100. return {
  101. activeNames: ['1'],
  102. }
  103. },
  104. render() {
  105. return (
  106. <Collapse v-model={this.activeNames} onChange={onChange}>
  107. <CollapseItem title="title1" name="1">
  108. <div class="content">111</div>
  109. </CollapseItem>
  110. <CollapseItem title="title2" name="2">
  111. <div class="content">222</div>
  112. </CollapseItem>
  113. <CollapseItem title="title3" name="3">
  114. <div class="content">333</div>
  115. </CollapseItem>
  116. <CollapseItem title="title4" name="4">
  117. <div class="content">444</div>
  118. </CollapseItem>
  119. </Collapse>
  120. )
  121. },
  122. })
  123. const vm = wrapper.vm
  124. const collapseWrapper = wrapper.findComponent(Collapse)
  125. const collapseItemWrappers = collapseWrapper.findAllComponents(
  126. CollapseItem
  127. ) as VueWrapper<CollapseItemInstance>[]
  128. const collapseItemHeaderEls = vm.$el.querySelectorAll(
  129. '.el-collapse-item__header'
  130. )
  131. expect(collapseItemWrappers[0].vm.isActive).toBe(true)
  132. expect(vm.activeNames).toEqual(['1'])
  133. expect(onChange).not.toHaveBeenCalled()
  134. collapseItemHeaderEls[2].click()
  135. await nextTick()
  136. expect(onChange).toHaveBeenCalledTimes(1)
  137. expect(collapseItemWrappers[0].vm.isActive).toBe(true)
  138. expect(collapseItemWrappers[2].vm.isActive).toBe(true)
  139. expect(vm.activeNames).toEqual(['1', '3'])
  140. collapseItemHeaderEls[0].click()
  141. await nextTick()
  142. expect(onChange).toHaveBeenCalledTimes(2)
  143. expect(collapseItemWrappers[0].vm.isActive).toBe(false)
  144. expect(vm.activeNames).toEqual(['3'])
  145. })
  146. test('deep watch modelValue', async () => {
  147. const wrapper = mount({
  148. data() {
  149. return {
  150. activeNames: ['1'],
  151. }
  152. },
  153. mounted() {
  154. this.activeNames.push('2')
  155. },
  156. render() {
  157. return (
  158. <Collapse v-model={this.activeNames}>
  159. <CollapseItem title="title1" name="1">
  160. <div class="content">111</div>
  161. </CollapseItem>
  162. <CollapseItem title="title2" name="2">
  163. <div class="content">222</div>
  164. </CollapseItem>
  165. <CollapseItem title="title3" name="3">
  166. <div class="content">333</div>
  167. </CollapseItem>
  168. <CollapseItem title="title4" name="4">
  169. <div class="content">444</div>
  170. </CollapseItem>
  171. </Collapse>
  172. )
  173. },
  174. })
  175. await nextTick()
  176. const collapseWrapper = wrapper.findComponent(Collapse)
  177. const collapseItemWrappers = collapseWrapper.findAllComponents(
  178. CollapseItem
  179. ) as VueWrapper<CollapseItemInstance>[]
  180. expect(collapseItemWrappers[0].vm.isActive).toBe(true)
  181. expect(collapseItemWrappers[1].vm.isActive).toBe(true)
  182. })
  183. })