@@ -74,32 +74,76 @@ describe('EuiThemeProvider', () => {
7474
7575 expect ( getByText ( 'Modified' ) ) . toHaveStyleRule ( 'color' , 'hotpink' ) ;
7676 } ) ;
77+ } ) ;
7778
78- it ( 'sets a conditional CurrentEuiBreakpointProvider if modify.breakpoint is passed' , ( ) => {
79- window . innerWidth = 2500 ;
80- const customBreakpoints = { xxl : 2000 } ;
81- const PrintCurrentBreakpoint = ( ) => < > { useCurrentEuiBreakpoint ( ) } </ > ;
79+ describe ( 'conditional CurrentEuiBreakpointProvider' , ( ) => {
80+ const PrintCurrentBreakpoint = ( ) => < > { useCurrentEuiBreakpoint ( ) } </ > ;
81+ let resizeListenerCount = 0 ;
8282
83- const { container, rerender } = render (
84- < EuiThemeProvider modify = { { breakpoint : customBreakpoints } } >
85- < PrintCurrentBreakpoint />
86- </ EuiThemeProvider >
87- ) ;
83+ beforeAll ( ( ) => {
84+ // React 16 and 17 register a bunch of error listeners which we don't need to capture
85+ window . addEventListener = jest . fn ( ( event : string ) => {
86+ if ( event === 'resize' ) resizeListenerCount ++ ;
87+ } ) ;
88+ } ) ;
8889
89- expect ( container . textContent ) . toEqual ( 'xxl' ) ;
90+ beforeEach ( ( ) => {
91+ // Reset counts
92+ resizeListenerCount = 0 ;
93+ } ) ;
9094
91- // Does nothing if no modify.breakpoint is passed
92- const eventListenerSpy = jest . spyOn ( window , 'addEventListener' ) ;
93- rerender (
94- < EuiThemeProvider >
95- < PrintCurrentBreakpoint />
96- </ EuiThemeProvider >
97- ) ;
98- expect ( eventListenerSpy ) . not . toHaveBeenCalledWith ( 'resize' ) ;
99- expect ( container . textContent ) . toEqual ( 'xl' ) ;
95+ afterAll ( ( ) => {
96+ jest . restoreAllMocks ( ) ;
97+ } ) ;
10098
101- // Reset window width to jsdom's default
102- window . innerWidth = 1024 ;
99+ describe ( 'in the top-level global theme provider' , ( ) => {
100+ it ( 'is always rendered regardless of modified breakpoints' , ( ) => {
101+ const { container } = render (
102+ < EuiProvider >
103+ < PrintCurrentBreakpoint />
104+ </ EuiProvider >
105+ ) ;
106+ expect ( container . textContent ) . toEqual ( 'l' ) ;
107+ expect ( resizeListenerCount ) . toEqual ( 1 ) ;
108+ } ) ;
109+ } ) ;
110+
111+ describe ( 'in nested child theme providers' , ( ) => {
112+ beforeAll ( ( ) => {
113+ window . innerWidth = 2500 ;
114+ } ) ;
115+
116+ afterAll ( ( ) => {
117+ // Reset window width to jsdom's default
118+ window . innerWidth = 1024 ;
119+ } ) ;
120+
121+ it ( 'is rendered if modify.breakpoint is passed' , ( ) => {
122+ const customBreakpoints = { xxl : 2000 } ;
123+
124+ const { container } = render (
125+ < EuiProvider >
126+ < EuiThemeProvider modify = { { breakpoint : customBreakpoints } } >
127+ < PrintCurrentBreakpoint />
128+ </ EuiThemeProvider >
129+ </ EuiProvider >
130+ ) ;
131+
132+ expect ( container . textContent ) . toEqual ( 'xxl' ) ;
133+ expect ( resizeListenerCount ) . toBeGreaterThanOrEqual ( 2 ) ; // Technically 3 due to EuiThemeProvider rerendering
134+ } ) ;
135+
136+ it ( 'is not rendered if modify.breakpoint is not passed' , ( ) => {
137+ const { container } = render (
138+ < EuiProvider >
139+ < EuiThemeProvider >
140+ < PrintCurrentBreakpoint />
141+ </ EuiThemeProvider >
142+ </ EuiProvider >
143+ ) ;
144+ expect ( container . textContent ) . toEqual ( 'xl' ) ;
145+ expect ( resizeListenerCount ) . toEqual ( 1 ) ;
146+ } ) ;
103147 } ) ;
104148 } ) ;
105149
0 commit comments