@@ -14,30 +14,9 @@ style.setProperty = setProperty
1414
1515describe ( 'new ThemeContext(defaultTheme)' , ( ) => {
1616 const themeContext = new ThemeContext ( defaultTheme )
17- let rendered : ReturnType < typeof render >
1817
1918 beforeEach ( ( ) => {
2019 setProperty . mockReset ( )
21-
22- const App = ( ) => {
23- themeContext . useLayoutEffect ( )
24- const [ theme , setTheme ] = themeContext . use ( )
25- return (
26- < button
27- onClick = { ( ) => {
28- setTheme ( { primaryColor : 'blue' } )
29- } }
30- >
31- { theme . primaryColor }
32- </ button >
33- )
34- }
35-
36- rendered = render (
37- < themeContext . Provider >
38- < App />
39- </ themeContext . Provider > ,
40- )
4120 } )
4221
4322 afterAll ( ( ) => {
@@ -52,25 +31,73 @@ describe('new ThemeContext(defaultTheme)', () => {
5231
5332 describe ( '#Provider' , ( ) => {
5433 it ( 'provides a theme' , ( ) => {
34+ const rendered = renderApp ( )
35+
5536 expect ( rendered . getByText ( 'red' ) ) . toBeDefined ( )
5637 } )
5738 } )
5839
5940 describe ( '#use' , ( ) => {
6041 it ( 'returns [theme, setTheme], which respectively gets and sets the theme' , ( ) => {
42+ const rendered = renderApp ( )
43+
6144 fireEvent . click ( rendered . getByText ( 'red' ) as HTMLElement )
45+
6246 expect ( rendered . getByText ( 'blue' ) ) . toBeDefined ( )
6347 } )
6448 } )
6549
6650 describe ( '#useLayoutEffect' , ( ) => {
6751 it ( 'sets a CSS custom property on the root document element' , ( ) => {
52+ renderApp ( )
53+
6854 expect ( setProperty ) . toHaveBeenCalledWith ( '--primary-color' , 'red' )
6955 } )
7056
7157 it ( 'updates the custom property when the theme changes' , ( ) => {
58+ const rendered = renderApp ( )
59+
7260 fireEvent . click ( rendered . getByText ( 'red' ) as HTMLElement )
61+
7362 expect ( setProperty ) . toHaveBeenCalledWith ( '--primary-color' , 'blue' )
7463 } )
64+
65+ it ( 'sets class names on provided element' , ( ) => {
66+ const element = document . createElement ( 'html' )
67+
68+ renderApp ( { element, classNames : [ 'foo' , 'bar' ] } )
69+
70+ expect ( element . className ) . toEqual ( 'foo bar' )
71+ } )
7572 } )
73+
74+ function renderApp ( {
75+ element,
76+ classNames,
77+ } : {
78+ element ?: HTMLElement
79+ classNames ?: string [ ]
80+ } = { } ) {
81+ const App = ( ) => {
82+ themeContext . useLayoutEffect (
83+ element || classNames ? { element, classNames } : undefined ,
84+ )
85+ const [ theme , setTheme ] = themeContext . use ( )
86+ return (
87+ < button
88+ onClick = { ( ) => {
89+ setTheme ( { primaryColor : 'blue' } )
90+ } }
91+ >
92+ { theme . primaryColor }
93+ </ button >
94+ )
95+ }
96+
97+ return render (
98+ < themeContext . Provider >
99+ < App />
100+ </ themeContext . Provider > ,
101+ )
102+ }
76103} )
0 commit comments