Skip to content

Commit 9bba382

Browse files
committed
feat: Added typings
1 parent 2d94599 commit 9bba382

File tree

6 files changed

+71
-43
lines changed

6 files changed

+71
-43
lines changed

src/baseWrapper.ts

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { textContent } from './utils'
2-
import { createDOMEvent } from './createDomEvent'
32
import type { TriggerOptions } from './createDomEvent'
43
import { nextTick } from 'vue'
5-
import { DomEventName } from './constants/dom-event-types'
64

7-
export default class BaseWrapper<ElementType extends Element> {
5+
export default abstract class BaseWrapper<ElementType extends Element> {
86
private readonly wrapperElement: ElementType
97

108
get element() {
@@ -45,40 +43,28 @@ export default class BaseWrapper<ElementType extends Element> {
4543
return true
4644
}
4745

48-
async trigger(eventString: DomEventName | string, options?: TriggerOptions) {
49-
if (options && options['target']) {
50-
throw Error(
51-
`[vue-test-utils]: you cannot set the target value of an event. See the notes section ` +
52-
`of the docs for more details—` +
53-
`https://vue-test-utils.vuejs.org/api/wrapper/trigger.html`
54-
)
55-
}
56-
57-
const isDisabled = () => {
58-
const validTagsToBeDisabled = [
59-
'BUTTON',
60-
'COMMAND',
61-
'FIELDSET',
62-
'KEYGEN',
63-
'OPTGROUP',
64-
'OPTION',
65-
'SELECT',
66-
'TEXTAREA',
67-
'INPUT'
68-
]
69-
const hasDisabledAttribute = this.attributes().disabled !== undefined
70-
const elementCanBeDisabled = validTagsToBeDisabled.includes(
71-
this.element.tagName
72-
)
73-
74-
return hasDisabledAttribute && elementCanBeDisabled
75-
}
46+
protected isDisabled = () => {
47+
const validTagsToBeDisabled = [
48+
'BUTTON',
49+
'COMMAND',
50+
'FIELDSET',
51+
'KEYGEN',
52+
'OPTGROUP',
53+
'OPTION',
54+
'SELECT',
55+
'TEXTAREA',
56+
'INPUT'
57+
]
58+
const hasDisabledAttribute = this.attributes().disabled !== undefined
59+
const elementCanBeDisabled = validTagsToBeDisabled.includes(
60+
this.element.tagName
61+
)
7662

77-
if (this.element && !isDisabled()) {
78-
const event = createDOMEvent(eventString, options)
79-
this.element.dispatchEvent(event)
80-
}
81-
82-
return nextTick()
63+
return hasDisabledAttribute && elementCanBeDisabled
8364
}
65+
66+
abstract trigger(
67+
eventString: string,
68+
options?: TriggerOptions
69+
): ReturnType<typeof nextTick>
8470
}

src/domWrapper.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import { isElementVisible } from './utils/isElementVisible'
33
import BaseWrapper from './baseWrapper'
44
import { createWrapperError } from './errorWrapper'
55
import WrapperLike from './interfaces/wrapperLike'
6+
import { DomEventName } from './constants/dom-event-types'
7+
import { createDOMEvent, TriggerOptions } from './createDomEvent'
8+
import { nextTick } from 'vue'
69

710
export class DOMWrapper<ElementType extends Element>
811
extends BaseWrapper<ElementType>
@@ -137,4 +140,21 @@ export class DOMWrapper<ElementType extends Element>
137140

138141
return new DOMWrapper(parentElement).trigger('change')
139142
}
143+
144+
async trigger(eventString: DomEventName | string, options?: TriggerOptions) {
145+
if (options && options['target']) {
146+
throw Error(
147+
`[vue-test-utils]: you cannot set the target value of an event. See the notes section ` +
148+
`of the docs for more details—` +
149+
`https://vue-test-utils.vuejs.org/api/wrapper/trigger.html`
150+
)
151+
}
152+
153+
if (this.element && !this.isDisabled()) {
154+
const event = createDOMEvent(eventString, options)
155+
this.element.dispatchEvent(event)
156+
}
157+
158+
return nextTick()
159+
}
140160
}

src/vueWrapper.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { mergeDeep } from './utils'
1717
import { emitted, recordEvent } from './emit'
1818
import BaseWrapper from './baseWrapper'
1919
import WrapperLike from './interfaces/wrapperLike'
20+
import { createDOMEvent, TriggerOptions } from './createDomEvent'
2021

2122
export class VueWrapper<T extends ComponentPublicInstance>
2223
extends BaseWrapper<T['$el']>
@@ -257,6 +258,26 @@ export class VueWrapper<T extends ComponentPublicInstance>
257258

258259
this.__app.unmount()
259260
}
261+
262+
async trigger(
263+
eventString: Parameters<T['$emit']>[0],
264+
options?: TriggerOptions
265+
) {
266+
if (options && options['target']) {
267+
throw Error(
268+
`[vue-test-utils]: you cannot set the target value of an event. See the notes section ` +
269+
`of the docs for more details—` +
270+
`https://vue-test-utils.vuejs.org/api/wrapper/trigger.html`
271+
)
272+
}
273+
274+
if (this.element && !this.isDisabled()) {
275+
const event = createDOMEvent(eventString, options)
276+
this.element.dispatchEvent(event)
277+
}
278+
279+
return nextTick()
280+
}
260281
}
261282

262283
export function createWrapper<T extends ComponentPublicInstance>(

tests/emit.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ describe('emitted', () => {
316316
})
317317

318318
const wrapper = mount(Foo)
319-
await wrapper.trigger('click')
319+
await wrapper.get('div').trigger('click')
320320
expect(wrapper.emitted('foo')).toHaveLength(1)
321321
})
322322
})

tests/props.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ describe('props', () => {
110110
})
111111

112112
expect(wrapper.props('modelValue')).toBe(1)
113-
await wrapper.trigger('click')
113+
await wrapper.get('button').trigger('click')
114114
expect(wrapper.props('modelValue')).toBe(2)
115115
})
116116

@@ -217,7 +217,7 @@ describe('props', () => {
217217

218218
expect(wrapper.text()).toEqual('hello')
219219

220-
await wrapper.trigger('click')
220+
await wrapper.get('div').trigger('click')
221221

222222
expect(wrapper.text()).toEqual('hello')
223223
})

tests/trigger.spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,10 +314,11 @@ describe('trigger', () => {
314314
describe('custom data', () => {
315315
it('adds custom data to events', () => {
316316
const updateHandler = jest.fn()
317-
const Component = {
317+
const Component = defineComponent({
318318
template: '<div @update="updateHandler" />',
319-
methods: { updateHandler }
320-
}
319+
methods: { updateHandler },
320+
emits: ['update']
321+
})
321322
const wrapper = mount(Component, {})
322323

323324
wrapper.trigger('update', { customData: 123 })

0 commit comments

Comments
 (0)