if.spec.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import Vue from 'vue'
  2. describe('Directive v-if', () => {
  3. it('should check if value is truthy', () => {
  4. const vm = new Vue({
  5. el: '#app',
  6. template: '<div><span v-if="foo">hello</span></div>',
  7. data: { foo: true }
  8. })
  9. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  10. })
  11. it('should check if value is falthy', () => {
  12. const vm = new Vue({
  13. el: '#app',
  14. template: '<div><span v-if="foo">hello</span></div>',
  15. data: { foo: false }
  16. })
  17. expect(vm.$el.innerHTML).toBe('')
  18. })
  19. it('should update if value changed', done => {
  20. const vm = new Vue({
  21. el: '#app',
  22. template: '<div><span v-if="foo">hello</span></div>',
  23. data: { foo: true }
  24. })
  25. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  26. vm.foo = false
  27. waitForUpdate(() => {
  28. expect(vm.$el.innerHTML).toBe('')
  29. vm.foo = {}
  30. res()
  31. }).then(() => {
  32. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  33. vm.foo = 0
  34. }).then(() => {
  35. expect(vm.$el.innerHTML).toBe('')
  36. vm.foo = []
  37. }).then(() => {
  38. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  39. vm.foo = null
  40. }).then(() => {
  41. expect(vm.$el.innerHTML).toBe('')
  42. vm.foo = '0'
  43. }).then(() => {
  44. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  45. vm.foo = undefined
  46. }).then(() => {
  47. expect(vm.$el.innerHTML).toBe('')
  48. vm.foo = 1
  49. }).then(() => {
  50. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  51. done()
  52. })
  53. .catch(done)
  54. })
  55. it('should work well with v-else', done => {
  56. const vm = new Vue({
  57. el: '#app',
  58. template: `
  59. <div>
  60. <span v-if="foo">hello</span>
  61. <span v-else>bye</span>
  62. </div>
  63. `,
  64. data: { foo: true }
  65. })
  66. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  67. vm.foo = false
  68. waitForUpdate(() => {
  69. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  70. vm.foo = {}
  71. res()
  72. }).then(() => {
  73. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  74. vm.foo = 0
  75. }).then(() => {
  76. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  77. vm.foo = []
  78. }).then(() => {
  79. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  80. vm.foo = null
  81. }).then(() => {
  82. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  83. vm.foo = '0'
  84. }).then(() => {
  85. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  86. vm.foo = undefined
  87. }).then(() => {
  88. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  89. vm.foo = 1
  90. }).then(() => {
  91. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  92. done()
  93. }).catch(done)
  94. })
  95. it('should work well with v-for', done => {
  96. const vm = new Vue({
  97. el: '#app',
  98. template: `
  99. <div>
  100. <span v-for="item,i in list" v-if="item.value">{{i}}</span>
  101. </div>
  102. `,
  103. data: {
  104. list: [
  105. { value: true },
  106. { value: false },
  107. { value: true }
  108. ]
  109. }
  110. })
  111. expect(vm.$el.innerHTML).toBe('<span>0</span><span>2</span>')
  112. vm.list[0].value = false
  113. waitForUpdate(() => {
  114. expect(vm.$el.innerHTML).toBe('<span>2</span>')
  115. vm.list.push({ value: true })
  116. res()
  117. }).then(() => {
  118. expect(vm.$el.innerHTML).toBe('<span>2</span><span>3</span>')
  119. vm.list.splice(1, 2)
  120. }).then(() => {
  121. expect(vm.$el.innerHTML).toBe('<span>1</span>')
  122. done()
  123. }).catch(done)
  124. })
  125. it('should work well with v-for and v-else', done => {
  126. const vm = new Vue({
  127. el: '#app',
  128. template: `
  129. <div>
  130. <span v-for="item,i in list" v-if="item.value">hello</span>
  131. <span v-else>bye</span>
  132. </div>
  133. `,
  134. data: {
  135. list: [
  136. { value: true },
  137. { value: false },
  138. { value: true }
  139. ]
  140. }
  141. })
  142. expect(vm.$el.innerHTML).toBe('<span>hello</span><span>bye</span><span>hello</span>')
  143. vm.list[0].value = false
  144. waitForUpdate(() => {
  145. expect(vm.$el.innerHTML).toBe('<span>bye</span><span>bye</span><span>hello</span>')
  146. vm.list.push({ value: true })
  147. res()
  148. }).then(() => {
  149. expect(vm.$el.innerHTML).toBe('<span>bye</span><span>bye</span><span>hello</span><span>hello</span>')
  150. vm.list.splice(1, 2)
  151. }).then(() => {
  152. expect(vm.$el.innerHTML).toBe('<span>bye</span><span>hello</span>')
  153. done()
  154. }).catch(done)
  155. })
  156. })