1- /* global jest, test, describe, it, expect */
1+ /* global jest, test, describe, it, expect, beforeEach, afterEach */
22
33import React from 'react' ;
4- import { render } from '@testing-library/react' ;
4+ import { render , screen , fireEvent } from '@testing-library/react' ;
55import IntroScreen from '../IntroScreen' ;
66
77test ( 'IntroScreen renders when show is true' , ( ) => {
@@ -25,3 +25,189 @@ test('IntroScreen does not render when show is false', () => {
2525 ) ;
2626 expect ( container . querySelector ( '.campaign-info' ) ) . toBeNull ( ) ;
2727} ) ;
28+
29+ test ( 'IntroScreen close button calls onClose handler' , ( ) => {
30+ const onClose = jest . fn ( ) ;
31+ const { container } = render (
32+ < IntroScreen
33+ show
34+ onClose = { onClose }
35+ />
36+ ) ;
37+ const closeButton = container . querySelector ( '.campaign-info__close' ) ;
38+ fireEvent . click ( closeButton ) ;
39+ expect ( onClose ) . toHaveBeenCalledTimes ( 1 ) ;
40+ } ) ;
41+
42+ test ( 'IntroScreen close button passes event to onClose handler' , ( ) => {
43+ const onClose = jest . fn ( ) ;
44+ const { container } = render (
45+ < IntroScreen
46+ show
47+ onClose = { onClose }
48+ />
49+ ) ;
50+ const closeButton = container . querySelector ( '.campaign-info__close' ) ;
51+ fireEvent . click ( closeButton ) ;
52+ expect ( onClose . mock . calls [ 0 ] [ 0 ] ) . toBeDefined ( ) ;
53+ expect ( onClose . mock . calls [ 0 ] [ 0 ] . type ) . toBe ( 'click' ) ;
54+ } ) ;
55+
56+ test ( 'IntroScreen renders info section header' , ( ) => {
57+ render (
58+ < IntroScreen
59+ show
60+ onClose = { ( ) => { } }
61+ />
62+ ) ;
63+ expect ( screen . getByText ( 'How do campaigns work?' ) ) . not . toBeNull ( ) ;
64+ } ) ;
65+
66+ test ( 'IntroScreen renders info section content text' , ( ) => {
67+ render (
68+ < IntroScreen
69+ show
70+ onClose = { ( ) => { } }
71+ />
72+ ) ;
73+ expect ( screen . getByText ( / C a m p a i g n s a l l o w m u l t i p l e u s e r s t o p u b l i s h l a r g e a m o u n t s o f c o n t e n t / ) ) . not . toBeNull ( ) ;
74+ } ) ;
75+
76+ test ( 'IntroScreen renders banner image element' , ( ) => {
77+ const { container } = render (
78+ < IntroScreen
79+ show
80+ onClose = { ( ) => { } }
81+ />
82+ ) ;
83+ expect ( container . querySelector ( '.campaign-info__banner-image' ) ) . not . toBeNull ( ) ;
84+ } ) ;
85+
86+ test ( 'IntroScreen renders help icon' , ( ) => {
87+ const { container } = render (
88+ < IntroScreen
89+ show
90+ onClose = { ( ) => { } }
91+ />
92+ ) ;
93+ const icon = container . querySelector ( '.font-icon-white-question' ) ;
94+ expect ( icon ) . not . toBeNull ( ) ;
95+ expect ( icon . getAttribute ( 'aria-hidden' ) ) . toBe ( 'true' ) ;
96+ } ) ;
97+
98+ test ( 'IntroScreen close button has correct accessibility attributes' , ( ) => {
99+ const { container } = render (
100+ < IntroScreen
101+ show
102+ onClose = { ( ) => { } }
103+ />
104+ ) ;
105+ const closeButton = container . querySelector ( '.campaign-info__close' ) ;
106+ expect ( closeButton . getAttribute ( 'aria-label' ) ) . toBe ( 'Hide help' ) ;
107+ expect ( closeButton . getAttribute ( 'aria-expanded' ) ) . toBe ( 'true' ) ;
108+ expect ( closeButton . getAttribute ( 'aria-controls' ) ) . toBe ( 'campaign-info' ) ;
109+ } ) ;
110+
111+ test ( 'IntroScreen close button has correct CSS classes' , ( ) => {
112+ const { container } = render (
113+ < IntroScreen
114+ show
115+ onClose = { ( ) => { } }
116+ />
117+ ) ;
118+ const closeButton = container . querySelector ( '.campaign-info__close' ) ;
119+ expect ( closeButton . classList . contains ( 'btn' ) ) . toBe ( true ) ;
120+ expect ( closeButton . classList . contains ( 'campaign-info__close' ) ) . toBe ( true ) ;
121+ expect ( closeButton . classList . contains ( 'btn--no-text' ) ) . toBe ( true ) ;
122+ expect ( closeButton . classList . contains ( 'font-icon-cancel' ) ) . toBe ( true ) ;
123+ expect ( closeButton . classList . contains ( 'btn--icon-xl' ) ) . toBe ( true ) ;
124+ } ) ;
125+
126+ test ( 'IntroScreen renders content container with correct class' , ( ) => {
127+ const { container } = render (
128+ < IntroScreen
129+ show
130+ onClose = { ( ) => { } }
131+ />
132+ ) ;
133+ expect ( container . querySelector ( '.campaign-info__content' ) ) . not . toBeNull ( ) ;
134+ } ) ;
135+
136+ test ( 'IntroScreen renders flexbox-area-grow class on content' , ( ) => {
137+ const { container } = render (
138+ < IntroScreen
139+ show
140+ onClose = { ( ) => { } }
141+ />
142+ ) ;
143+ const content = container . querySelector ( '.campaign-info__content' ) ;
144+ expect ( content . classList . contains ( 'flexbox-area-grow' ) ) . toBe ( true ) ;
145+ } ) ;
146+
147+ test ( 'IntroScreen renders links container' , ( ) => {
148+ const { container } = render (
149+ < IntroScreen
150+ show
151+ onClose = { ( ) => { } }
152+ />
153+ ) ;
154+ expect ( container . querySelector ( '.campaign-info__links' ) ) . not . toBeNull ( ) ;
155+ } ) ;
156+
157+ test ( 'IntroScreen renders content buttons container' , ( ) => {
158+ const { container } = render (
159+ < IntroScreen
160+ show
161+ onClose = { ( ) => { } }
162+ />
163+ ) ;
164+ expect ( container . querySelector ( '.campaign-info__content-buttons' ) ) . not . toBeNull ( ) ;
165+ } ) ;
166+
167+ test ( 'IntroScreen main container has correct id' , ( ) => {
168+ const { container } = render (
169+ < IntroScreen
170+ show
171+ onClose = { ( ) => { } }
172+ />
173+ ) ;
174+ expect ( container . querySelector ( '#campaign-info' ) ) . not . toBeNull ( ) ;
175+ } ) ;
176+
177+ test ( 'IntroScreen renders with default props when not provided' , ( ) => {
178+ const { container } = render ( < IntroScreen /> ) ;
179+ expect ( container . querySelector ( '.campaign-info' ) ) . toBeNull ( ) ;
180+ } ) ;
181+
182+ test ( 'IntroScreen has default onClose handler that does nothing' , ( ) => {
183+ const { container } = render (
184+ < IntroScreen show />
185+ ) ;
186+ const closeButton = container . querySelector ( '.campaign-info__close' ) ;
187+ expect ( ( ) => {
188+ fireEvent . click ( closeButton ) ;
189+ } ) . not . toThrow ( ) ;
190+ } ) ;
191+
192+ test ( 'IntroScreen close button is not focused by default' , ( ) => {
193+ const { container } = render (
194+ < IntroScreen
195+ show
196+ onClose = { ( ) => { } }
197+ focusCloseButton = { false }
198+ />
199+ ) ;
200+ const closeButton = container . querySelector ( '.campaign-info__close' ) ;
201+ expect ( document . activeElement ) . not . toBe ( closeButton ) ;
202+ } ) ;
203+
204+ test ( 'IntroScreen renders header with h3 tag' , ( ) => {
205+ const { container } = render (
206+ < IntroScreen
207+ show
208+ onClose = { ( ) => { } }
209+ />
210+ ) ;
211+ const heading = container . querySelector ( '.campaign-info__content h3' ) ;
212+ expect ( heading ) . not . toBeNull ( ) ;
213+ } ) ;
0 commit comments