rate.spec.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import { createTest, createVue, destroyVM } from '../util';
  2. import Rate from 'packages/rate';
  3. import Vue from 'vue';
  4. describe('Rate', () => {
  5. let vm;
  6. afterEach(() => {
  7. destroyVM(vm);
  8. });
  9. it('create', () => {
  10. vm = createTest(Rate, { max: 10 }, true);
  11. const stars = vm.$el.querySelectorAll('.el-rate__item');
  12. expect(stars.length).to.equal(10);
  13. });
  14. it('with texts', () => {
  15. vm = createVue({
  16. template: `
  17. <div>
  18. <el-rate
  19. v-model="value"
  20. show-text
  21. :texts="['1', '2', '3', '4', '5']"></el-rate>
  22. </div>
  23. `,
  24. data() {
  25. return {
  26. value: 4
  27. };
  28. }
  29. }, true);
  30. const text = vm.$el.querySelector('.el-rate__text');
  31. expect(text.textContent).to.equal('4');
  32. });
  33. it('value change', done => {
  34. vm = createVue({
  35. template: `
  36. <div>
  37. <el-rate v-model="value"></el-rate>
  38. </div>
  39. `,
  40. data() {
  41. return {
  42. value: 0
  43. };
  44. }
  45. }, true);
  46. const rate = vm.$children[0];
  47. expect(rate.value).to.equal(0);
  48. vm.value = 3;
  49. Vue.nextTick(() => {
  50. expect(rate.value).to.equal(3);
  51. done();
  52. });
  53. });
  54. it('click', () => {
  55. vm = createVue({
  56. template: `
  57. <div>
  58. <el-rate v-model="value"></el-rate>
  59. </div>
  60. `,
  61. data() {
  62. return {
  63. value: 0
  64. };
  65. }
  66. }, true);
  67. const thirdStar = vm.$el.querySelectorAll('.el-rate__item')[2];
  68. thirdStar.click();
  69. expect(vm.value).to.equal(3);
  70. });
  71. it('colors', () => {
  72. vm = createVue({
  73. template: `
  74. <div>
  75. <el-rate v-model="value" :colors="['#99A9BF', '#F7BA2A', '#FF9900']"></el-rate>
  76. </div>
  77. `,
  78. data() {
  79. return {
  80. value: 4
  81. };
  82. }
  83. }, true);
  84. const thirdIcon = vm.$el.querySelectorAll('.el-rate__item')[2].querySelector('.el-rate__icon');
  85. expect(thirdIcon.style.color).to.equal('rgb(255, 153, 0)');
  86. });
  87. it('colors are updated after prop is changed', done => {
  88. vm = createVue({
  89. template: `
  90. <div>
  91. <el-rate v-model="value" :colors="colors"></el-rate>
  92. </div>
  93. `,
  94. computed: {
  95. colors() {
  96. if (this.muted) {
  97. return ['#999', '#999', '#999'];
  98. } else {
  99. return ['#99A9BF', '#F7BA2A', '#FF9900'];
  100. }
  101. }
  102. },
  103. data() {
  104. return {
  105. value: 4,
  106. muted: false
  107. };
  108. }
  109. }, true);
  110. setTimeout(() => {
  111. vm.muted = true;
  112. vm.$nextTick(() => {
  113. const thirdIcon = vm.$el.querySelectorAll('.el-rate__item')[2].querySelector('.el-rate__icon');
  114. expect(thirdIcon.style.color).to.equal('rgb(153, 153, 153)');
  115. done();
  116. });
  117. }, 10);
  118. });
  119. it('threshold', () => {
  120. vm = createVue({
  121. template: `
  122. <div>
  123. <el-rate v-model="value" :low-threshold="3"></el-rate>
  124. </div>
  125. `,
  126. data() {
  127. return {
  128. value: 3
  129. };
  130. }
  131. }, true);
  132. const thirdIcon = vm.$el.querySelectorAll('.el-rate__item')[2].querySelector('.el-rate__icon');
  133. expect(thirdIcon.style.color).to.equal('rgb(247, 186, 42)');
  134. });
  135. it('disabled', () => {
  136. const vm1 = createVue({
  137. template: `
  138. <div>
  139. <el-rate v-model="value" disabled show-text></el-rate>
  140. </div>
  141. `,
  142. data() {
  143. return {
  144. value: 3.7
  145. };
  146. }
  147. }, true);
  148. const vm2 = createVue({
  149. template: `
  150. <div>
  151. <el-rate v-model="value" disabled show-text></el-rate>
  152. </div>
  153. `,
  154. data() {
  155. return {
  156. value: 3.4
  157. };
  158. }
  159. }, true);
  160. const firstStar = vm1.$el.querySelectorAll('.el-rate__item')[0];
  161. firstStar.click();
  162. vm1.$children[0].resetCurrentValue();
  163. expect(vm1.value).to.equal(3.7);
  164. const fourthStar = vm2.$el.querySelectorAll('.el-rate__item')[3];
  165. const halfStar = fourthStar.querySelector('.el-rate__decimal');
  166. expect(halfStar.style.width).to.equal('40%');
  167. });
  168. it('allow half', () => {
  169. vm = createVue({
  170. template: `
  171. <div>
  172. <el-rate v-model="value" allow-half></el-rate>
  173. </div>
  174. `,
  175. data() {
  176. return {
  177. value: 0
  178. };
  179. }
  180. }, true);
  181. const rate = vm.$children[0];
  182. const secondStar = vm.$el.querySelectorAll('.el-rate__item')[1];
  183. rate.setCurrentValue(1, { target: secondStar, offsetX: 2 });
  184. secondStar.click();
  185. rate.resetCurrentValue();
  186. expect(vm.value).to.equal(0.5);
  187. });
  188. it('custom icon classes by passing object', () => {
  189. vm = createVue({
  190. template: `
  191. <div>
  192. <el-rate
  193. v-model="value"
  194. :icon-classes="{ 2: 'icon-rate-face-1', 4: { value: 'icon-rate-face-2', excluded: true }, 5: 'icon-rate-face-3' }"></el-rate>
  195. </div>
  196. `,
  197. data() {
  198. return {
  199. value: 4
  200. };
  201. }
  202. }, true);
  203. const thirdIcon = vm.$el.querySelectorAll('.el-rate__item')[3].querySelector('.el-rate__icon');
  204. expect(thirdIcon.className).to.include('icon-rate-face-3');
  205. });
  206. });