vShow.spec.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { children, on, render, template, vShow, withDirectives } from '../src'
  2. import { defineComponent, nextTick, ref } from 'vue'
  3. import { afterEach, beforeEach, describe, expect, test } from 'vitest'
  4. let host: HTMLElement
  5. const initHost = () => {
  6. host = document.createElement('div')
  7. host.setAttribute('id', 'host')
  8. document.body.appendChild(host)
  9. }
  10. beforeEach(() => {
  11. initHost()
  12. })
  13. afterEach(() => {
  14. host.remove()
  15. })
  16. const createDemo = (defaultValue: boolean) =>
  17. defineComponent({
  18. setup() {
  19. const visible = ref(defaultValue)
  20. function handleClick() {
  21. visible.value = !visible.value
  22. }
  23. const t0 = template('<button>toggle</button><h1>hello world</h1>')
  24. const n0 = t0()
  25. const {
  26. 0: [n1],
  27. 1: [n2],
  28. } = children(n0)
  29. withDirectives(n2, [[vShow, () => visible.value]])
  30. on(n1 as HTMLElement, 'click', handleClick)
  31. return n0
  32. },
  33. })
  34. describe('directive: v-show', () => {
  35. test('basic', async () => {
  36. const demo = createDemo(true)
  37. render(demo as any, {}, '#host')
  38. const btn = host.querySelector('button')
  39. expect(host.innerHTML).toBe('<button>toggle</button><h1>hello world</h1>')
  40. btn?.click()
  41. await nextTick()
  42. expect(host.innerHTML).toBe(
  43. '<button>toggle</button><h1 style="display: none;">hello world</h1>',
  44. )
  45. })
  46. test('should hide content when default value is false', async () => {
  47. const demo = createDemo(false)
  48. render(demo as any, {}, '#host')
  49. const btn = host.querySelector('button')
  50. const h1 = host.querySelector('h1')
  51. expect(h1?.style.display).toBe('none')
  52. btn?.click()
  53. await nextTick()
  54. expect(h1?.style.display).toBe('')
  55. })
  56. })