import VueSelect from '../../src/components/Select' import { shallowMount } from '@vue/test-utils' import { selectWithProps } from '../helpers' describe('Labels', () => { it('can generate labels using a custom label key', () => { const Select = selectWithProps({ options: [{ name: 'Foo' }], label: 'name', value: { name: 'Foo' }, }) expect(Select.find('.vs__selected').text()).toBe('Foo') }) it('will console.warn when options contain objects without a valid label key', async () => { const spy = jest.spyOn(console, 'warn').mockImplementation(() => {}) const Select = selectWithProps({ options: [{}], }) Select.vm.open = true await Select.vm.$nextTick() expect(spy).toHaveBeenCalledWith( '[vue-select warn]: Label key "option.label" does not exist in options object {}.' + '\nhttps://vue-select.org/api/props.html#getoptionlabel' ) }) it('should display a placeholder if the value is empty', () => { const Select = shallowMount(VueSelect, { propsData: { options: ['one'], }, attrs: { placeholder: 'foo', }, }) expect(Select.vm.searchPlaceholder).toEqual('foo') Select.vm.$data._value = 'one' expect(Select.vm.searchPlaceholder).not.toBeDefined() }) describe('getOptionLabel', () => { it('will return undefined if the option lacks the label key', () => { const getOptionLabel = VueSelect.props.getOptionLabel.default.bind({ label: 'label', }) expect(getOptionLabel({ name: 'vue' })).toEqual(undefined) }) it('will return a string value for a valid key', () => { const getOptionLabel = VueSelect.props.getOptionLabel.default.bind({ label: 'label', }) expect(getOptionLabel({ label: 'vue' })).toEqual('vue') }) /** * this test fails because of a bug where Vue executes the default contents * of a slot, even if it is implemented by the consumer. * @see https://github.com/vuejs/vue/issues/10224 * @see https://github.com/vuejs/vue/pull/10229 */ xit('will not call getOptionLabel if both scoped option slots are used and a filter is provided', () => { const spy = spyOn(VueSelect.props.getOptionLabel, 'default') const Select = shallowMount(VueSelect, { propsData: { options: [{ name: 'one' }], filter: () => {}, }, scopedSlots: { option: '{{ props.name }}', 'selected-option': '{{ props.name }}', }, }) Select.vm.select({ name: 'one' }) expect(spy).toHaveBeenCalledTimes(0) expect(Select.find('.selected').exists()).toBeTruthy() }) }) })