model-checkbox.spec.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import Vue from 'vue'
  2. describe('Directive v-model checkbox', () => {
  3. it('should work', done => {
  4. const vm = new Vue({
  5. data: {
  6. test: true
  7. },
  8. template: '<input type="checkbox" v-model="test">'
  9. }).$mount()
  10. document.body.appendChild(vm.$el)
  11. expect(vm.$el.checked).toBe(true)
  12. vm.test = false
  13. waitForUpdate(function () {
  14. expect(vm.$el.checked).toBe(false)
  15. expect(vm.test).toBe(false)
  16. vm.$el.click()
  17. expect(vm.$el.checked).toBe(true)
  18. expect(vm.test).toBe(true)
  19. }).then(() => {
  20. document.body.removeChild(vm.$el)
  21. }).then(done)
  22. })
  23. it('should respect value bindings', done => {
  24. const vm = new Vue({
  25. data: {
  26. test: 1,
  27. a: 1,
  28. b: 2
  29. },
  30. template: '<input type="checkbox" v-model="test" :true-value="a" :false-value="b">'
  31. }).$mount()
  32. document.body.appendChild(vm.$el)
  33. expect(vm.$el.checked).toBe(true)
  34. vm.$el.click()
  35. expect(vm.$el.checked).toBe(false)
  36. expect(vm.test).toBe(2)
  37. vm.$el.click()
  38. expect(vm.$el.checked).toBe(true)
  39. expect(vm.test).toBe(1)
  40. vm.test = 2
  41. waitForUpdate(() => {
  42. expect(vm.$el.checked).toBe(false)
  43. vm.test = 1
  44. }).then(() => {
  45. expect(vm.$el.checked).toBe(true)
  46. document.body.removeChild(vm.$el)
  47. }).then(done)
  48. })
  49. it('bind to Array value', done => {
  50. const vm = new Vue({
  51. data: {
  52. test: ['1']
  53. },
  54. template: `
  55. <div>
  56. <input type="checkbox" v-model="test" value="1">
  57. <input type="checkbox" v-model="test" value="2">
  58. </div>
  59. `
  60. }).$mount()
  61. document.body.appendChild(vm.$el)
  62. expect(vm.$el.children[0].checked).toBe(true)
  63. expect(vm.$el.children[1].checked).toBe(false)
  64. vm.$el.children[0].click()
  65. expect(vm.test.length).toBe(0)
  66. vm.$el.children[1].click()
  67. expect(vm.test).toEqual(['2'])
  68. vm.$el.children[0].click()
  69. expect(vm.test).toEqual(['2', '1'])
  70. vm.test = ['1']
  71. waitForUpdate(() => {
  72. expect(vm.$el.children[0].checked).toBe(true)
  73. expect(vm.$el.children[1].checked).toBe(false)
  74. }).then(done)
  75. })
  76. it('bind to Array value with value bindings', done => {
  77. const vm = new Vue({
  78. data: {
  79. test: [1]
  80. },
  81. template: `
  82. <div>
  83. <input type="checkbox" v-model="test" :value="1">
  84. <input type="checkbox" v-model="test" :value="2">
  85. </div>
  86. `
  87. }).$mount()
  88. document.body.appendChild(vm.$el)
  89. expect(vm.$el.children[0].checked).toBe(true)
  90. expect(vm.$el.children[1].checked).toBe(false)
  91. vm.$el.children[0].click()
  92. expect(vm.test.length).toBe(0)
  93. vm.$el.children[1].click()
  94. expect(vm.test).toEqual([2])
  95. vm.$el.children[0].click()
  96. expect(vm.test).toEqual([2, 1])
  97. vm.test = [1]
  98. waitForUpdate(() => {
  99. expect(vm.$el.children[0].checked).toBe(true)
  100. expect(vm.$el.children[1].checked).toBe(false)
  101. }).then(done)
  102. })
  103. it('bind to Array value with value bindings (object loose equal)', done => {
  104. const vm = new Vue({
  105. data: {
  106. test: [{ a: 1 }]
  107. },
  108. template: `
  109. <div>
  110. <input type="checkbox" v-model="test" :value="{ a: 1 }">
  111. <input type="checkbox" v-model="test" :value="{ a: 2 }">
  112. </div>
  113. `
  114. }).$mount()
  115. document.body.appendChild(vm.$el)
  116. expect(vm.$el.children[0].checked).toBe(true)
  117. expect(vm.$el.children[1].checked).toBe(false)
  118. vm.$el.children[0].click()
  119. expect(vm.test.length).toBe(0)
  120. vm.$el.children[1].click()
  121. expect(vm.test).toEqual([{ a: 2 }])
  122. vm.$el.children[0].click()
  123. expect(vm.test).toEqual([{ a: 2 }, { a: 1 }])
  124. vm.test = [{ a: 1 }]
  125. waitForUpdate(() => {
  126. expect(vm.$el.children[0].checked).toBe(true)
  127. expect(vm.$el.children[1].checked).toBe(false)
  128. }).then(done)
  129. })
  130. it('.number modifier', () => {
  131. const vm = new Vue({
  132. data: {
  133. test: [],
  134. check: true
  135. },
  136. template: `
  137. <div>
  138. <input type="checkbox" v-model.number="test" value="1">
  139. <input type="checkbox" v-model="test" value="2">
  140. <input type="checkbox" v-model.number="check">
  141. </div>
  142. `
  143. }).$mount()
  144. document.body.appendChild(vm.$el)
  145. const checkboxInputs = vm.$el.getElementsByTagName('input')
  146. expect(checkboxInputs[0].checked).toBe(false)
  147. expect(checkboxInputs[1].checked).toBe(false)
  148. expect(checkboxInputs[2].checked).toBe(true)
  149. checkboxInputs[0].click()
  150. checkboxInputs[1].click()
  151. checkboxInputs[2].click()
  152. expect(vm.test).toEqual([1, '2'])
  153. expect(vm.check).toEqual(false)
  154. })
  155. it('should respect different primitive type value', (done) => {
  156. const vm = new Vue({
  157. data: {
  158. test: [0]
  159. },
  160. template:
  161. '<div>' +
  162. '<input type="checkbox" value="" v-model="test">' +
  163. '<input type="checkbox" value="0" v-model="test">' +
  164. '<input type="checkbox" value="1" v-model="test">' +
  165. '<input type="checkbox" value="false" v-model="test">' +
  166. '<input type="checkbox" value="true" v-model="test">' +
  167. '</div>'
  168. }).$mount()
  169. const checkboxInput = vm.$el.children
  170. expect(checkboxInput[0].checked).toBe(false)
  171. expect(checkboxInput[1].checked).toBe(true)
  172. expect(checkboxInput[2].checked).toBe(false)
  173. expect(checkboxInput[3].checked).toBe(false)
  174. expect(checkboxInput[4].checked).toBe(false)
  175. vm.test = [1]
  176. waitForUpdate(() => {
  177. expect(checkboxInput[0].checked).toBe(false)
  178. expect(checkboxInput[1].checked).toBe(false)
  179. expect(checkboxInput[2].checked).toBe(true)
  180. expect(checkboxInput[3].checked).toBe(false)
  181. expect(checkboxInput[4].checked).toBe(false)
  182. vm.test = ['']
  183. }).then(() => {
  184. expect(checkboxInput[0].checked).toBe(true)
  185. expect(checkboxInput[1].checked).toBe(false)
  186. expect(checkboxInput[2].checked).toBe(false)
  187. expect(checkboxInput[3].checked).toBe(false)
  188. expect(checkboxInput[4].checked).toBe(false)
  189. vm.test = [false]
  190. }).then(() => {
  191. expect(checkboxInput[0].checked).toBe(false)
  192. expect(checkboxInput[1].checked).toBe(false)
  193. expect(checkboxInput[2].checked).toBe(false)
  194. expect(checkboxInput[3].checked).toBe(true)
  195. expect(checkboxInput[4].checked).toBe(false)
  196. vm.test = [true]
  197. }).then(() => {
  198. expect(checkboxInput[0].checked).toBe(false)
  199. expect(checkboxInput[1].checked).toBe(false)
  200. expect(checkboxInput[2].checked).toBe(false)
  201. expect(checkboxInput[3].checked).toBe(false)
  202. expect(checkboxInput[4].checked).toBe(true)
  203. vm.test = ['', 0, 1, false, true]
  204. }).then(() => {
  205. expect(checkboxInput[0].checked).toBe(true)
  206. expect(checkboxInput[1].checked).toBe(true)
  207. expect(checkboxInput[2].checked).toBe(true)
  208. expect(checkboxInput[3].checked).toBe(true)
  209. expect(checkboxInput[4].checked).toBe(true)
  210. }).then(done)
  211. })
  212. // #4521
  213. it('should work with click event', (done) => {
  214. const vm = new Vue({
  215. data: {
  216. num: 1,
  217. checked: false
  218. },
  219. template: '<div @click="add">click {{ num }}<input ref="checkbox" type="checkbox" v-model="checked"/></div>',
  220. methods: {
  221. add: function () {
  222. this.num++
  223. }
  224. }
  225. }).$mount()
  226. document.body.appendChild(vm.$el)
  227. const checkbox = vm.$refs.checkbox
  228. checkbox.click()
  229. waitForUpdate(() => {
  230. expect(checkbox.checked).toBe(true)
  231. expect(vm.num).toBe(2)
  232. }).then(done)
  233. })
  234. it('should get updated with model when in focus', (done) => {
  235. const vm = new Vue({
  236. data: {
  237. a: 2
  238. },
  239. template: '<input type="checkbox" v-model="a"/>'
  240. }).$mount()
  241. document.body.appendChild(vm.$el)
  242. vm.$el.click()
  243. waitForUpdate(() => {
  244. expect(vm.$el.checked).toBe(false)
  245. vm.a = 2
  246. }).then(() => {
  247. expect(vm.$el.checked).toBe(true)
  248. }).then(done)
  249. })
  250. })