Skip to content

Commit f6dd259

Browse files
llllllllllxcexbrayat
authored andcommitted
fix: using find after using findAllComponents does not match expectations
Fixes vuejs#484
1 parent 63ea373 commit f6dd259

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

src/vueWrapper.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,11 @@ export class VueWrapper<T extends ComponentPublicInstance>
104104
): DOMWrapper<SVGElementTagNameMap[K]>
105105
find<T extends Element>(selector: string): DOMWrapper<T>
106106
find(selector: string): DOMWrapper<Element> {
107-
// force using the parentElement to allow finding the root element
108-
const result = this.parentElement.querySelector(selector)
107+
const result = this.parentElement['__vue_app__']
108+
? // force using the parentElement to allow finding the root element
109+
this.parentElement.querySelector(selector)
110+
: this.element.querySelector(selector)
111+
109112
if (result) {
110113
return new DOMWrapper(result)
111114
}
@@ -202,7 +205,10 @@ export class VueWrapper<T extends ComponentPublicInstance>
202205
): DOMWrapper<SVGElementTagNameMap[K]>[]
203206
findAll<T extends Element>(selector: string): DOMWrapper<T>[]
204207
findAll(selector: string): DOMWrapper<Element>[] {
205-
const results = this.parentElement.querySelectorAll(selector)
208+
const results = this.parentElement['__vue_app__']
209+
? this.parentElement.querySelectorAll(selector)
210+
: this.element.querySelectorAll(selector)
211+
206212
return Array.from(results).map((element) => new DOMWrapper(element))
207213
}
208214

tests/find.spec.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,32 @@ describe('find', () => {
2626
expect(wrapper.find('#my-span').exists()).toBe(true)
2727
})
2828

29+
test('find using current node after findAllComponents', () => {
30+
const ComponentB = defineComponent({
31+
name: 'ComponentB',
32+
template: '<div><slot></slot></div>'
33+
})
34+
35+
const ComponentA = defineComponent({
36+
name: 'ComponentA',
37+
template: `
38+
<div>
39+
<component-b v-for="item in [1, 2]" :key="item">
40+
<input type="text" :value="item">
41+
</component-b>
42+
</div>
43+
`,
44+
components: { ComponentB }
45+
})
46+
47+
const wrapper = mount(ComponentA)
48+
const firstCompB = wrapper.findComponent({ name: 'ComponentB' })
49+
const lastCompB = wrapper.findAllComponents({ name: 'ComponentB' })[1]
50+
51+
expect(firstCompB.find('input').element.value).toBe('1')
52+
expect(lastCompB.find('input').element.value).toBe('2')
53+
})
54+
2955
it('returns the root element in single root element', () => {
3056
const Component = defineComponent({
3157
render() {
@@ -85,6 +111,32 @@ describe('findAll', () => {
85111
expect(wrapper.findAll('.span')).toHaveLength(2)
86112
})
87113

114+
test('findAll using current node after findAllComponents', () => {
115+
const ComponentB = defineComponent({
116+
name: 'ComponentB',
117+
template: '<div><slot></slot></div>'
118+
})
119+
120+
const ComponentA = defineComponent({
121+
name: 'ComponentA',
122+
template: `
123+
<div>
124+
<component-b v-for="item in [1, 2]" :key="item">
125+
<input type="text" :value="item">
126+
</component-b>
127+
</div>
128+
`,
129+
components: { ComponentB }
130+
})
131+
132+
const wrapper = mount(ComponentA)
133+
const firstCompB = wrapper.findComponent({ name: 'ComponentB' })
134+
const lastCompB = wrapper.findAllComponents({ name: 'ComponentB' })[1]
135+
136+
expect(firstCompB.findAll('input')[0].element.value).toBe('1')
137+
expect(lastCompB.findAll('input')[0].element.value).toBe('2')
138+
})
139+
88140
test('works with suspense', async () => {
89141
const wrapper = mount(SuspenseComponent)
90142

0 commit comments

Comments
 (0)