Skip to content

Commit 4bfd721

Browse files
committed
fix: text() misses content for array functional component
1 parent 297965c commit 4bfd721

File tree

5 files changed

+52
-9
lines changed

5 files changed

+52
-9
lines changed

src/baseWrapper.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { VNode } from 'vue'
12
import { textContent } from './utils'
23
import type { TriggerOptions } from './createDomEvent'
34
import {
@@ -219,7 +220,7 @@ export default abstract class BaseWrapper<ElementType extends Node>
219220
return results.map((c) =>
220221
c.proxy
221222
? createVueWrapper(null, c.proxy)
222-
: createDOMWrapper(c.vnode.el as Element)
223+
: createDOMWrapper(c.vnode.el as Element, c.subTree as VNode)
223224
)
224225
}
225226
abstract setValue(value?: any): Promise<void>

src/domWrapper.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { VNode } from 'vue'
12
import { config } from './config'
23
import BaseWrapper from './baseWrapper'
34
import WrapperLike from './interfaces/wrapperLike'
@@ -11,16 +12,23 @@ import { isRefSelector } from './utils'
1112
import { createWrapperError } from './errorWrapper'
1213

1314
export class DOMWrapper<NodeType extends Node> extends BaseWrapper<NodeType> {
14-
constructor(element: NodeType | null | undefined) {
15+
protected readonly subTree: VNode | null | undefined = null
16+
17+
constructor(element: NodeType | null | undefined, subTree?: VNode | null) {
1518
if (!element) {
1619
return createWrapperError('DOMWrapper')
1720
}
1821
super(element)
22+
this.subTree = subTree
23+
1924
// plugins hook
2025
config.plugins.DOMWrapper.extend(this)
2126
}
2227

2328
getRootNodes() {
29+
if (Array.isArray(this.subTree?.children)) {
30+
return this.subTree.children.map((node) => (node as any)?.el)
31+
}
2432
return [this.wrapperElement]
2533
}
2634

@@ -64,7 +72,7 @@ export class DOMWrapper<NodeType extends Node> extends BaseWrapper<NodeType> {
6472
}
6573
return Array.from(
6674
this.wrapperElement.querySelectorAll(selector),
67-
createDOMWrapper
75+
(element) => createDOMWrapper(element)
6876
)
6977
}
7078

@@ -155,4 +163,7 @@ export class DOMWrapper<NodeType extends Node> extends BaseWrapper<NodeType> {
155163
}
156164
}
157165

158-
registerFactory(WrapperType.DOMWrapper, (element) => new DOMWrapper(element))
166+
registerFactory(
167+
WrapperType.DOMWrapper,
168+
(element, subTree) => new DOMWrapper(element, subTree)
169+
)

src/vueWrapper.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ export class VueWrapper<
173173
): DOMWrapper<SVGElementTagNameMap[K]>[]
174174
findAll<T extends Element>(selector: string): DOMWrapper<T>[]
175175
findAll(selector: string): DOMWrapper<Element>[] {
176-
return this.findAllDOMElements(selector).map(createDOMWrapper)
176+
return this.findAllDOMElements(selector).map((e) => createDOMWrapper(e))
177177
}
178178

179179
private attachNativeEventListener(): void {

src/wrapperFactory.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ComponentPublicInstance, App } from 'vue'
1+
import { ComponentPublicInstance, App, VNode } from 'vue'
22
import type { DOMWrapper as DOMWrapperType } from './domWrapper'
33
import type { VueWrapper as VueWrapperType } from './vueWrapper'
44

@@ -8,7 +8,8 @@ export enum WrapperType {
88
}
99

1010
type DOMWrapperFactory = <T extends Node>(
11-
element: T | null | undefined
11+
element: T | null | undefined,
12+
subTree?: VNode
1213
) => DOMWrapperType<T>
1314
type VueWrapperFactory = <T extends ComponentPublicInstance>(
1415
app: App | null,
@@ -36,7 +37,7 @@ export function registerFactory(
3637
factories[type] = fn
3738
}
3839

39-
export const createDOMWrapper: DOMWrapperFactory = (element) =>
40-
factories[WrapperType.DOMWrapper]!(element)
40+
export const createDOMWrapper: DOMWrapperFactory = (element, subTree) =>
41+
factories[WrapperType.DOMWrapper]!(element, subTree)
4142
export const createVueWrapper: VueWrapperFactory = (app, vm, setProps) =>
4243
factories[WrapperType.VueWrapper]!(app, vm, setProps)

tests/element.spec.ts

+30
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,36 @@ describe('element', () => {
6060
expect(wrapper.text()).toBe('foobarbaz')
6161
})
6262

63+
it('returns correct output for functional component with multiple text roots', () => {
64+
const Func = () => ['foo', 'bar']
65+
66+
const Parent = defineComponent({
67+
name: 'Parent',
68+
components: { Func },
69+
template: '<div><Func/></div>'
70+
})
71+
const wrapper = mount(Parent)
72+
73+
expect(wrapper.findComponent(Func).html()).toBe('foo\nbar')
74+
expect(wrapper.findComponent(Func).text()).toBe('foobar')
75+
})
76+
77+
it('returns correct output for functional component with multiple element roots', () => {
78+
const Func = () => [h('div', {}, 'foo'), h('div', {}, 'bar')]
79+
80+
const Parent = defineComponent({
81+
name: 'Parent',
82+
components: { Func },
83+
template: '<div><Func/></div>'
84+
})
85+
const wrapper = mount(Parent)
86+
87+
expect(wrapper.findComponent(Func).html()).toBe(
88+
'<div>foo</div>\n<div>bar</div>'
89+
)
90+
expect(wrapper.findComponent(Func).text()).toBe('foobar')
91+
})
92+
6393
it('returns correct element for root slot', () => {
6494
const Parent = defineComponent({
6595
components: { ReturnSlot },

0 commit comments

Comments
 (0)