import Vue from 'vue'; import DropdownPlugin, { MDropdown } from './dropdown'; const DISABLED_CSS: string = 'm--is-disabled'; const WAITING_CSS: string = 'm--is-waiting'; const SELECTED_CSS: string = 'm--is-selected'; const INACTIF_CSS: string = 'm--is-inactif'; let dropdown: MDropdown; describe('dropdown', () => { beforeEach(() => { Vue.use(DropdownPlugin); dropdown = new MDropdown().$mount(); }); it('css class for dropdown are not present', () => { expect(dropdown.$el.classList.contains(DISABLED_CSS)).toBeFalsy(); expect(dropdown.$el.classList.contains(WAITING_CSS)).toBeFalsy(); }); it('enabled prop filterable', () => { let vm: Vue = new Vue({ data: { filterable: false }, template: ` ` }).$mount(); let input: any = vm.$el.querySelector('.m-textfield__input'); expect((input as HTMLElement).attributes.getNamedItem('readonly')).toBeTruthy(); (vm as any).filterable = true; Vue.nextTick(() => { expect((input as HTMLElement).attributes.getNamedItem('readonly')).toBeFalsy(); }); }); it('has input to focus', () => { let input: any = (((dropdown.$refs as any).mDropdownTextField as Vue).$el.querySelector('input') as HTMLElement); expect(input).not.toBeNull(); }); it('v-model change', () => { let vm: Vue = new Vue({ data: { model: 'item B' }, template: ` ` }).$mount(); let li1: Element | null = vm.$el.querySelector('.a'); let li2: Element | null = vm.$el.querySelector('.b'); if (li1 && li2) { expect(li1.classList.contains(SELECTED_CSS)).toBeFalsy(); expect(li2.classList.contains(SELECTED_CSS)).toBeTruthy(); } (vm as any).model = 'Item A'; Vue.nextTick(() => { if (li1 && li2) { expect(li1.classList.contains(SELECTED_CSS)).toBeTruthy(); expect(li1.classList.contains(SELECTED_CSS)).toBeFalsy(); } }); }); it('toggle dropdown / Emit Open and Close', () => { let clickSpyOpen: jasmine.Spy = jasmine.createSpy('clickSpyOpen'); let clickSpyClose: jasmine.Spy = jasmine.createSpy('clickSpyClose'); let vm: Vue = new Vue({ template: ` `, methods: { onOpen: clickSpyOpen, onClose: clickSpyClose } }).$mount(); let dd: any = vm.$refs.dd; (dd as MDropdown).open = true; Vue.nextTick(() => { expect(clickSpyOpen).toHaveBeenCalled(); (dd as MDropdown).open = false; Vue.nextTick(() => { expect(clickSpyClose).toHaveBeenCalled(); }); }); }); it('change event - called once', () => { Vue.prototype.$log.log('TODO'); }); // En attente d'un changement pour Portal // it('0 items', () => { // let vm = new Vue({ // template: `` // }).$mount(); // let items = (vm.$refs.dd as Vue).$el.querySelectorAll('.m-dropdown__list li'); // expect(items.length == 1).toBeTruthy(); // if (items[1]) { // expect(items[1].classList.contains(INACTIF_CSS)).toBeTruthy(); // } // }); // En attente d'un changement pour Portal // it('Filtering', () => { // let vm = new Vue({ // template: ` // // // // // // ` // }).$mount(); // let input: Element | null = vm.$el.querySelector('.m-textfield__input'); // // let eKeyboard = new KeyboardEvent('keypress', {code: '65'}); // // let e: any = document.createEvent('HTMLEvents'); // // e.initEvent('change', true, true); // // if (input) { // // input.dispatchEvent(eKeyboard); // // input.dispatchEvent(e); // // } // // eKeyboard.initKeyEvent() // if (input) { // // (vm as MDropdown).filterDropdown('A'); // (input as HTMLInputElement).value = 'A'; // let evt = document.createEvent('HTMLEvents'); // evt.initEvent('change', false, true); // input.dispatchEvent(evt); // } // let items; // Vue.nextTick(() => { // items = (vm.$refs.dd as Vue).$el.querySelectorAll('.m-dropdown__list li'); // Vue.prototype.log('*1*', items.length); // expect(items.length == 2).toBeTruthy(); // if (input) { // // (vm as MDropdown).filterDropdown('c'); // (input as HTMLInputElement).value = 'c'; // } // items = (vm.$refs.dd as Vue).$el.querySelectorAll('.m-dropdown__list li'); // Vue.prototype.log('*2*', items); // expect(items.length == 1).toBeTruthy(); // if (input) { // // (vm as MDropdown).filterDropdown('E'); // (input as HTMLInputElement).value = 'E'; // } // items = (vm.$refs.dd as Vue).$el.querySelectorAll('.m-dropdown__list li'); // Vue.prototype.log('*3*', items); // expect(items.length == 1).toBeTruthy(); // expect(items[1].classList.contains(INACTIF_CSS)).toBeTruthy(); // if (input) { // // (vm as MDropdown).filterDropdown(''); // (input as HTMLInputElement).value = ''; // } // items = (vm.$refs.dd as Vue).$el.querySelectorAll('.m-dropdown__list li'); // expect(items.length == 4).toBeTruthy(); // }); // }); // En attente d'un changement pour Portal // it('emit change/Item selected', () => { // let clickSpy = jasmine.createSpy('clickSpy'); // let vm = new Vue({ // template: ` // // // // // // `, // methods: { // onChange: clickSpy // } // }).$mount(); // let item: Vue = vm.$refs.c as Vue; // item.$el.click(); // expect(clickSpy).toHaveBeenCalled(); // }); });