1- import { vi , test , describe , expect } from 'vitest'
1+ import { vi , test , describe , expect , beforeEach } from 'vitest'
22import { $ , $$ } from '@wdio/globals'
33
4- import { wrapExpectedWithArray } from '../../src/util/elementsUtil.js'
4+ import { awaitElements , wrapExpectedWithArray , map } from '../../src/util/elementsUtil.js'
5+ import { elementFactory } from '../__mocks__/@wdio/globals.js'
56
67vi . mock ( '@wdio/globals' )
78
89describe ( 'elementsUtil' , ( ) => {
9- describe ( ' wrapExpectedWithArray' , ( ) => {
10+ describe ( wrapExpectedWithArray , ( ) => {
1011 test ( 'is not array ' , async ( ) => {
1112 const el = ( await $ ( 'sel' ) ) as unknown as WebdriverIO . Element
1213 const actual = wrapExpectedWithArray ( el , 'Test Actual' , 'Test Expected' )
@@ -19,4 +20,168 @@ describe('elementsUtil', () => {
1920 expect ( actual ) . toEqual ( [ 'Test Expected' ] )
2021 } )
2122 } )
23+
24+ describe ( awaitElements , ( ) => {
25+
26+ describe ( 'given single element' , ( ) => {
27+
28+ let element : WebdriverIO . Element
29+ let chainableElement : ChainablePromiseElement
30+
31+ beforeEach ( ( ) => {
32+ element = elementFactory ( 'element1' )
33+ chainableElement = $ ( 'element1' )
34+ } )
35+
36+ test ( 'should return undefined when received is undefined' , async ( ) => {
37+ const { elements, isSingleElement } = await awaitElements ( undefined )
38+
39+ expect ( elements ) . toBeUndefined ( )
40+ expect ( isSingleElement ) . toBe ( false )
41+ } )
42+
43+ test ( 'should return undefined when received is Promise of undefined (typing not supported)' , async ( ) => {
44+ const { elements, isSingleElement } = await awaitElements ( Promise . resolve ( undefined ) as any )
45+
46+ expect ( elements ) . toBeUndefined ( )
47+ expect ( isSingleElement ) . toBe ( false )
48+ } )
49+
50+ test ( 'should return single element when received is a non-awaited ChainableElement' , async ( ) => {
51+ const { elements, isSingleElement } = await awaitElements ( chainableElement )
52+
53+ expect ( elements ) . toHaveLength ( 1 )
54+ expect ( elements ?. [ 0 ] . selector ) . toEqual ( element . selector )
55+ expect ( isSingleElement ) . toBe ( true )
56+ } )
57+
58+ test ( 'should return single element when received is an awaited ChainableElement' , async ( ) => {
59+ const { elements, isSingleElement } = await awaitElements ( await chainableElement )
60+
61+ expect ( elements ) . toHaveLength ( 1 )
62+ expect ( elements ?. [ 0 ] . selector ) . toEqual ( element . selector )
63+ expect ( isSingleElement ) . toBe ( true )
64+ } )
65+
66+ test ( 'should return single element when received is getElement of non awaited ChainableElement (typing not supported)' , async ( ) => {
67+ const { elements, isSingleElement } = await awaitElements ( chainableElement . getElement ( ) as any )
68+
69+ expect ( elements ) . toHaveLength ( 1 )
70+ expect ( elements ?. [ 0 ] . selector ) . toEqual ( element . selector )
71+ expect ( isSingleElement ) . toBe ( true )
72+ } )
73+
74+ test ( 'should return single element when received is getElement of an awaited ChainableElement' , async ( ) => {
75+ const { elements, isSingleElement } = await awaitElements ( await chainableElement . getElement ( ) )
76+
77+ expect ( elements ) . toHaveLength ( 1 )
78+ expect ( elements ?. [ 0 ] . selector ) . toEqual ( element . selector )
79+ expect ( isSingleElement ) . toBe ( true )
80+ } )
81+
82+ test ( 'should return single element when received is WebdriverIO.Element' , async ( ) => {
83+ const { elements, isSingleElement } = await awaitElements ( element )
84+
85+ expect ( elements ) . toHaveLength ( 1 )
86+ expect ( elements ?. [ 0 ] . selector ) . toEqual ( element . selector )
87+ expect ( isSingleElement ) . toBe ( true )
88+ } )
89+ } )
90+
91+ describe ( 'given multiple elements' , ( ) => {
92+
93+ let element1 : WebdriverIO . Element
94+ let element2 : WebdriverIO . Element
95+ let elementArray : WebdriverIO . Element [ ]
96+ let chainableElementArray : ChainablePromiseArray
97+
98+ beforeEach ( ( ) => {
99+ element1 = elementFactory ( 'element1' )
100+ element2 = elementFactory ( 'element2' )
101+ elementArray = [ element1 , element2 ]
102+ chainableElementArray = $$ ( 'element1' )
103+ } )
104+
105+ test ( 'should return multiple elements when received is a non-awaited ChainableElementArray' , async ( ) => {
106+ const { elements, isSingleElement } = await awaitElements ( chainableElementArray )
107+
108+ expect ( elements ) . toHaveLength ( 2 )
109+ expect ( elements ) . toEqual ( expect . objectContaining ( [
110+ expect . objectContaining ( { selector : element1 . selector } ) ,
111+ expect . objectContaining ( { selector : element1 . selector } )
112+ ] ) )
113+ expect ( isSingleElement ) . toBe ( false )
114+ } )
115+
116+ test ( 'should return multiple elements when received is an awaited ChainableElementArray' , async ( ) => {
117+ const { elements, isSingleElement } = await awaitElements ( await chainableElementArray )
118+
119+ expect ( elements ) . toHaveLength ( 2 )
120+ expect ( elements ) . toEqual ( expect . objectContaining ( [
121+ expect . objectContaining ( { selector : element1 . selector } ) ,
122+ expect . objectContaining ( { selector : element1 . selector } )
123+ ] ) )
124+ expect ( isSingleElement ) . toBe ( false )
125+ } )
126+
127+ test ( 'should return multiple elements when received is getElements of non awaited ChainableElement (typing not supported)' , async ( ) => {
128+ const { elements, isSingleElement } = await awaitElements ( chainableElementArray . getElements ( ) as any )
129+
130+ expect ( elements ) . toHaveLength ( 2 )
131+ expect ( elements ) . toEqual ( expect . objectContaining ( [
132+ expect . objectContaining ( { selector : element1 . selector } ) ,
133+ expect . objectContaining ( { selector : element1 . selector } )
134+ ] ) )
135+ expect ( isSingleElement ) . toBe ( false )
136+ } )
137+
138+ test ( 'should return multiple elements when received is getElements of an awaited ChainableElementArray' , async ( ) => {
139+ const { elements, isSingleElement } = await awaitElements ( await chainableElementArray . getElements ( ) )
140+
141+ expect ( elements ) . toHaveLength ( 2 )
142+ expect ( elements ) . toEqual ( expect . objectContaining ( [
143+ expect . objectContaining ( { selector : element1 . selector } ) ,
144+ expect . objectContaining ( { selector : element1 . selector } )
145+ ] ) )
146+ expect ( isSingleElement ) . toBe ( false )
147+ } )
148+
149+ test ( 'should return multiple elements when received is WebdriverIO.Element[]' , async ( ) => {
150+ const { elements, isSingleElement } = await awaitElements ( elementArray )
151+
152+ expect ( elements ) . toHaveLength ( 2 )
153+ expect ( elements ) . toEqual ( expect . objectContaining ( [
154+ expect . objectContaining ( { selector : element1 . selector } ) ,
155+ expect . objectContaining ( { selector : element2 . selector } )
156+ ] ) )
157+ expect ( isSingleElement ) . toBe ( false )
158+ } )
159+ } )
160+
161+ } )
162+
163+ describe ( map , ( ) => {
164+ test ( 'should map elements of type Element[]' , async ( ) => {
165+ const elements : WebdriverIO . Element [ ] = [ elementFactory ( 'el1' ) , elementFactory ( 'el2' ) ]
166+ const command = vi . fn ( ) . mockResolvedValue ( 'mapped' )
167+
168+ const result = await map ( elements , command )
169+
170+ expect ( result ) . toEqual ( [ 'mapped' , 'mapped' ] )
171+ expect ( command ) . toHaveBeenCalledTimes ( 2 )
172+ expect ( command ) . toHaveBeenCalledWith ( elements [ 0 ] )
173+ expect ( command ) . toHaveBeenCalledWith ( elements [ 1 ] )
174+ } )
175+ test ( 'should map elements of type ElementArray' , async ( ) => {
176+ const elements : WebdriverIO . ElementArray = await $$ ( 'elements' ) . getElements ( )
177+ const command = vi . fn ( ) . mockResolvedValue ( 'mapped' )
178+
179+ const result = await map ( elements , command )
180+
181+ expect ( result ) . toEqual ( [ 'mapped' , 'mapped' ] )
182+ expect ( command ) . toHaveBeenCalledTimes ( 2 )
183+ expect ( command ) . toHaveBeenCalledWith ( elements [ 0 ] )
184+ expect ( command ) . toHaveBeenCalledWith ( elements [ 1 ] )
185+ } )
186+ } )
22187} )
0 commit comments