123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- import {
- createTest,
- createVue,
- destroyVM,
- waitImmediate,
- wait,
- triggerEvent
- } from '../util';
- import CascaderPanel from 'packages/cascader-panel';
- const selectedValue = ['zhejiang', 'hangzhou', 'xihu'];
- 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 options2 = [{
- id: 'zhejiang',
- name: 'Zhejiang',
- areas: [{
- id: 'hangzhou',
- name: 'Hangzhou',
- areas: [{
- id: 'xihu',
- name: 'West Lake'
- }, {
- id: 'binjiang',
- name: 'Bin Jiang'
- }]
- }, {
- id: 'ningbo',
- name: 'NingBo',
- areas: [{
- id: 'jiangbei',
- label: 'Jiang Bei'
- }, {
- id: 'jiangdong',
- name: 'Jiang Dong',
- invalid: true
- }]
- }]
- }, {
- id: 'jiangsu',
- name: 'Jiangsu',
- invalid: true,
- areas: [{
- id: 'nanjing',
- name: 'Nanjing',
- areas: [{
- id: 'zhonghuamen',
- name: 'Zhong Hua Men'
- }]
- }]
- }];
- const getMenus = el => el.querySelectorAll('.el-cascader-menu');
- const getOptions = (el, menuIndex) => getMenus(el)[menuIndex].querySelectorAll('.el-cascader-node');
- const getValidOptions = (el, menuIndex) => getMenus(el)[menuIndex].querySelectorAll('.el-cascader-node[tabindex="-1"]');
- const getLabel = el => el.querySelector('.el-cascader-node__label').textContent;
- describe('CascaderPanel', () => {
- let vm;
- afterEach(() => {
- destroyVM(vm);
- });
- it('create', () => {
- vm = createTest(CascaderPanel, true);
- expect(vm.$el).to.exist;
- });
- it('expand and check', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- ref="panel"
- v-model="value"
- :options="options"></el-cascader-panel>
- `,
- data() {
- return {
- value: [],
- options
- };
- }
- }, true);
- const el = vm.$el;
- const expandHandler = sinon.spy();
- const changeHandler = sinon.spy();
- vm.$refs.panel.$on('expand-change', expandHandler);
- vm.$refs.panel.$on('change', changeHandler);
- expect(getMenus(el).length).to.equal(1);
- expect(getOptions(el, 0).length).to.equal(2);
- const firstOption = getOptions(el, 0)[0];
- expect(getLabel(firstOption)).to.equal('Zhejiang');
- firstOption.click();
- await waitImmediate();
- expect(expandHandler.calledOnceWith(['zhejiang'])).to.be.true;
- expect(getMenus(el).length).to.equal(2);
- getOptions(el, 1)[0].click();
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- getOptions(el, 2)[0].click();
- await waitImmediate();
- expect(changeHandler.calledOnceWith(selectedValue)).to.be.true;
- expect(vm.value).to.deep.equal(selectedValue);
- });
- it('with default value', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- ref="panel"
- v-model="value"
- :options="options"></el-cascader-panel>
- `,
- data() {
- return {
- value: selectedValue,
- options
- };
- }
- }, true);
- const el = vm.$el;
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- expect(getOptions(el, 0)[0].className).to.includes('in-active-path');
- expect(getOptions(el, 2)[0].className).to.includes('is-active');
- expect(getOptions(el, 2)[0].querySelector('.el-icon-check')).to.exist;
- });
- it('disabled options', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- ref="panel"
- :value="value"
- :options="options"></el-cascader-panel>
- `,
- data() {
- return {
- value: [],
- options
- };
- }
- }, true);
- const el = vm.$el;
- const expandHandler = sinon.spy();
- vm.$refs.panel.$on('expand-change', expandHandler);
- expect(getOptions(el, 0).length).to.equal(2);
- expect(getValidOptions(el, 0).length).to.equal(1);
- const secondOption = getOptions(el, 0)[1];
- expect(secondOption.className).to.includes('is-disabled');
- secondOption.click();
- await waitImmediate();
- expect(expandHandler.called).to.be.false;
- expect(getMenus(el).length).to.equal(1);
- });
- it('expand by hover', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- options,
- props: {
- expandTrigger: 'hover'
- }
- };
- }
- }, true);
- const el = vm.$el;
- triggerEvent(getOptions(el, 0)[1], 'mouseenter');
- await waitImmediate();
- expect(getMenus(el).length).to.equal(1);
- triggerEvent(getOptions(el, 0)[0], 'mouseenter');
- await waitImmediate();
- expect(getMenus(el).length).to.equal(2);
- triggerEvent(getOptions(el, 1)[0], 'mouseenter');
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- });
- it('emit value only', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- ref="panel"
- v-model="value"
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- value: 'xihu',
- options,
- props: {
- emitPath: false
- }
- };
- }
- }, true);
- const el = vm.$el;
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- expect(getOptions(el, 2)[0].querySelector('.el-icon-check')).to.exist;
- getOptions(el, 1)[1].click();
- await waitImmediate();
- getOptions(el, 2)[0].click();
- await waitImmediate();
- expect(vm.value).to.equal('jiangbei');
- });
- it('multiple mode', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- v-model="value"
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- value: [],
- options: options,
- props: {
- multiple: true
- }
- };
- }
- }, true);
- const el = vm.$el;
- const checkbox = getOptions(el, 0)[0].querySelector('.el-checkbox');
- expect(checkbox).to.exist;
- expect(checkbox.querySelector('.el-checkbox__input').className).to.not.includes('is-checked');
- checkbox.querySelector('input').click();
- await waitImmediate();
- expect(checkbox.querySelector('.el-checkbox__input').className).to.includes('is-checked');
- expect(vm.value.length).to.equal(3);
- });
- it('multiple mode with disabled default value', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- v-model="value"
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- value: [['zhejiang', 'ningbo', 'jiangdong']],
- options: options,
- props: {
- multiple: true
- }
- };
- }
- }, true);
- const el = vm.$el;
- const checkbox = getOptions(el, 0)[0].querySelector('.el-checkbox');
- await waitImmediate();
- expect(checkbox).to.exist;
- expect(checkbox.querySelector('.el-checkbox__input').className).to.includes('is-indeterminate');
- checkbox.querySelector('input').click();
- await waitImmediate();
- expect(checkbox.querySelector('.el-checkbox__input').className).to.includes('is-checked');
- expect(vm.value.length).to.equal(4);
- getOptions(el, 1)[1].click();
- await waitImmediate();
- getOptions(el, 2)[1].querySelector('input').click();
- await waitImmediate();
- expect(vm.value.length).to.equal(4);
- });
- it('check strictly in single mode', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- v-model="value"
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- value: ['zhejiang'],
- options: options,
- props: {
- checkStrictly: true
- }
- };
- }
- }, true);
- const el = vm.$el;
- const radio = getOptions(el, 0)[0].querySelector('.el-radio');
- await waitImmediate();
- expect(radio).to.exist;
- expect(radio.className).to.includes('is-checked');
- getOptions(el, 0)[0].click();
- await waitImmediate();
- getOptions(el, 1)[0].querySelector('input').click();
- await waitImmediate();
- expect(vm.value).to.deep.equal(['zhejiang', 'hangzhou']);
- expect(getOptions(el, 0)[1].querySelector('.el-radio').className).to.includes('is-disabled');
- });
- it('check strictly in multiple mode', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- v-model="value"
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- value: [['zhejiang']],
- options: options,
- props: {
- multiple: true,
- checkStrictly: true,
- emitPath: false
- }
- };
- }
- }, true);
- const el = vm.$el;
- const checkbox = getOptions(el, 0)[0].querySelector('.el-checkbox');
- await waitImmediate();
- expect(checkbox).to.exist;
- expect(checkbox.className).to.includes('is-checked');
- getOptions(el, 0)[0].click();
- await waitImmediate();
- expect(getOptions(el, 1)[0].querySelector('.el-checkbox').className).to.not.includes('is-checked');
- getOptions(el, 1)[0].querySelector('input').click();
- await waitImmediate();
- expect(vm.value).to.deep.equal(['zhejiang', 'hangzhou']);
- expect(getOptions(el, 0)[1].querySelector('.el-checkbox').className).to.includes('is-disabled');
- });
- it('custom props', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- v-model="value"
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- value: [],
- options: options2,
- props: {
- value: 'id',
- label: 'name',
- children: 'areas',
- disabled: 'invalid'
- }
- };
- }
- }, true);
- const el = vm.$el;
- expect(getMenus(el).length).to.equal(1);
- expect(getOptions(el, 0).length).to.equal(2);
- expect(getValidOptions(el, 0).length).to.equal(1);
- const firstOption = getOptions(el, 0)[0];
- expect(getLabel(firstOption)).to.equal('Zhejiang');
- firstOption.click();
- await waitImmediate();
- expect(getMenus(el).length).to.equal(2);
- getOptions(el, 1)[0].click();
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- getOptions(el, 2)[0].click();
- await waitImmediate();
- expect(vm.value).to.deep.equal(selectedValue);
- });
- it('value key is same as label key', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- v-model="value"
- :options="options"
- :props="props"></el-cascader-panel>
- `,
- data() {
- return {
- value: [],
- options,
- props: {
- label: 'value'
- }
- };
- }
- }, true);
- const el = vm.$el;
- expect(getMenus(el).length).to.equal(1);
- expect(getOptions(el, 0).length).to.equal(2);
- expect(getValidOptions(el, 0).length).to.equal(1);
- const firstOption = getOptions(el, 0)[0];
- expect(getLabel(firstOption)).to.equal('zhejiang');
- firstOption.click();
- await waitImmediate();
- expect(getMenus(el).length).to.equal(2);
- getOptions(el, 1)[0].click();
- await waitImmediate();
- expect(getMenus(el).length).to.equal(3);
- getOptions(el, 2)[0].click();
- await waitImmediate();
- expect(vm.value).to.deep.equal(selectedValue);
- });
- it('dynamic loading', async() => {
- vm = createVue({
- template: `
- <el-cascader-panel
- v-model="value"
- :props="props"></el-cascader-panel>
- `,
- data() {
- let id = 0;
- return {
- value: [],
- props: {
- lazy: true,
- lazyLoad(node, resolve) {
- const { level } = node;
- setTimeout(() => {
- const nodes = Array.from({ length: level + 1 })
- .map(() => ({
- value: ++id,
- label: `选项${id}`,
- leaf: level >= 2
- }));
- resolve(nodes);
- }, 1000);
- }
- }
- };
- }
- }, true);
- const el = vm.$el;
- await wait(1000);
- const firstOption = getOptions(el, 0)[0];
- firstOption.click();
- await waitImmediate();
- expect(firstOption.querySelector('i').className).to.includes('el-icon-loading');
- await wait(1000);
- expect(firstOption.querySelector('i').className).to.includes('el-icon-arrow-right');
- expect(getMenus(el).length).to.equal(2);
- getOptions(el, 1)[0].click();
- await wait(1000);
- getOptions(el, 2)[0].click();
- await waitImmediate();
- expect(vm.value.length).to.equal(3);
- });
- });
|