UNPKG

bootstrap-vue

Version:

With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extens

1,001 lines (815 loc) 30.1 kB
import { mount } from '@vue/test-utils' import { waitNT, waitRAF } from '../../../tests/utils' import { BFormTextarea } from './form-textarea' describe('form-textarea', () => { it('root element is textarea', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.element.type).toBe('textarea') wrapper.destroy() }) it('does not have attribute disabled by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.attributes('disabled')).toBeUndefined() wrapper.destroy() }) it('has attribute disabled when disabled=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { disabled: true } }) expect(wrapper.attributes('disabled')).toBeDefined() wrapper.destroy() }) it('does not have attribute readonly by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.attributes('readonly')).toBeUndefined() wrapper.destroy() }) it('has attribute readonly when readonly=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { readonly: true } }) expect(wrapper.attributes('readonly')).toBeDefined() wrapper.destroy() }) it('inherits non-prop attributes', async () => { const wrapper = mount(BFormTextarea, { attrs: { foo: 'bar' } }) expect(wrapper.attributes('foo')).toBeDefined() expect(wrapper.attributes('foo')).toBe('bar') wrapper.destroy() }) it('has class form-control by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.classes()).toContain('form-control') wrapper.destroy() }) it('does not have class form-control-plaintext by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.classes()).not.toContain('form-control-plaintext') wrapper.destroy() }) it('does not have size classes by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.classes()).not.toContain('form-control-sm') expect(wrapper.classes()).not.toContain('form-control-lg') wrapper.destroy() }) it('has size class when size prop is set', async () => { const wrapper = mount(BFormTextarea, { propsData: { size: 'sm' } }) expect(wrapper.classes()).toContain('form-control-sm') await wrapper.setProps({ size: 'lg' }) expect(wrapper.classes()).toContain('form-control-lg') await wrapper.setProps({ size: 'foobar' }) expect(wrapper.classes()).toContain('form-control-foobar') await wrapper.setProps({ size: '' }) expect(wrapper.classes()).not.toContain('form-control-') wrapper.destroy() }) it('has class form-control-plaintext when plaintext=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { plaintext: true } }) expect(wrapper.classes()).toContain('form-control-plaintext') wrapper.destroy() }) it('does not have class form-control when plaintext=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { plaintext: true } }) expect(wrapper.classes()).not.toContain('form-control') wrapper.destroy() }) it('has attribute readonly when plaintext=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { plaintext: true } }) expect(wrapper.attributes('readonly')).toBeDefined() wrapper.destroy() }) it('has user supplied id', async () => { const wrapper = mount(BFormTextarea, { propsData: { id: 'foobar' } }) expect(wrapper.attributes('id')).toBe('foobar') wrapper.destroy() }) it('does not have is-valid or is-invalid classes by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.classes()).not.toContain('is-valid') expect(wrapper.classes()).not.toContain('is-invalid') wrapper.destroy() }) it('has class is-valid when state=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { state: true } }) expect(wrapper.classes()).toContain('is-valid') expect(wrapper.classes()).not.toContain('is-invalid') wrapper.destroy() }) it('has class is-invalid when state=false', async () => { const wrapper = mount(BFormTextarea, { propsData: { state: false } }) expect(wrapper.classes()).toContain('is-invalid') expect(wrapper.classes()).not.toContain('is-valid') wrapper.destroy() }) it('does not have aria-invalid attribute by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.attributes('aria-invalid')).toBeUndefined() wrapper.destroy() }) it('does not have aria-invalid attribute when state=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { state: true } }) expect(wrapper.attributes('aria-invalid')).toBeUndefined() wrapper.destroy() }) it('has aria-invalid attribute when state=false', async () => { const wrapper = mount(BFormTextarea, { propsData: { state: false } }) expect(wrapper.attributes('aria-invalid')).toBe('true') wrapper.destroy() }) it('has aria-invalid attribute when aria-invalid=true', async () => { const wrapper = mount(BFormTextarea, { propsData: { ariaInvalid: true } }) expect(wrapper.attributes('aria-invalid')).toBe('true') await wrapper.setProps({ ariaInvalid: 'true' }) expect(wrapper.attributes('aria-invalid')).toBe('true') wrapper.destroy() }) it('has aria-invalid attribute when aria-invalid="spelling"', async () => { const wrapper = mount(BFormTextarea, { propsData: { ariaInvalid: 'spelling' } }) expect(wrapper.attributes('aria-invalid')).toBe('spelling') wrapper.destroy() }) it('does not emit an update event on mount when value not set', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.emitted('update')).toBeUndefined() wrapper.destroy() }) it('does mot emit an update event on mount when value is set and no formatter', async () => { const wrapper = mount(BFormTextarea, { value: 'foobar' }) expect(wrapper.emitted('update')).toBeUndefined() wrapper.destroy() }) it('emits an input event with single arg of value', async () => { const wrapper = mount(BFormTextarea) wrapper.element.value = 'test' await wrapper.trigger('input') expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input')[0].length).toEqual(1) expect(wrapper.emitted('input')[0][0]).toEqual('test') wrapper.destroy() }) it('emits an change event with single arg of value', async () => { const wrapper = mount(BFormTextarea) wrapper.element.value = 'test' await wrapper.trigger('change') expect(wrapper.emitted('change')).toBeDefined() expect(wrapper.emitted('change')[0].length).toEqual(1) expect(wrapper.emitted('change')[0][0]).toEqual('test') wrapper.destroy() }) it('emits an update event with one arg on input', async () => { const wrapper = mount(BFormTextarea) wrapper.element.value = 'test' await wrapper.trigger('input') expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update')[0].length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('test') wrapper.destroy() }) it('does not emit an update event on change when value not changed', async () => { const wrapper = mount(BFormTextarea) wrapper.element.value = 'test' await wrapper.trigger('input') expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('test') await wrapper.trigger('change') expect(wrapper.emitted('update').length).toEqual(1) wrapper.destroy() }) it('emits an update event with one arg on change when input text changed', async () => { const wrapper = mount(BFormTextarea) wrapper.element.value = 'test' await wrapper.trigger('input') expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('test') wrapper.element.value = 'TEST' await wrapper.trigger('change') expect(wrapper.emitted('update').length).toEqual(2) expect(wrapper.emitted('update')[1][0]).toEqual('TEST') wrapper.destroy() }) it('does not emit an update, input or change event when value prop changed', async () => { const wrapper = mount(BFormTextarea, { value: '' }) expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() await wrapper.setProps({ value: 'test' }) expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() wrapper.destroy() }) it('emits a native focus event', async () => { const spy = jest.fn() const wrapper = mount(BFormTextarea, { attachTo: document.body, listeners: { focus: spy } }) await wrapper.trigger('focus') expect(wrapper.emitted('focus')).toBeUndefined() expect(spy).toHaveBeenCalled() wrapper.destroy() }) it('emits a blur event when blurred', async () => { const wrapper = mount(BFormTextarea) await wrapper.trigger('blur') expect(wrapper.emitted('blur')).toBeDefined() wrapper.destroy() }) it('has attribute rows set to 2 by default', async () => { const wrapper = mount(BFormTextarea) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('2') wrapper.destroy() }) it('has attribute rows when rows set and max-rows not set', async () => { const wrapper = mount(BFormTextarea, { propsData: { rows: 10 } }) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('10') // Should work with both text and number values await wrapper.setProps({ rows: '20' }) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('20') // Should use minimum value of 2 when rows is set less than 2 await wrapper.setProps({ rows: '1' }) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('2') await wrapper.setProps({ rows: -10 }) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('2') wrapper.destroy() }) it('has attribute rows set when rows and max-rows are equal', async () => { const wrapper = mount(BFormTextarea, { propsData: { rows: 5, maxRows: 5 } }) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('5') // Should work with both text and number values await wrapper.setProps({ rows: '10', maxRows: '10' }) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('10') wrapper.destroy() }) it('does not have rows set when rows and max-rows set', async () => { const wrapper = mount(BFormTextarea, { propsData: { rows: 2, maxRows: 5 } }) expect(wrapper.attributes('rows')).toBeUndefined() wrapper.destroy() }) it('has attribute rows set when max-rows less than rows', async () => { const wrapper = mount(BFormTextarea, { propsData: { rows: 10, maxRows: 5 } }) expect(wrapper.attributes('rows')).toBeDefined() expect(wrapper.attributes('rows')).toEqual('10') wrapper.destroy() }) it('does not have style resize by default', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.resize).toEqual('') wrapper.destroy() }) it('does not have style resize when no-resize is set', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { noResize: true } }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.resize).toEqual('none') wrapper.destroy() }) it('does not have style resize when max-rows not set', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { rows: 10 } }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.resize).toEqual('') wrapper.destroy() }) it('does not have style resize when max-rows less than rows', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { rows: 10, maxRows: 5 } }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.resize).toEqual('') wrapper.destroy() }) it('has style resize:none when max-rows greater than rows', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { rows: 2, maxRows: 5 } }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.resize).toBeDefined() expect(wrapper.element.style.resize).toEqual('none') wrapper.destroy() }) it('does not have style height by default', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.height).toBeDefined() expect(wrapper.element.style.height).toEqual('') wrapper.destroy() }) it('does not have style height when rows and max-rows equal', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { rows: 2, maxRows: 2 } }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.height).toBeDefined() expect(wrapper.element.style.height).toEqual('') wrapper.destroy() }) it('does not have style height when max-rows not set', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { rows: 5 } }) expect(wrapper.element.style).toBeDefined() expect(wrapper.element.style.height).toBeDefined() expect(wrapper.element.style.height).toEqual('') wrapper.destroy() }) // The height style calculations do not work in JSDOM environment // But we do know auto height works in browser from manual testing // // it('has style height when max-rows greater than rows', async () => { // const input = mount(BFormTextarea, { // attachTo: document.body, // propsData: { // rows: 2, // maxRows: 5 // } // }) // await input.vm.$nextTick() // // expect(input.element.style).toBeDefined() // expect(input.element.style.height).toBeDefined() // expect(input.element.style.height).not.toEqual('') // // input.destroy() // }) // // it('auto height should work', async () => { // const input = mount(BFormTextarea, { // attachTo: document.body, // propsData: { // value: '', // rows: 2, // maxRows: 10 // } // }) // expect(input.element.style).toBeDefined() // expect(input.element.style.height).toBeDefined() // expect(input.element.style.height).not.toEqual('') // const firstHeight = parseFloat(input.element.style.height) // // Set content to five lines heigh // input.element.value = 'one\n two\n three\n four\n five' // await input.trigger('input') // expect(input.emitted('update')).toBeDefined() // expect(input.element.style.height).not.toEqual('') // const secondHeight = parseFloat(input.element.style.height) // expect(secondHeight).toBeGreaterThan(firstHeight) // // Set content to one lines heigh // input.element.value = 'one' // await input.trigger('input') // expect(input.emitted('update').length).toEqual(2) // expect(input.element.style.height).not.toEqual('') // const thirdHeight = parseFloat(input.element.style.height) // expect(thirdHeight).toBeLessThan(secondHeight) // // input.destroy() // }) it('Formats on input when not lazy', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: '', formatter(value) { return value.toLowerCase() } } }) wrapper.element.value = 'TEST' await wrapper.trigger('input') // Update event fires first with formatted value expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('test') // Followed by an input event with formatted value expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(1) expect(wrapper.emitted('input')[0][0]).toEqual('test') // And no change event expect(wrapper.emitted('change')).toBeUndefined() wrapper.destroy() }) it('Formats on change when not lazy', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: '', formatter(value) { return value.toLowerCase() } } }) wrapper.element.value = 'TEST' await wrapper.trigger('change') // Update event fires first with formatted value expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('test') // Followed by a change event with formatted value expect(wrapper.emitted('change')).toBeDefined() expect(wrapper.emitted('change').length).toEqual(1) expect(wrapper.emitted('change')[0][0]).toEqual('test') // And no input event expect(wrapper.emitted('input')).toBeUndefined() wrapper.destroy() }) it('Formats on blur when lazy', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { formatter(value) { return value.toLowerCase() }, lazyFormatter: true } }) wrapper.element.value = 'TEST' await wrapper.trigger('input') // Update event fires first expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('TEST') // Followed by an input expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(1) expect(wrapper.emitted('input')[0][0]).toEqual('TEST') expect(wrapper.vm.localValue).toEqual('TEST') await wrapper.trigger('change') // Update does not fire again expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('TEST') // Event change emitted expect(wrapper.emitted('change')).toBeDefined() expect(wrapper.emitted('change').length).toEqual(1) expect(wrapper.emitted('change')[0][0]).toEqual('TEST') expect(wrapper.vm.localValue).toEqual('TEST') await wrapper.trigger('blur') // Update fires before change with formatted value expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(2) expect(wrapper.emitted('update')[1][0]).toEqual('test') // Followed by blur event with native event expect(wrapper.emitted('blur')).toBeDefined() expect(wrapper.emitted('blur')[0][0] instanceof Event).toBe(true) expect(wrapper.emitted('blur')[0][0].type).toEqual('blur') // Expected number of events from above sequence expect(wrapper.emitted('input').length).toEqual(1) expect(wrapper.emitted('change').length).toEqual(1) expect(wrapper.emitted('blur').length).toEqual(1) expect(wrapper.emitted('update').length).toEqual(2) wrapper.destroy() }) it('Does not format value on mount when not lazy', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: 'TEST', formatter(value) { return value.toLowerCase() } } }) expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.vm.localValue).toEqual('TEST') wrapper.destroy() }) it('Does not format value on mount when lazy', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: 'TEST', formatter(value) { return value.toLowerCase() }, lazyFormatter: true } }) expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.vm.localValue).toEqual('TEST') wrapper.destroy() }) it('Does not format on prop "value" change when not lazy', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: '', formatter(value) { return value.toLowerCase() } } }) expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() expect(wrapper.vm.localValue).toEqual('') await wrapper.setProps({ value: 'TEST' }) expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() expect(wrapper.vm.localValue).toEqual('TEST') wrapper.destroy() }) it('does not format on value prop change when lazy', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: '', formatter(value) { return value.toLowerCase() }, lazyFormatter: true } }) expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() expect(wrapper.vm.localValue).toEqual('') // Does not emit any events await wrapper.setProps({ value: 'TEST' }) expect(wrapper.emitted('update')).toBeUndefined() expect(wrapper.emitted('input')).toBeUndefined() expect(wrapper.emitted('change')).toBeUndefined() expect(wrapper.vm.localValue).toEqual('TEST') wrapper.destroy() }) it('trim modifier prop works', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: '', trim: true } }) expect(wrapper.vm.localValue).toEqual('') wrapper.element.value = 'TEST' await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual('TEST') expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('TEST') expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(1) expect(wrapper.emitted('input')[0][0]).toEqual('TEST') wrapper.element.value = 'TEST ' await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual('TEST ') // `v-model` value stays the same and update event shouldn't be emitted again expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(2) expect(wrapper.emitted('input')[1][0]).toEqual('TEST ') wrapper.element.value = ' TEST ' await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual(' TEST ') // `v-model` value stays the same and update event shouldn't be emitted again expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(3) expect(wrapper.emitted('input')[2][0]).toEqual(' TEST ') await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual(' TEST ') // `v-model` value stays the same and update event shouldn't be emitted again expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(4) expect(wrapper.emitted('input')[3][0]).toEqual(' TEST ') await wrapper.trigger('change') expect(wrapper.vm.localValue).toEqual(' TEST ') // `v-model` value stays the same and update event shouldn't be emitted again expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('change')).toBeDefined() expect(wrapper.emitted('change').length).toEqual(1) expect(wrapper.emitted('change')[0][0]).toEqual(' TEST ') wrapper.destroy() }) it('number modifier prop works', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { value: '', number: true } }) expect(wrapper.vm.localValue).toEqual('') wrapper.element.value = 'TEST' await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual('TEST') expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(1) expect(wrapper.emitted('update')[0][0]).toEqual('TEST') expect(typeof wrapper.emitted('update')[0][0]).toEqual('string') expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(1) expect(wrapper.emitted('input')[0][0]).toEqual('TEST') expect(typeof wrapper.emitted('input')[0][0]).toEqual('string') wrapper.element.value = '123.45' await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual('123.45') expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(2) expect(wrapper.emitted('update')[1][0]).toEqual(123.45) expect(typeof wrapper.emitted('update')[1][0]).toEqual('number') expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(2) expect(wrapper.emitted('input')[1][0]).toEqual('123.45') expect(typeof wrapper.emitted('input')[1][0]).toEqual('string') wrapper.element.value = '0123.450' await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual('0123.450') // `v-model` value stays the same and update event shouldn't be emitted again expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(2) expect(wrapper.emitted('update')[1][0]).toEqual(123.45) expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(3) expect(wrapper.emitted('input')[2][0]).toEqual('0123.450') expect(typeof wrapper.emitted('input')[2][0]).toEqual('string') wrapper.element.value = '0123 450' await wrapper.trigger('input') expect(wrapper.vm.localValue).toEqual('0123 450') expect(wrapper.emitted('update')).toBeDefined() expect(wrapper.emitted('update').length).toEqual(3) expect(wrapper.emitted('update')[2][0]).toEqual(123) expect(typeof wrapper.emitted('update')[2][0]).toEqual('number') expect(wrapper.emitted('input')).toBeDefined() expect(wrapper.emitted('input').length).toEqual(4) expect(wrapper.emitted('input')[3][0]).toEqual('0123 450') expect(typeof wrapper.emitted('input')[3][0]).toEqual('string') wrapper.destroy() }) // These tests are wrapped in a new describe to limit // the scope of the `getBoundingClientRect` mock describe('prop `autofocus`', () => { const origGetBCR = Element.prototype.getBoundingClientRect beforeEach(() => { // Mock `getBoundingClientRect` so that the `isVisible(el)` test returns `true` // In our test below, all pagination buttons would normally be visible Element.prototype.getBoundingClientRect = jest.fn(() => ({ width: 24, height: 24, top: 0, left: 0, bottom: 0, right: 0 })) }) afterEach(() => { // Restore prototype Element.prototype.getBoundingClientRect = origGetBCR }) it('works when true', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { autofocus: true } }) expect(wrapper.vm).toBeDefined() await waitNT(wrapper.vm) await waitRAF() const input = wrapper.find('textarea') expect(input.exists()).toBe(true) expect(document).toBeDefined() expect(document.activeElement).toBe(input.element) wrapper.destroy() }) it('does not autofocus when false', async () => { const wrapper = mount(BFormTextarea, { attachTo: document.body, propsData: { autofocus: false } }) expect(wrapper.vm).toBeDefined() await waitNT(wrapper.vm) await waitRAF() const input = wrapper.find('textarea') expect(input.exists()).toBe(true) expect(document).toBeDefined() expect(document.activeElement).not.toBe(input.element) wrapper.destroy() }) }) })