123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- import {
- createTest,
- createVue,
- destroyVM,
- waitImmediate,
- wait,
- triggerEvent
- } from '../util';
- import Cascader from 'packages/cascader';
- const options = [{
- value: 'zhejiang',
- label: 'Zhejiang',
- children: [{
- value: 'hangzhou',
- label: 'Hangzhou',
- children: [{
- value: 'xihu',
- label: 'West Lake'
- }, {
- value: 'binjiang',
- label: 'Bin Jiang'
- }]
- }, {
- value: 'ningbo',
- label: 'NingBo',
- children: [{
- value: 'jiangbei',
- label: 'Jiang Bei'
- }, {
- value: 'jiangdong',
- label: 'Jiang Dong',
- disabled: true
- }]
- }]
- }, {
- value: 'jiangsu',
- label: 'Jiangsu',
- disabled: true,
- children: [{
- value: 'nanjing',
- label: 'Nanjing',
- children: [{
- value: 'zhonghuamen',
- label: 'Zhong Hua Men'
- }]
- }]
- }];
- const getMenus = el => el.querySelectorAll('.el-cascader-menu');
- const getOptions = (el, menuIndex) => getMenus(el)[menuIndex].querySelectorAll('.el-cascader-node');
- const selectedValue = ['zhejiang', 'hangzhou', 'xihu'];
- describe('Cascader', () => {
- let vm;
- afterEach(() => {
- destroyVM(vm);
- });
- it('create', () => {
- vm = createTest(Cascader, true);
- expect(vm.$el).to.exist;
- });
- it('toggle dropdown visible', async() => {
- vm = createTest(Cascader, true);
- expect(vm.$refs.popper.style.display).to.equal('none');
- vm.$el.click();
- await waitImmediate();
- expect(vm.$refs.popper.style.display).to.includes('');
- vm.$el.click();
- await wait(500);
- expect(vm.$refs.popper.style.display).to.includes('none');
- });
- it('expand and check', async() => {
- vm = createTest({
- template: `
- <el-cascader
- ref="cascader"
- v-model="value"
- :options="options"></el-cascader>
- `,
- data() {
- return {
- value: [],
- options
- };
- }
- }, true);
- const { body } = document;
- const expandHandler = sinon.spy();
- const changeHandler = sinon.spy();
- vm.$refs.cascader.$on('expand-change', expandHandler);
- vm.$refs.cascader.$on('change', changeHandler);
- getOptions(body, 0)[0].click();
- await waitImmediate();
- expect(expandHandler.calledOnceWith(['zhejiang'])).to.be.true;
- getOptions(body, 1)[0].click();
- await waitImmediate();
- const checkedOption = getOptions(body, 2)[0];
- checkedOption.click();
- await waitImmediate();
- expect(changeHandler.calledOnceWith(selectedValue)).to.be.true;
- expect(vm.value).to.deep.equal(selectedValue);
- expect(checkedOption.querySelector('i.el-icon-check')).to.exist;
- expect(vm.$el.querySelector('input').value).to.equal('Zhejiang / Hangzhou / West Lake');
- });
- it('disabled', async() => {
- vm = createTest(Cascader, {
- disabled: true
- }, true);
- expect(vm.$el.className).to.includes('is-disabled');
- vm.$el.click();
- await waitImmediate();
- expect(vm.$refs.popper.style.display).to.includes('none');
- });
- it('with default value', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"></el-cascader>
- `,
- data() {
- return {
- value: selectedValue,
- options
- };
- }
- }, true);
- const el = vm.$el;
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- expect(getOptions(el, 2)[0].querySelector('i').className).to.includes('el-icon-check');
- expect(vm.$el.querySelector('input').value).to.equal('Zhejiang / Hangzhou / West Lake');
- });
- it('async set selected value', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"></el-cascader>
- `,
- data() {
- return {
- value: [],
- options
- };
- }
- }, true);
- const el = vm.$el;
- vm.value = selectedValue;
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- expect(getOptions(el, 2)[0].querySelector('i').className).to.includes('el-icon-check');
- expect(vm.$el.querySelector('input').value).to.equal('Zhejiang / Hangzhou / West Lake');
- });
- it('default value with async options', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"></el-cascader>
- `,
- data() {
- return {
- value: selectedValue,
- options: []
- };
- }
- }, true);
- const el = vm.$el;
- vm.options = options;
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- expect(getOptions(el, 2)[0].querySelector('i').className).to.includes('el-icon-check');
- expect(vm.$el.querySelector('input').value).to.equal('Zhejiang / Hangzhou / West Lake');
- });
- it('clearable', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"
- clearable></el-cascader>
- `,
- data() {
- return {
- value: selectedValue,
- options
- };
- }
- }, true);
- triggerEvent(vm.$el, 'mouseenter');
- await waitImmediate();
- const closeBtn = vm.$el.querySelector('i.el-input__icon');
- expect(closeBtn).to.exist;
- closeBtn.click();
- await waitImmediate();
- expect(vm.value).to.deep.equal([]);
- });
- it('show last level label', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"
- :show-all-levels="false"></el-cascader>
- `,
- data() {
- return {
- value: selectedValue,
- options
- };
- }
- }, true);
- const el = vm.$el;
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- expect(getOptions(el, 2)[0].querySelector('i').className).to.includes('el-icon-check');
- expect(vm.$el.querySelector('input').value).to.equal('West Lake');
- });
- it('multiple mode', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"
- :props="props"></el-cascader>
- `,
- data() {
- return {
- value: [],
- options,
- props: {
- multiple: true
- }
- };
- }
- }, true);
- getOptions(document.body, 0)[0].querySelector('.el-checkbox input').click();
- await waitImmediate();
- expect(vm.value.length).to.equal(3);
- const tags = vm.$el.querySelectorAll('.el-tag');
- const closeBtn = tags[0].querySelector('.el-tag__close');
- expect(tags.length).to.equal(3);
- expect(closeBtn).to.exist;
- closeBtn.click();
- await waitImmediate();
- expect(vm.value.length).to.equal(2);
- expect(vm.$el.querySelectorAll('.el-tag').length).to.equal(2);
- });
- it('clearable in multiple mode', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"
- :props="props"
- clearable></el-cascader>
- `,
- data() {
- return {
- value: [],
- options,
- props: {
- multiple: true,
- emitPath: false
- }
- };
- }
- }, true);
- vm.value = ['xihu', 'binjiang', 'jiangbei', 'jiangdong'];
- await waitImmediate();
- expect(getOptions(document.body, 0)[0].querySelector('.el-checkbox.is-checked')).to.exist;
- triggerEvent(vm.$el, 'mouseenter');
- await waitImmediate();
- const closeBtn = vm.$el.querySelector('i.el-input__icon');
- expect(closeBtn).to.exist;
- closeBtn.click();
- await waitImmediate();
- expect(vm.value.length).to.equal(1);
- });
- it('collapse tags', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"
- :props="props"
- collapse-tags></el-cascader>
- `,
- data() {
- return {
- value: ['xihu', 'binjiang', 'jiangbei', 'jiangdong'],
- options,
- props: {
- multiple: true,
- emitPath: false
- }
- };
- }
- }, true);
- await waitImmediate();
- const tags = vm.$el.querySelectorAll('.el-tag');
- expect(tags.length).to.equal(2);
- expect(tags[0].querySelector('.el-tag__close')).to.exist;
- expect(tags[1].querySelector('.el-tag__close')).to.be.null;
- tags[0].querySelector('.el-tag__close').click();
- expect(tags[1].textContent).to.equal('+ 3');
- await waitImmediate();
- expect(vm.value.length).to.equal(3);
- vm.$el.querySelector('.el-tag .el-tag__close').click();
- await waitImmediate();
- vm.$el.querySelector('.el-tag .el-tag__close').click();
- await waitImmediate();
- expect(vm.$el.querySelector('.el-tag')).to.exist;
- // disabled tag can not be closed
- expect(vm.$el.querySelector('.el-tag .el-tag__close')).to.be.null;
- });
- it('filterable', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"
- filterable></el-cascader>
- `,
- data() {
- return {
- value: [],
- options
- };
- }
- }, true);
- const el = vm.$el;
- const { body } = document;
- const input = el.querySelector('input');
- el.click();
- await waitImmediate();
- input.value = 'Zhejiang';
- triggerEvent(input, 'input');
- await wait(300);
- expect(body.querySelector('.el-cascader__suggestion-list')).to.exist;
- expect(body.querySelectorAll('.el-cascader__suggestion-item').length).to.equal(3);
- body.querySelectorAll('.el-cascader__suggestion-item')[0].click();
- await waitImmediate();
- expect(vm.value).to.deep.equal(selectedValue);
- });
- it('filter method', async() => {
- vm = createVue({
- template: `
- <el-cascader
- v-model="value"
- :options="options"
- :filter-method="filterMethod"
- filterable></el-cascader>
- `,
- data() {
- return {
- value: [],
- options
- };
- },
- methods: {
- filterMethod(node, keyword) {
- const { text, path } = node;
- return text.includes(keyword) || path.includes(keyword);
- }
- }
- }, true);
- const el = vm.$el;
- const { body } = document;
- const input = el.querySelector('input');
- el.click();
- await waitImmediate();
- input.value = 'Zhejiang';
- triggerEvent(input, 'input');
- await wait(300);
- expect(body.querySelectorAll('.el-cascader__suggestion-item').length).to.equal(3);
- input.value = 'xihu';
- triggerEvent(input, 'input');
- await wait(300);
- expect(body.querySelector('.el-cascader__suggestion-item').textContent).to.equal('Zhejiang / Hangzhou / West Lake');
- });
- });
|