Skip to content

Commit d49a9b4

Browse files
tests: improve findComponent tests
1 parent 6f435d1 commit d49a9b4

File tree

3 files changed

+60
-7
lines changed

3 files changed

+60
-7
lines changed

src/utils/find.ts

+16
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,35 @@ import { VNode, ComponentPublicInstance } from 'vue'
22
import { FindAllComponentsSelector } from '../types'
33
import { matchName } from './matchName'
44

5+
/**
6+
* Detect whether a selector matches a VNode
7+
* @param node
8+
* @param selector
9+
* @return {boolean | ((value: any) => boolean)}
10+
*/
511
function matches(node: VNode, selector: FindAllComponentsSelector): boolean {
12+
// do not return none Vue components
13+
if (!node.component) return false
14+
615
if (typeof selector === 'string') {
716
return node.el?.matches?.(selector)
817
}
18+
919
if (typeof selector === 'object' && typeof node.type === 'object') {
1020
if (selector.name && ('name' in node.type || 'displayName' in node.type)) {
1121
// match normal component definitions or functional components
1222
return matchName(selector.name, node.type.name || node.type.displayName)
1323
}
1424
}
25+
1526
return false
1627
}
1728

29+
/**
30+
* Collect all children
31+
* @param nodes
32+
* @param children
33+
*/
1834
function aggregateChildren(nodes, children) {
1935
if (children && Array.isArray(children)) {
2036
;[...children].reverse().forEach((n: VNode) => {

tests/findAllComponents.spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ describe('findAllComponents', () => {
1919
const wrapper = mount(compA)
2020
// find by DOM selector
2121
expect(wrapper.findAllComponents('.C')).toHaveLength(2)
22-
expect(wrapper.findAllComponents({ name: 'Hello' })[0].el.textContent).toBe(
23-
'Hello world'
24-
)
25-
expect(wrapper.findAllComponents(Hello)[0].el.textContent).toBe(
22+
expect(
23+
wrapper.findAllComponents({ name: 'Hello' })[0].$el.textContent
24+
).toBe('Hello world')
25+
expect(wrapper.findAllComponents(Hello)[0].$el.textContent).toBe(
2626
'Hello world'
2727
)
2828
})

tests/findComponent.spec.ts

+40-3
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,41 @@ const compC = {
55
name: 'ComponentC',
66
template: '<div class="C">C</div>'
77
}
8+
9+
const compD = {
10+
name: 'ComponentD',
11+
template: '<comp-c class="c-as-root-on-d" />',
12+
components: { compC }
13+
}
14+
815
const compB = {
916
name: 'component-b',
10-
template: '<div class="B">TextBefore<comp-c/>TextAfter<comp-c/></div>',
11-
components: { compC }
17+
template: `
18+
<div class="B">
19+
TextBefore
20+
<comp-c />
21+
TextAfter
22+
<comp-c />
23+
<comp-d id="compD" />
24+
</div>`,
25+
components: { compC, compD }
1226
}
1327
const compA = {
14-
template: '<div class="A"><comp-b/><hello ref="b"/></div>',
28+
template: `
29+
<div class="A">
30+
<comp-b />
31+
<hello ref="b" />
32+
<div class="domElement" />
33+
</div>`,
1534
components: { compB, Hello }
1635
}
1736

1837
describe('findComponent', () => {
38+
it('does not find plain dom elements', () => {
39+
const wrapper = mount(compA)
40+
expect(wrapper.findComponent('.domElement')).toBeFalsy()
41+
})
42+
1943
it('finds component by ref', () => {
2044
const wrapper = mount(compA)
2145
// find by ref
@@ -28,6 +52,19 @@ describe('findComponent', () => {
2852
expect(wrapper.findComponent('.C').$options.name).toEqual('ComponentC')
2953
})
3054

55+
it('does allows using complicated DOM selector query', () => {
56+
const wrapper = mount(compA)
57+
expect(wrapper.findComponent('.B > .C').$options.name).toEqual('ComponentC')
58+
})
59+
60+
it('finds a component when root of mounted component', async () => {
61+
const wrapper = mount(compD)
62+
// make sure it finds the component, not its root
63+
expect(wrapper.findComponent('.c-as-root-on-d').$options.name).toEqual(
64+
'ComponentC'
65+
)
66+
})
67+
3168
it('finds component by name', () => {
3269
const wrapper = mount(compA)
3370
expect(wrapper.findComponent({ name: 'Hello' }).$el.textContent).toBe(

0 commit comments

Comments
 (0)