1- import { render , screen } from '@testing-library/react' ;
1+ import { buildQueries , getByRole , render , screen , within } from '@testing-library/react' ;
22import React , { useEffect , useState } from 'react' ;
33import { setupMockComponent , getByMockComponent } from './index' ;
44import { findAllByMockComponent , findByMockComponent , getAllByMockComponent , queryAllByMockComponent , queryByMockComponent } from './queries' ;
@@ -64,7 +64,7 @@ it('should find via getAllByMockComponent', () => {
6464 expect ( all ) . toHaveLength ( 2 ) ;
6565 expect ( all [ 0 ] ) . toBeInTheDocument ( ) ;
6666 expect ( all [ 1 ] ) . toBeInTheDocument ( ) ;
67- expect ( all [ 0 ] ) . not . toBe ( all [ 2 ] ) ;
67+ expect ( all [ 0 ] ) . not . toBe ( all [ 1 ] ) ;
6868} ) ;
6969
7070it ( 'should find via queryByMockComponent' , ( ) => {
@@ -122,3 +122,114 @@ it('should find via findAllByMockComponent', async () => {
122122 expect ( all [ 1 ] ) . toBeInTheDocument ( ) ;
123123 expect ( all [ 0 ] ) . not . toBe ( all [ 2 ] ) ;
124124} ) ;
125+
126+ describe ( 'Searching within a containing element' , ( ) => {
127+ it ( 'should find within an element via getByMockComponent' , ( ) => {
128+ render (
129+ < ul > { [ 'A' , 'B' ] . map ( value => < li key = { value } > < MockedComponent value = { value } /> </ li > ) } </ ul >
130+ ) ;
131+
132+ const container = screen . getAllByRole ( 'listitem' ) [ 0 ] ;
133+ expect ( getByMockComponent ( MockedComponent , { container} ) . props . value ) . toEqual ( 'A' ) ;
134+ } ) ;
135+
136+ it ( 'should find within an element via getAllByMockComponent' , ( ) => {
137+ render (
138+ < ul > { [ 'A' , 'B' ] . map ( value =>
139+ < li key = { value } >
140+ < MockedComponent value = { value } />
141+ < MockedComponent value = { value } />
142+ </ li > ) }
143+ </ ul >
144+ ) ;
145+
146+ const container = screen . getAllByRole ( 'listitem' ) [ 0 ] ;
147+ const all = getAllByMockComponent ( MockedComponent , { container} ) ;
148+ expect ( all ) . toHaveLength ( 2 ) ;
149+ expect ( all [ 0 ] . props . value ) . toEqual ( 'A' ) ;
150+ expect ( all [ 1 ] . props . value ) . toEqual ( 'A' ) ;
151+ expect ( all [ 0 ] ) . not . toBe ( all [ 1 ] ) ;
152+ } ) ;
153+
154+ it ( 'should find within an element via queryByMockComponent' , ( ) => {
155+ render (
156+ < ul > { [ 'A' , 'B' ] . map ( value =>
157+ < li key = { value } >
158+ < MockedComponent value = { value } />
159+ </ li > ) }
160+ </ ul >
161+ ) ;
162+
163+ const container = screen . getAllByRole ( 'listitem' ) [ 0 ] ;
164+ expect ( queryByMockComponent ( MockedComponent , { container} ) ?. props . value ) . toEqual ( 'A' ) ;
165+ } ) ;
166+
167+ it ( 'should find within an element via queryAllByMockComponent' , ( ) => {
168+ render (
169+ < ul > { [ 'A' , 'B' ] . map ( value =>
170+ < li key = { value } >
171+ < TestedComponent value = { value } />
172+ < TestedComponent value = { value } />
173+ </ li > ) }
174+ </ ul >
175+ ) ;
176+
177+ const container = screen . getAllByRole ( 'listitem' ) [ 0 ] ;
178+ const all = queryAllByMockComponent ( MockedComponent , { container} ) ;
179+ expect ( all ) . toHaveLength ( 2 ) ;
180+ expect ( all [ 0 ] ) . toBeInTheDocument ( ) ;
181+ expect ( all [ 1 ] ) . toBeInTheDocument ( ) ;
182+ expect ( all [ 0 ] ) . not . toBe ( all [ 1 ] ) ;
183+ } ) ;
184+
185+ it ( 'should find within an element via findByMockComponent' , async ( ) => {
186+ const TimedFunction = ( ) => {
187+ const [ visible , setVisible ] = useState ( false ) ;
188+ useEffect ( ( ) => {
189+ const handle = setTimeout ( ( ) => setVisible ( true ) , 10 ) ;
190+ return ( ) => clearTimeout ( handle ) ;
191+ } , [ ] ) ;
192+ return < div > { visible && < MockedComponent value = '' /> } </ div > ;
193+ } ;
194+ render (
195+ < ul > { [ 'A' , 'B' ] . map ( value =>
196+ < li key = { value } >
197+ < TimedFunction />
198+ </ li > ) }
199+ </ ul >
200+ ) ;
201+
202+ const container = screen . getAllByRole ( 'listitem' ) [ 0 ] ;
203+ expect ( await findByMockComponent ( MockedComponent , { container} ) ) . toBeInTheDocument ( ) ;
204+ } ) ;
205+
206+ it ( 'should find within an element via findAllByMockComponent' , async ( ) => {
207+ const TimedFunction = ( ) => {
208+ const [ visible , setVisible ] = useState ( false ) ;
209+ useEffect ( ( ) => {
210+ const handle = setTimeout ( ( ) => setVisible ( true ) , 10 ) ;
211+ return ( ) => clearTimeout ( handle ) ;
212+ } , [ ] ) ;
213+ return (
214+ < div >
215+ { visible && < span > < MockedComponent value = '' /> < MockedComponent value = '' /> </ span > }
216+ </ div >
217+ ) ;
218+ } ;
219+ render (
220+ < ul > { [ 'A' , 'B' ] . map ( value =>
221+ < li key = { value } >
222+ < TimedFunction />
223+ < TimedFunction />
224+ </ li > ) }
225+ </ ul >
226+ ) ;
227+
228+ const container = screen . getAllByRole ( 'listitem' ) [ 0 ] ;
229+ const all = await findAllByMockComponent ( MockedComponent , { container} ) ;
230+ expect ( all ) . toHaveLength ( 2 ) ;
231+ expect ( all [ 0 ] ) . toBeInTheDocument ( ) ;
232+ expect ( all [ 1 ] ) . toBeInTheDocument ( ) ;
233+ expect ( all [ 0 ] ) . not . toBe ( all [ 1 ] ) ;
234+ } ) ;
235+ } ) ;
0 commit comments