model-radio.spec.js 7.8 KB

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