form.spec.js 21 KB

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