@@ -10,36 +10,47 @@ describe('ErrorSummary', () => {
1010 } ) ;
1111
1212 it ( 'forwards refs' , ( ) => {
13- const ref = createRef < HTMLDivElement > ( ) ;
14- render ( < ErrorSummary ref = { ref } /> ) ;
13+ const inputRef = createRef < HTMLDivElement > ( ) ;
14+ const { container } = render ( < ErrorSummary ref = { inputRef } /> ) ;
1515
16- expect ( ref . current ) . not . toBeNull ( ) ;
16+ const errorSummaryEl = container . querySelector ( 'div' ) ;
17+
18+ expect ( inputRef . current ) . toBe ( errorSummaryEl ) ;
1719 } ) ;
1820
19- it ( 'has default props ' , ( ) => {
21+ it ( 'is focused automatically ' , ( ) => {
2022 const { container } = render ( < ErrorSummary /> ) ;
2123
22- expect ( container . querySelector ( 'div' ) ?. getAttribute ( 'tabindex' ) ) . toBe ( '-1' ) ;
23- expect ( container . querySelector ( 'div' ) ?. getAttribute ( 'role' ) ) . toBe ( 'alert' ) ;
24- expect ( container . querySelector ( 'div' ) ?. getAttribute ( 'aria-labelledby' ) ) . toBe (
25- 'error-summary-title' ,
26- ) ;
24+ const errorSummaryEl = container . querySelector ( 'div' ) ;
25+
26+ expect ( document . activeElement ) . toBe ( errorSummaryEl ) ;
2727 } ) ;
2828
29- it ( 'throws a dev warning if tabIndex is not -1' , ( ) => {
30- jest . spyOn ( console , 'warn' ) . mockImplementation ( ( ) => { } ) ;
31- render ( < ErrorSummary tabIndex = { 0 } /> ) ;
32- expect ( console . warn ) . toHaveBeenCalledWith (
33- 'The ErrorSummary component should always have a tabIndex of -1' ,
34- ) ;
29+ it ( 'is focused automatically with forwarded ref' , ( ) => {
30+ const inputRef = createRef < HTMLDivElement > ( ) ;
31+ const { container } = render ( < ErrorSummary ref = { inputRef } /> ) ;
32+
33+ const errorSummaryEl = container . querySelector ( 'div' ) ;
34+
35+ expect ( document . activeElement ) . toBe ( errorSummaryEl ) ;
3536 } ) ;
3637
37- it ( 'throws a dev warning if role is not alert' , ( ) => {
38- jest . spyOn ( console , 'warn' ) . mockImplementation ( ( ) => { } ) ;
39- render ( < ErrorSummary role = "status" /> ) ;
40- expect ( console . warn ) . toHaveBeenCalledWith (
41- 'The ErrorSummary component should always have a role of alert' ,
42- ) ;
38+ it ( 'has default props' , ( ) => {
39+ const { container } = render ( < ErrorSummary /> ) ;
40+
41+ const errorSummaryEl = container . querySelector ( 'div' ) ;
42+
43+ expect ( errorSummaryEl ?. getAttribute ( 'tabindex' ) ) . toBe ( '-1' ) ;
44+ expect ( errorSummaryEl ?. firstElementChild ?. getAttribute ( 'role' ) ) . toBe ( 'alert' ) ;
45+ } ) ;
46+
47+ it ( 'has default props with forwarded ref' , ( ) => {
48+ const { container } = render ( < ErrorSummary /> ) ;
49+
50+ const errorSummaryEl = container . querySelector ( 'div' ) ;
51+
52+ expect ( errorSummaryEl ?. getAttribute ( 'tabindex' ) ) . toBe ( '-1' ) ;
53+ expect ( errorSummaryEl ?. firstElementChild ?. getAttribute ( 'role' ) ) . toBe ( 'alert' ) ;
4354 } ) ;
4455
4556 describe ( 'ErrorSummary.Title' , ( ) => {
@@ -52,44 +63,117 @@ describe('ErrorSummary', () => {
5263 it ( 'renders a title' , ( ) => {
5364 const { container } = render ( < ErrorSummary . Title > Title</ ErrorSummary . Title > ) ;
5465
55- expect ( container . textContent ) . toBe ( 'Title' ) ;
66+ expect ( container ) . toHaveTextContent ( 'Title' ) ;
5667 } ) ;
5768 } ) ;
5869
59- describe ( 'ErrorSummary.Body ' , ( ) => {
70+ describe ( 'ErrorSummary.List ' , ( ) => {
6071 it ( 'matches snapshot' , ( ) => {
61- const { container } = render ( < ErrorSummary . Body > Body</ ErrorSummary . Body > ) ;
72+ const { container } = render (
73+ < ErrorSummary >
74+ < ErrorSummary . List > List</ ErrorSummary . List >
75+ </ ErrorSummary > ,
76+ ) ;
6277
63- expect ( container . textContent ) . toBe ( 'Body' ) ;
64- expect ( container ) . toMatchSnapshot ( 'ErrorSummary.Body' ) ;
78+ const errorListEl = container . querySelector ( 'ul' ) ;
79+
80+ expect ( errorListEl ) . toMatchSnapshot ( 'ErrorSummary.List' ) ;
6581 } ) ;
66- } ) ;
6782
68- describe ( 'ErrorSummary.List' , ( ) => {
69- it ( 'matches snapshot' , ( ) => {
70- const { container } = render ( < ErrorSummary . List > List</ ErrorSummary . List > ) ;
83+ it ( 'renders children' , ( ) => {
84+ const { container } = render (
85+ < ErrorSummary >
86+ < ErrorSummary . List > List</ ErrorSummary . List >
87+ </ ErrorSummary > ,
88+ ) ;
89+
90+ const errorListEl = container . querySelector ( 'ul' ) ;
7191
72- expect ( container ) . toMatchSnapshot ( 'ErrorSummary. List') ;
92+ expect ( errorListEl ) . toHaveTextContent ( ' List') ;
7393 } ) ;
7494
75- it ( 'renders children' , ( ) => {
76- const { container } = render ( < ErrorSummary . List > List</ ErrorSummary . List > ) ;
95+ it ( 'skips render without children' , ( ) => {
96+ const { container } = render (
97+ < ErrorSummary >
98+ < ErrorSummary . List />
99+ </ ErrorSummary > ,
100+ ) ;
101+
102+ const errorListEl = container . querySelector ( 'ul' ) ;
77103
78- expect ( container . textContent ) . toBe ( 'List' ) ;
104+ expect ( errorListEl ) . toBeNull ( ) ;
79105 } ) ;
80106 } ) ;
81107
82108 describe ( 'ErrorSummary.ListItem' , ( ) => {
83- it ( 'matches snapshot' , ( ) => {
84- const { container } = render ( < ErrorSummary . Item > ListItem</ ErrorSummary . Item > ) ;
109+ it ( 'matches snapshot for items without links' , ( ) => {
110+ const { container } = render (
111+ < ErrorSummary >
112+ < ErrorSummary . List >
113+ < ErrorSummary . ListItem > List item without link</ ErrorSummary . ListItem >
114+ </ ErrorSummary . List >
115+ </ ErrorSummary > ,
116+ ) ;
117+
118+ const errorListEl = container . querySelector ( 'ul' ) ;
119+
120+ expect ( errorListEl ) . toMatchSnapshot ( ) ;
121+ } ) ;
122+
123+ it ( 'matches snapshot for items with links' , ( ) => {
124+ const { container } = render (
125+ < ErrorSummary >
126+ < ErrorSummary . List >
127+ < ErrorSummary . ListItem href = "#example-error-1" >
128+ List item with link
129+ </ ErrorSummary . ListItem >
130+ </ ErrorSummary . List >
131+ </ ErrorSummary > ,
132+ ) ;
133+
134+ const errorListEl = container . querySelector ( 'ul' ) ;
85135
86- expect ( container ) . toMatchSnapshot ( 'ErrorSummary.ListItem' ) ;
136+ expect ( errorListEl ) . toMatchSnapshot ( ) ;
87137 } ) ;
88138
89139 it ( 'renders children' , ( ) => {
90- const { container } = render ( < ErrorSummary . Item > ListItem</ ErrorSummary . Item > ) ;
140+ const { container } = render (
141+ < ErrorSummary >
142+ < ErrorSummary . List >
143+ < ErrorSummary . ListItem href = "#example-error-1" >
144+ List item with link 1
145+ </ ErrorSummary . ListItem >
146+ < ErrorSummary . ListItem href = "#example-error-2" >
147+ List item with link 2
148+ </ ErrorSummary . ListItem >
149+ </ ErrorSummary . List >
150+ </ ErrorSummary > ,
151+ ) ;
152+
153+ const errorListEl = container . querySelector ( 'ul' ) ;
154+ const errorLinkEls = errorListEl ?. querySelectorAll ( 'a' ) ;
155+
156+ expect ( errorLinkEls ?. [ 0 ] ) . toHaveTextContent ( 'List item with link 1' ) ;
157+ expect ( errorLinkEls ?. [ 0 ] ) . toHaveAttribute ( 'href' , '#example-error-1' ) ;
158+
159+ expect ( errorLinkEls ?. [ 1 ] ) . toHaveTextContent ( 'List item with link 2' ) ;
160+ expect ( errorLinkEls ?. [ 1 ] ) . toHaveAttribute ( 'href' , '#example-error-2' ) ;
161+ } ) ;
162+
163+ it ( 'skips render without children' , ( ) => {
164+ const { container } = render (
165+ < ErrorSummary >
166+ < ErrorSummary . List >
167+ < ErrorSummary . ListItem />
168+ </ ErrorSummary . List >
169+ </ ErrorSummary > ,
170+ ) ;
171+
172+ const errorListEl = container . querySelector ( 'ul' ) ;
173+ const errorListItemEls = errorListEl ?. querySelectorAll ( 'li' ) ;
91174
92- expect ( container . querySelector ( 'a' ) ?. textContent ) . toBe ( 'ListItem' ) ;
175+ expect ( errorListEl ) . toHaveTextContent ( '' ) ;
176+ expect ( errorListItemEls ) . toHaveLength ( 0 ) ;
93177 } ) ;
94178 } ) ;
95179} ) ;
0 commit comments