if.spec.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 falsy', () => {
  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. }).then(() => {
  31. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  32. vm.foo = 0
  33. }).then(() => {
  34. expect(vm.$el.innerHTML).toBe('')
  35. vm.foo = []
  36. }).then(() => {
  37. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  38. vm.foo = null
  39. }).then(() => {
  40. expect(vm.$el.innerHTML).toBe('')
  41. vm.foo = '0'
  42. }).then(() => {
  43. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  44. vm.foo = undefined
  45. }).then(() => {
  46. expect(vm.$el.innerHTML).toBe('')
  47. vm.foo = 1
  48. }).then(() => {
  49. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  50. done()
  51. })
  52. .catch(done)
  53. })
  54. it('should work well with v-else', done => {
  55. const vm = new Vue({
  56. el: '#app',
  57. template: `
  58. <div>
  59. <span v-if="foo">hello</span>
  60. <span v-else>bye</span>
  61. </div>
  62. `,
  63. data: { foo: true }
  64. })
  65. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  66. vm.foo = false
  67. waitForUpdate(() => {
  68. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  69. vm.foo = {}
  70. }).then(() => {
  71. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  72. vm.foo = 0
  73. }).then(() => {
  74. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  75. vm.foo = []
  76. }).then(() => {
  77. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  78. vm.foo = null
  79. }).then(() => {
  80. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  81. vm.foo = '0'
  82. }).then(() => {
  83. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  84. vm.foo = undefined
  85. }).then(() => {
  86. expect(vm.$el.innerHTML).toBe('<span>bye</span>')
  87. vm.foo = 1
  88. }).then(() => {
  89. expect(vm.$el.innerHTML).toBe('<span>hello</span>')
  90. done()
  91. }).catch(done)
  92. })
  93. it('should work well with v-for', done => {
  94. const vm = new Vue({
  95. el: '#app',
  96. template: `
  97. <div>
  98. <span v-for="item,i in list" v-if="item.value">{{i}}</span>
  99. </div>
  100. `,
  101. data: {
  102. list: [
  103. { value: true },
  104. { value: false },
  105. { value: true }
  106. ]
  107. }
  108. })
  109. expect(vm.$el.innerHTML).toBe('<span>0</span><span>2</span>')
  110. vm.list[0].value = false
  111. waitForUpdate(() => {
  112. expect(vm.$el.innerHTML).toBe('<span>2</span>')
  113. vm.list.push({ value: true })
  114. }).then(() => {
  115. expect(vm.$el.innerHTML).toBe('<span>2</span><span>3</span>')
  116. vm.list.splice(1, 2)
  117. }).then(() => {
  118. expect(vm.$el.innerHTML).toBe('<span>1</span>')
  119. done()
  120. }).catch(done)
  121. })
  122. it('should work well with v-for and v-else', done => {
  123. const vm = new Vue({
  124. el: '#app',
  125. template: `
  126. <div>
  127. <span v-for="item,i in list" v-if="item.value">hello</span>
  128. <span v-else>bye</span>
  129. </div>
  130. `,
  131. data: {
  132. list: [
  133. { value: true },
  134. { value: false },
  135. { value: true }
  136. ]
  137. }
  138. })
  139. expect(vm.$el.innerHTML).toBe('<span>hello</span><span>bye</span><span>hello</span>')
  140. vm.list[0].value = false
  141. waitForUpdate(() => {
  142. expect(vm.$el.innerHTML).toBe('<span>bye</span><span>bye</span><span>hello</span>')
  143. vm.list.push({ value: true })
  144. }).then(() => {
  145. expect(vm.$el.innerHTML).toBe('<span>bye</span><span>bye</span><span>hello</span><span>hello</span>')
  146. vm.list.splice(1, 2)
  147. }).then(() => {
  148. expect(vm.$el.innerHTML).toBe('<span>bye</span><span>hello</span>')
  149. done()
  150. }).catch(done)
  151. })
  152. })