Skip to content

Commit 65ee480

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

File tree

5 files changed

+67
-22
lines changed

5 files changed

+67
-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: 15 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,16 @@ export class DOMWrapper<NodeType extends Node> extends BaseWrapper<NodeType> {
4044
return result
4145
}
4246

47+
findAll(selector: string): DOMWrapper<Element>[] {
48+
if (!(this.wrapperElement instanceof Element)) {
49+
return []
50+
}
51+
return Array.from(
52+
this.wrapperElement.querySelectorAll(selector),
53+
createDOMWrapper
54+
)
55+
}
56+
4357
findAllComponents(selector: any): any {
4458
const results = super.findAllComponents(selector)
4559
return results.filter((r: WrapperLike) => this.element.contains(r.element))

src/vueWrapper.ts

Lines changed: 5 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,10 @@ export class VueWrapper<
8182
return this.vm.$
8283
}
8384

85+
findAll(selector: string): DOMWrapper<Element>[] {
86+
return this.findAllDOMElements(selector).map(createDOMWrapper)
87+
}
88+
8489
private attachNativeEventListener(): void {
8590
const vm = this.vm
8691
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: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { defineComponent, h, nextTick, Fragment } from 'vue'
22

3-
import { mount, VueWrapper } from '../src'
3+
import { DOMWrapper, mount, VueWrapper } from '../src'
44
import SuspenseComponent from './components/Suspense.vue'
5+
import ParentComponent from './components/ParentComponent.vue'
56
import MultipleRootRender from './components/MultipleRootRender.vue'
67

78
describe('find', () => {
@@ -93,18 +94,6 @@ describe('find', () => {
9394
expect(wrapper.find('.foo').exists()).toBe(true)
9495
})
9596

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-
10897
it('can be chained', () => {
10998
const Component = defineComponent({
11099
render() {
@@ -347,4 +336,36 @@ describe('findAll', () => {
347336
expect(wrapper.findAll('a')).toHaveLength(3)
348337
})
349338
})
339+
340+
// https://github.com/vuejs/test-utils/issues/1233
341+
it('finds 3 children', () => {
342+
const wrapper = mount(ParentComponent)
343+
344+
const parent = wrapper.get('.parent')
345+
346+
expect(parent.findAll('div').length).toBe(3)
347+
})
348+
349+
it('finds itself on Vue wrapper', () => {
350+
const wrapper = mount(ParentComponent)
351+
352+
const parent = wrapper.get('div')
353+
354+
expect(parent.classes()).toContain('parent')
355+
})
356+
357+
it('does not find itself on DOM node', () => {
358+
const wrapper = mount(ParentComponent)
359+
360+
const parent = wrapper.get('.parent')
361+
362+
expect(parent.find('div').classes()).toContain('first')
363+
})
364+
365+
// https://github.com/vuejs/test-utils/issues/1233
366+
it('finds all divs with findAll', () => {
367+
const wrapper = mount(ParentComponent)
368+
369+
expect(wrapper.findAll('div').length).toBe(4)
370+
})
350371
})

0 commit comments

Comments
 (0)