form.spec.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. import { createVue, destroyVM } from '../util';
  2. const DELAY = 50;
  3. describe('Form', () => {
  4. let vm;
  5. afterEach(() => {
  6. destroyVM(vm);
  7. });
  8. it('label width', done => {
  9. vm = createVue({
  10. template: `
  11. <el-form ref="form" :model="form" label-width="80px">
  12. <el-form-item label="活动名称">
  13. <el-input v-model="form.name"></el-input>
  14. </el-form-item>
  15. </el-form>
  16. `,
  17. data() {
  18. return {
  19. form: {
  20. name: ''
  21. }
  22. };
  23. }
  24. }, true);
  25. expect(vm.$el.querySelector('.el-form-item__label').style.width).to.equal('80px');
  26. expect(vm.$el.querySelector('.el-form-item__content').style.marginLeft).to.equal('80px');
  27. done();
  28. });
  29. it('inline form', done => {
  30. vm = createVue({
  31. template: `
  32. <el-form ref="form" :model="form" inline>
  33. <el-form-item>
  34. <el-input v-model="form.name"></el-input>
  35. </el-form-item>
  36. <el-form-item>
  37. <el-input v-model="form.address"></el-input>
  38. </el-form-item>
  39. </el-form>
  40. `,
  41. data() {
  42. return {
  43. form: {
  44. name: '',
  45. address: ''
  46. }
  47. };
  48. }
  49. }, true);
  50. expect(vm.$el.classList.contains('el-form--inline')).to.be.true;
  51. done();
  52. });
  53. it('label position', done => {
  54. vm = createVue({
  55. template: `
  56. <div>
  57. <el-form :model="form" label-position="top" ref="labelTop">
  58. <el-form-item>
  59. <el-input v-model="form.name"></el-input>
  60. </el-form-item>
  61. <el-form-item>
  62. <el-input v-model="form.address"></el-input>
  63. </el-form-item>
  64. </el-form>
  65. <el-form :model="form" label-position="left" ref="labelLeft">
  66. <el-form-item>
  67. <el-input v-model="form.name"></el-input>
  68. </el-form-item>
  69. <el-form-item>
  70. <el-input v-model="form.address"></el-input>
  71. </el-form-item>
  72. </el-form>
  73. </div>
  74. `,
  75. data() {
  76. return {
  77. form: {
  78. name: '',
  79. address: ''
  80. }
  81. };
  82. }
  83. }, true);
  84. expect(vm.$refs.labelTop.$el.classList.contains('el-form--label-top')).to.be.true;
  85. expect(vm.$refs.labelLeft.$el.classList.contains('el-form--label-left')).to.be.true;
  86. done();
  87. });
  88. it('show message', done => {
  89. vm = createVue({
  90. template: `
  91. <el-form :model="form" ref="form">
  92. <el-form-item label="活动名称" prop="name" :show-message="false"
  93. :rules="{
  94. required: true,
  95. message: '请输入活动名称',
  96. trigger: 'change',
  97. min: 3,
  98. max: 6
  99. }"
  100. >
  101. <el-input v-model="form.name"></el-input>
  102. </el-form-item>
  103. </el-form>
  104. `,
  105. data() {
  106. return {
  107. form: {
  108. name: ''
  109. }
  110. };
  111. }
  112. }, true);
  113. vm.$refs.form.validate(valid => {
  114. expect(valid).to.not.true;
  115. vm.$refs.form.$nextTick(_ => {
  116. expect(vm.$el.querySelector('.el-form-item__error')).to.not.exist;
  117. done();
  118. });
  119. });
  120. });
  121. it('reset field', done => {
  122. vm = createVue({
  123. template: `
  124. <el-form ref="form" :model="form" :rules="rules">
  125. <el-form-item label="活动名称" prop="name">
  126. <el-input v-model="form.name" ref="fieldName"></el-input>
  127. </el-form-item>
  128. <el-form-item label="活动地址" prop="address">
  129. <el-input v-model="form.address" ref="fieldAddr"></el-input>
  130. </el-form-item>
  131. <el-form-item label="活动性质" prop="type">
  132. <el-checkbox-group v-model="form.type">
  133. <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
  134. <el-checkbox label="地推活动" name="type"></el-checkbox>
  135. <el-checkbox label="线下主题活动" name="type"></el-checkbox>
  136. <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
  137. </el-checkbox-group>
  138. </el-form-item>
  139. </el-form>
  140. `,
  141. data() {
  142. return {
  143. form: {
  144. name: '',
  145. address: '',
  146. type: []
  147. },
  148. rules: {
  149. name: [
  150. { required: true, message: '请输入活动名称', trigger: 'blur' }
  151. ],
  152. address: [
  153. { required: true, message: '请选择活动区域', trigger: 'change' }
  154. ],
  155. type: [
  156. { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
  157. ]
  158. }
  159. };
  160. },
  161. methods: {
  162. setValue() {
  163. this.form.name = 'jack';
  164. this.form.address = 'aaaa';
  165. this.form.type.push('地推活动');
  166. }
  167. }
  168. }, true);
  169. vm.setValue();
  170. vm.$refs.form.resetFields();
  171. vm.$refs.form.$nextTick(_ => {
  172. expect(vm.form.name).to.equal('');
  173. expect(vm.form.address).to.equal('');
  174. expect(vm.form.type.length).to.equal(0);
  175. done();
  176. });
  177. });
  178. it('form item nest', done => {
  179. vm = createVue({
  180. template: `
  181. <el-form ref="form" :model="form" :rules="rules">
  182. <el-form-item label="活动时间" required>
  183. <el-col :span="11">
  184. <el-form-item prop="date1">
  185. <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
  186. </el-form-item>
  187. </el-col>
  188. <el-col class="line" :span="2">-</el-col>
  189. <el-col :span="11">
  190. <el-form-item prop="date2">
  191. <el-time-picker type="fixed-time" placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
  192. </el-form-item>
  193. </el-col>
  194. </el-form-item>
  195. </el-form>
  196. `,
  197. data() {
  198. return {
  199. form: {
  200. date1: '',
  201. date2: ''
  202. },
  203. rules: {
  204. date1: [
  205. { type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  206. ]
  207. }
  208. };
  209. },
  210. methods: {
  211. setValue() {
  212. this.name = 'jack';
  213. this.address = 'aaaa';
  214. }
  215. }
  216. }, true);
  217. vm.$refs.form.validate(valid => {
  218. expect(valid).to.not.true;
  219. done();
  220. });
  221. });
  222. describe('validate', () => {
  223. it('input', done => {
  224. vm = createVue({
  225. template: `
  226. <el-form :model="form" :rules="rules" ref="form">
  227. <el-form-item label="活动名称" prop="name" ref="field">
  228. <el-input v-model="form.name"></el-input>
  229. </el-form-item>
  230. </el-form>
  231. `,
  232. data() {
  233. return {
  234. form: {
  235. name: ''
  236. },
  237. rules: {
  238. name: [
  239. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  240. ]
  241. }
  242. };
  243. },
  244. methods: {
  245. setValue(value) {
  246. this.form.name = value;
  247. }
  248. }
  249. }, true);
  250. vm.$refs.form.validate(valid => {
  251. let field = vm.$refs.field;
  252. expect(valid).to.not.true;
  253. vm.$refs.form.$nextTick(_ => {
  254. expect(field.validateMessage).to.equal('请输入活动名称');
  255. vm.setValue('aaaaa');
  256. vm.$refs.form.$nextTick(_ => {
  257. expect(field.validateMessage).to.equal('');
  258. vm.setValue('aa');
  259. vm.$refs.form.$nextTick(_ => {
  260. expect(field.validateMessage).to.equal('请输入活动名称');
  261. done();
  262. });
  263. });
  264. });
  265. });
  266. });
  267. it('textarea', done => {
  268. vm = createVue({
  269. template: `
  270. <el-form :model="form" :rules="rules" ref="form">
  271. <el-form-item label="活动名称" prop="name" ref="field">
  272. <el-input type="textarea" v-model="form.name"></el-input>
  273. </el-form-item>
  274. </el-form>
  275. `,
  276. data() {
  277. return {
  278. form: {
  279. name: ''
  280. },
  281. rules: {
  282. name: [
  283. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  284. ]
  285. }
  286. };
  287. },
  288. methods: {
  289. setValue(value) {
  290. this.form.name = value;
  291. }
  292. }
  293. }, true);
  294. vm.$refs.form.validate(valid => {
  295. let field = vm.$refs.field;
  296. expect(valid).to.not.true;
  297. vm.$refs.form.$nextTick(_ => {
  298. expect(field.validateMessage).to.equal('请输入活动名称');
  299. vm.setValue('aaaaa');
  300. vm.$refs.form.$nextTick(_ => {
  301. expect(field.validateMessage).to.equal('');
  302. vm.setValue('aa');
  303. vm.$refs.form.$nextTick(_ => {
  304. expect(field.validateMessage).to.equal('请输入活动名称');
  305. done();
  306. });
  307. });
  308. });
  309. });
  310. });
  311. it('selector', done => {
  312. vm = createVue({
  313. template: `
  314. <el-form :model="form" :rules="rules" ref="form">
  315. <el-form-item label="记住密码" prop="region" ref="field">
  316. <el-select v-model="form.region" placeholder="请选择活动区域">
  317. <el-option label="区域一" value="shanghai"></el-option>
  318. <el-option label="区域二" ref="opt" value="beijing"></el-option>
  319. </el-select>
  320. </el-form-item>
  321. </el-form>
  322. `,
  323. data() {
  324. return {
  325. form: {
  326. region: ''
  327. },
  328. rules: {
  329. region: [
  330. {required: true, message: '请选择活动区域', trigger: 'change' }
  331. ]
  332. }
  333. };
  334. }
  335. }, true);
  336. vm.$refs.form.validate(valid => {
  337. let field = vm.$refs.field;
  338. expect(valid).to.false;
  339. setTimeout(_ => {
  340. expect(field.validateMessage).to.equal('请选择活动区域');
  341. // programatic modification of bound value does not triggers change validation
  342. vm.form.region = 'shanghai';
  343. setTimeout(_ => {
  344. expect(field.validateMessage).to.equal('请选择活动区域');
  345. // user modification of bound value triggers change validation
  346. vm.$refs.opt.$el.click();
  347. setTimeout(_ => {
  348. expect(field.validateMessage).to.equal('');
  349. done();
  350. }, 100);
  351. }, 100);
  352. }, 100);
  353. });
  354. });
  355. it('datepicker', done => {
  356. vm = createVue({
  357. template: `
  358. <el-form :model="form" :rules="rules" ref="form">
  359. <el-form-item label="记住密码" prop="date" ref="field">
  360. <el-date-picker type="date" ref="picker" placeholder="选择日期" v-model="form.date" style="width: 100%;"></el-date-picker>
  361. </el-form-item>
  362. </el-form>
  363. `,
  364. data() {
  365. return {
  366. form: {
  367. date: ''
  368. },
  369. rules: {
  370. date: [
  371. {type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  372. ]
  373. }
  374. };
  375. }
  376. }, true);
  377. vm.$refs.form.validate(valid => {
  378. let field = vm.$refs.field;
  379. expect(valid).to.not.true;
  380. setTimeout(_ => {
  381. expect(field.validateMessage).to.equal('请选择日期');
  382. // programatic modification does not trigger change
  383. vm.value = new Date();
  384. setTimeout(_ => {
  385. expect(field.validateMessage).to.equal('请选择日期');
  386. vm.value = '';
  387. // user modification triggers change
  388. const input = vm.$refs.picker.$el.querySelector('input');
  389. input.blur();
  390. input.focus();
  391. setTimeout(_ => {
  392. const keyDown = (el, keyCode) => {
  393. const evt = document.createEvent('Events');
  394. evt.initEvent('keydown', true, true);
  395. evt.keyCode = keyCode;
  396. el.dispatchEvent(evt);
  397. };
  398. keyDown(input, 37);
  399. keyDown(input, 13);
  400. setTimeout(_ => {
  401. expect(field.validateMessage).to.equal('');
  402. done();
  403. }, DELAY);
  404. }, DELAY);
  405. }, DELAY);
  406. }, DELAY);
  407. });
  408. });
  409. it('timepicker', done => {
  410. vm = createVue({
  411. template: `
  412. <el-form :model="form" :rules="rules" ref="form">
  413. <el-form-item label="记住密码" prop="date" ref="field">
  414. <el-time-picker type="fixed-time" ref="picker" placeholder="选择时间" v-model="form.date" style="width: 100%;"></el-time-picker>
  415. </el-form-item>
  416. </el-form>
  417. `,
  418. data() {
  419. return {
  420. form: {
  421. date: ''
  422. },
  423. rules: {
  424. date: [
  425. {type: 'date', required: true, message: '请选择时间', trigger: 'change' }
  426. ]
  427. }
  428. };
  429. }
  430. }, true);
  431. vm.$refs.form.validate(valid => {
  432. let field = vm.$refs.field;
  433. expect(valid).to.not.true;
  434. setTimeout(_ => {
  435. expect(field.validateMessage).to.equal('请选择时间');
  436. // programatic modification does not trigger change
  437. vm.value = new Date();
  438. setTimeout(_ => {
  439. expect(field.validateMessage).to.equal('请选择时间');
  440. vm.value = '';
  441. // user modification triggers change
  442. const input = vm.$refs.picker.$el.querySelector('input');
  443. input.blur();
  444. input.focus();
  445. setTimeout(_ => {
  446. vm.$refs.picker.picker.$el.querySelector('.confirm').click();
  447. setTimeout(_ => {
  448. expect(field.validateMessage).to.equal('');
  449. done();
  450. }, DELAY);
  451. }, DELAY);
  452. }, DELAY);
  453. }, DELAY);
  454. });
  455. });
  456. it('checkbox group', done => {
  457. vm = createVue({
  458. template: `
  459. <el-form :model="form" :rules="rules" ref="form">
  460. <el-form-item label="活动名称" prop="type" ref="field">
  461. <el-checkbox-group v-model="form.type">
  462. <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
  463. <el-checkbox label="地推活动" name="type"></el-checkbox>
  464. <el-checkbox label="线下主题活动" name="type"></el-checkbox>
  465. <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
  466. </el-checkbox-group>
  467. </el-form-item>
  468. </el-form>
  469. `,
  470. data() {
  471. return {
  472. form: {
  473. type: []
  474. },
  475. rules: {
  476. type: [
  477. { type: 'array', required: true, message: '请选择活动类型', trigger: 'change' }
  478. ]
  479. }
  480. };
  481. },
  482. methods: {
  483. setValue(value) {
  484. this.form.type = value;
  485. }
  486. }
  487. }, true);
  488. vm.$refs.form.validate(valid => {
  489. let field = vm.$refs.field;
  490. expect(valid).to.not.true;
  491. vm.$refs.form.$nextTick(_ => {
  492. expect(field.validateMessage).to.equal('请选择活动类型');
  493. vm.setValue(['地推活动']);
  494. vm.$refs.form.$nextTick(_ => {
  495. expect(field.validateMessage).to.equal('');
  496. done();
  497. });
  498. });
  499. });
  500. });
  501. it('radio group', done => {
  502. vm = createVue({
  503. template: `
  504. <el-form :model="form" :rules="rules" ref="form">
  505. <el-form-item label="活动名称" prop="type" ref="field">
  506. <el-radio-group v-model="form.type">
  507. <el-radio label="线上品牌商赞助"></el-radio>
  508. <el-radio label="线下场地免费"></el-radio>
  509. </el-radio-group>
  510. </el-form-item>
  511. </el-form>
  512. `,
  513. data() {
  514. return {
  515. form: {
  516. type: ''
  517. },
  518. rules: {
  519. type: [
  520. { required: true, message: '请选择活动类型', trigger: 'change' }
  521. ]
  522. }
  523. };
  524. },
  525. methods: {
  526. setValue(value) {
  527. this.form.type = value;
  528. }
  529. }
  530. }, true);
  531. vm.$refs.form.validate(valid => {
  532. let field = vm.$refs.field;
  533. expect(valid).to.not.true;
  534. vm.$refs.form.$nextTick(_ => {
  535. expect(field.validateMessage).to.equal('请选择活动类型');
  536. vm.setValue('线下场地免费');
  537. vm.$refs.form.$nextTick(_ => {
  538. expect(field.validateMessage).to.equal('');
  539. done();
  540. });
  541. });
  542. });
  543. });
  544. it('validate field', done => {
  545. vm = createVue({
  546. template: `
  547. <el-form :model="form" :rules="rules" ref="form">
  548. <el-form-item label="活动名称" prop="name" ref="field">
  549. <el-input v-model="form.name"></el-input>
  550. </el-form-item>
  551. </el-form>
  552. `,
  553. data() {
  554. return {
  555. form: {
  556. name: ''
  557. },
  558. rules: {
  559. name: [
  560. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  561. ]
  562. }
  563. };
  564. },
  565. methods: {
  566. setValue(value) {
  567. this.form.name = value;
  568. }
  569. }
  570. }, true);
  571. vm.$refs.form.validateField('name', valid => {
  572. expect(valid).to.not.true;
  573. done();
  574. });
  575. });
  576. it('custom validate', done => {
  577. var checkName = (rule, value, callback) => {
  578. if (value.length < 5) {
  579. callback(new Error('长度至少为5'));
  580. } else {
  581. callback();
  582. }
  583. };
  584. vm = createVue({
  585. template: `
  586. <el-form :model="form" :rules="rules" ref="form">
  587. <el-form-item label="活动名称" prop="name" ref="field">
  588. <el-input v-model="form.name"></el-input>
  589. </el-form-item>
  590. </el-form>
  591. `,
  592. data() {
  593. return {
  594. form: {
  595. name: ''
  596. },
  597. rules: {
  598. name: [
  599. { validator: checkName, trigger: 'change' }
  600. ]
  601. }
  602. };
  603. },
  604. methods: {
  605. setValue(value) {
  606. this.form.name = value;
  607. }
  608. }
  609. }, true);
  610. vm.$refs.form.validate(valid => {
  611. let field = vm.$refs.field;
  612. expect(valid).to.not.true;
  613. vm.$refs.form.$nextTick(_ => {
  614. expect(field.validateMessage).to.equal('长度至少为5');
  615. vm.setValue('aaaaaa');
  616. vm.$refs.form.$nextTick(_ => {
  617. expect(field.validateMessage).to.equal('');
  618. done();
  619. });
  620. });
  621. });
  622. });
  623. it('error', done => {
  624. vm = createVue({
  625. template: `
  626. <el-form :model="form" :rules="rules" ref="form">
  627. <el-form-item label="活动名称" prop="name" :error="error" ref="field">
  628. <el-input v-model="form.name"></el-input>
  629. </el-form-item>
  630. </el-form>
  631. `,
  632. data() {
  633. return {
  634. error: 'dsad',
  635. form: {
  636. name: 'sada'
  637. },
  638. rules: {
  639. name: [
  640. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  641. ]
  642. }
  643. };
  644. },
  645. methods: {
  646. setValue(value) {
  647. this.form.name = value;
  648. }
  649. }
  650. }, true);
  651. vm.$refs.form.validate(valid => {
  652. let field = vm.$refs.field;
  653. expect(valid).to.true;
  654. vm.error = '输入不合法';
  655. vm.$refs.field.$nextTick(_ => {
  656. expect(field.validateState).to.equal('error');
  657. expect(field.validateMessage).to.equal('输入不合法');
  658. done();
  659. });
  660. });
  661. });
  662. });
  663. });