Skip to content

Commit 6484d0b

Browse files
committed
fix(find): find and findAll should not find itself on DOM wrappers
1 parent 0bb5611 commit 6484d0b

File tree

5 files changed

+80
-22
lines changed

5 files changed

+80
-22
lines changed

src/baseWrapper.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,24 +80,22 @@ export default abstract class BaseWrapper<ElementType extends Node>
8080
}
8181
}
8282

83-
const elements = this.findAllDOMElements(selector)
83+
const elements = this.findAll(selector)
8484
if (elements.length > 0) {
85-
return createDOMWrapper(elements[0])
85+
return elements[0]
8686
}
8787

8888
return createWrapperError('DOMWrapper')
8989
}
9090

91-
findAll<K extends keyof HTMLElementTagNameMap>(
91+
abstract findAll<K extends keyof HTMLElementTagNameMap>(
9292
selector: K
9393
): DOMWrapper<HTMLElementTagNameMap[K]>[]
94-
findAll<K extends keyof SVGElementTagNameMap>(
94+
abstract findAll<K extends keyof SVGElementTagNameMap>(
9595
selector: K
9696
): DOMWrapper<SVGElementTagNameMap[K]>[]
97-
findAll<T extends Element>(selector: string): DOMWrapper<T>[]
98-
findAll(selector: string): DOMWrapper<Element>[] {
99-
return this.findAllDOMElements(selector).map(createDOMWrapper)
100-
}
97+
abstract findAll<T extends Element>(selector: string): DOMWrapper<T>[]
98+
abstract findAll(selector: string): DOMWrapper<Element>[]
10199

102100
// searching by string without specifying component results in WrapperLike object
103101
findComponent<T extends never>(selector: string): WrapperLike

src/domWrapper.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { config } from './config'
22
import BaseWrapper from './baseWrapper'
33
import WrapperLike from './interfaces/wrapperLike'
4-
import { registerFactory, WrapperType } from './wrapperFactory'
4+
import {
5+
createDOMWrapper,
6+
registerFactory,
7+
WrapperType
8+
} from './wrapperFactory'
59
import { RefSelector } from './types'
610
import { isRefSelector } from './utils'
711
import { createWrapperError } from './errorWrapper'
@@ -40,6 +44,23 @@ export class DOMWrapper<NodeType extends Node> extends BaseWrapper<NodeType> {
4044
return result
4145
}
4246

47+
findAll<K extends keyof HTMLElementTagNameMap>(
48+
selector: K
49+
): DOMWrapper<HTMLElementTagNameMap[K]>[]
50+
findAll<K extends keyof SVGElementTagNameMap>(
51+
selector: K
52+
): DOMWrapper<SVGElementTagNameMap[K]>[]
53+
findAll<T extends Element>(selector: string): DOMWrapper<T>[]
54+
findAll(selector: string): DOMWrapper<Element>[] {
55+
if (!(this.wrapperElement instanceof Element)) {
56+
return []
57+
}
58+
return Array.from(
59+
this.wrapperElement.querySelectorAll(selector),
60+
createDOMWrapper
61+
)
62+
}
63+
4364
findAllComponents(selector: any): any {
4465
const results = super.findAllComponents(selector)
4566
return results.filter((r: WrapperLike) => this.element.contains(r.element))

src/vueWrapper.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { mergeDeep } from './utils'
1515
import { getRootNodes } from './utils/getRootNodes'
1616
import { emitted, recordEvent } from './emit'
1717
import BaseWrapper from './baseWrapper'
18+
import type { DOMWrapper } from './domWrapper'
1819
import {
1920
createDOMWrapper,
2021
registerFactory,
@@ -81,6 +82,17 @@ export class VueWrapper<
8182
return this.vm.$
8283
}
8384

85+
findAll<K extends keyof HTMLElementTagNameMap>(
86+
selector: K
87+
): DOMWrapper<HTMLElementTagNameMap[K]>[]
88+
findAll<K extends keyof SVGElementTagNameMap>(
89+
selector: K
90+
): DOMWrapper<SVGElementTagNameMap[K]>[]
91+
findAll<T extends Element>(selector: string): DOMWrapper<T>[]
92+
findAll(selector: string): DOMWrapper<Element>[] {
93+
return this.findAllDOMElements(selector).map(createDOMWrapper)
94+
}
95+
8496
private attachNativeEventListener(): void {
8597
const vm = this.vm
8698
if (!vm) return

tests/components/ParentComponent.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<template>
2+
<div class="parent">
3+
<div class="first">child</div>
4+
<div>child</div>
5+
<div>child</div>
6+
</div>
7+
</template>

tests/find.spec.ts

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { defineComponent, h, nextTick, Fragment } from 'vue'
2-
32
import { mount, VueWrapper } from '../src'
43
import SuspenseComponent from './components/Suspense.vue'
4+
import ParentComponent from './components/ParentComponent.vue'
55
import MultipleRootRender from './components/MultipleRootRender.vue'
66

77
describe('find', () => {
@@ -93,18 +93,6 @@ describe('find', () => {
9393
expect(wrapper.find('.foo').exists()).toBe(true)
9494
})
9595

96-
it('returns the root element from dom wrapper if it matches', () => {
97-
const Component = defineComponent({
98-
render() {
99-
return h('div', { class: 'foo' }, 'text')
100-
}
101-
})
102-
103-
const wrapper = mount(Component)
104-
const domWrapper = wrapper.find('.foo')
105-
expect(domWrapper.find('.foo').exists()).toBe(true)
106-
})
107-
10896
it('can be chained', () => {
10997
const Component = defineComponent({
11098
render() {
@@ -347,4 +335,36 @@ describe('findAll', () => {
347335
expect(wrapper.findAll('a')).toHaveLength(3)
348336
})
349337
})
338+
339+
// https://github.com/vuejs/test-utils/issues/1233
340+
it('finds 3 children', () => {
341+
const wrapper = mount(ParentComponent)
342+
343+
const parent = wrapper.get('.parent')
344+
345+
expect(parent.findAll('div').length).toBe(3)
346+
})
347+
348+
it('finds itself on Vue wrapper', () => {
349+
const wrapper = mount(ParentComponent)
350+
351+
const parent = wrapper.get('div')
352+
353+
expect(parent.classes()).toContain('parent')
354+
})
355+
356+
it('does not find itself on DOM node', () => {
357+
const wrapper = mount(ParentComponent)
358+
359+
const parent = wrapper.get('.parent')
360+
361+
expect(parent.find('div').classes()).toContain('first')
362+
})
363+
364+
// https://github.com/vuejs/test-utils/issues/1233
365+
it('finds all divs with findAll', () => {
366+
const wrapper = mount(ParentComponent)
367+
368+
expect(wrapper.findAll('div').length).toBe(4)
369+
})
350370
})

0 commit comments

Comments
 (0)