1- import { render , waitFor } from '@testing-library/react' ;
1+ import { render , waitFor , fireEvent , act } from '@testing-library/react' ;
22import React from 'react' ;
33import SourcesOfRevenueCircleChart from './sources-of-revenue-circle-chart' ;
44import userEvent from '@testing-library/user-event' ;
55import { sourcesOfRevenueCircleChartMatcher } from '../../../../explainer-helpers/government-revenue/government-revenue-test-helper' ;
66import { setGlobalFetchMatchingResponse } from '../../../../../../utils/mock-utils' ;
7+ import Analytics from '../../../../../../utils/analytics/analytics' ;
8+
9+ // Mock Analytics to track calls
10+ jest . mock ( '../../../../../../utils/analytics/analytics' , ( ) => ( {
11+ event : jest . fn ( ) ,
12+ } ) ) ;
713
814class ResizeObserver {
915 observe ( ) { }
@@ -13,10 +19,12 @@ class ResizeObserver {
1319
1420describe ( 'Circle chart' , ( ) => {
1521 window . ResizeObserver = ResizeObserver ;
22+
1623 beforeAll ( ( ) => {
1724 jest . spyOn ( console , 'warn' ) . mockImplementation ( ( ) => { } ) ;
1825 setGlobalFetchMatchingResponse ( jest , sourcesOfRevenueCircleChartMatcher ) ;
1926 } ) ;
27+
2028 afterAll ( ( ) => {
2129 jest . resetModules ( ) ;
2230 global . fetch . mockReset ( ) ;
@@ -66,4 +74,64 @@ describe('Circle chart', () => {
6674 expect ( await getByText ( 'corporate income taxes is $2.43 T' , { exact : false } ) ) . toBeInTheDocument ( ) ;
6775 await waitFor ( ( ) => expect ( getByText ( 'making up 11%' , { exact : false } ) ) . toBeInTheDocument ( ) ) ;
6876 } ) ;
77+
78+ it ( 'ignores keyboard interaction if key is not "Enter"' , async ( ) => {
79+ const { getAllByText, getByText } = render ( < SourcesOfRevenueCircleChart /> ) ;
80+ await waitFor ( ( ) => expect ( getByText ( 'Corporate' ) ) . toBeInTheDocument ( ) ) ;
81+
82+ const labelText = getByText ( 'Corporate' ) . closest ( 'text' ) ;
83+ labelText . focus ( ) ;
84+
85+ fireEvent . keyPress ( labelText , { key : 'A' , code : 'KeyA' } ) ;
86+
87+ expect ( await getAllByText ( 'Individual Income Taxes' ) ) . toHaveLength ( 2 ) ;
88+ } ) ;
89+
90+ it ( 'updates the header on keyboard "Enter" interaction with a label' , async ( ) => {
91+ const { getAllByText, getByText } = render ( < SourcesOfRevenueCircleChart /> ) ;
92+ await waitFor ( ( ) => expect ( getByText ( 'Corporate' ) ) . toBeInTheDocument ( ) ) ;
93+
94+ const labelText = getByText ( 'Corporate' ) . closest ( 'text' ) ;
95+
96+ labelText . focus ( ) ;
97+ fireEvent . keyPress ( labelText , { key : 'Enter' , code : 'Enter' , charCode : 13 } ) ;
98+
99+ expect ( await getAllByText ( 'Corporate Income Taxes' , { exact : false } ) ) . toHaveLength ( 2 ) ;
100+ } ) ;
101+
102+ it ( 'resets the chart to default view when mouse leaves the chart area' , async ( ) => {
103+ const { getAllByText, getByText, getByTestId, getByRole } = render ( < SourcesOfRevenueCircleChart /> ) ;
104+ await waitFor ( ( ) => expect ( getByText ( 'Corporate' ) ) . toBeInTheDocument ( ) ) ;
105+
106+ const corporateIncomeTaxesCircle = getByRole ( 'img' ) . children [ 1 ] . children [ 1 ] ;
107+ userEvent . hover ( corporateIncomeTaxesCircle ) ;
108+ expect ( await getAllByText ( 'Corporate Income Taxes' , { exact : false } ) ) . toHaveLength ( 3 ) ;
109+
110+ const chartParent = getByTestId ( 'chartParent' ) ;
111+ userEvent . unhover ( chartParent ) ;
112+
113+ expect ( await getAllByText ( 'Individual Income Taxes' ) ) . toHaveLength ( 2 ) ;
114+ } ) ;
115+
116+ it ( 'tracks analytics event on chart hover' , async ( ) => {
117+ jest . useFakeTimers ( ) ;
118+ const { getByTestId, getByText } = render ( < SourcesOfRevenueCircleChart /> ) ;
119+ await waitFor ( ( ) => expect ( getByText ( 'Corporate' ) ) . toBeInTheDocument ( ) ) ;
120+
121+ const chartParent = getByTestId ( 'chartParent' ) ;
122+
123+ fireEvent . mouseEnter ( chartParent ) ;
124+
125+ act ( ( ) => {
126+ jest . advanceTimersByTime ( 3100 ) ;
127+ } ) ;
128+
129+ expect ( Analytics . event ) . toHaveBeenCalledWith ( {
130+ category : 'Explainers' ,
131+ action : 'Chart Hover' ,
132+ label : 'Revenue - Sources of Federal Revenue' ,
133+ } ) ;
134+
135+ jest . useRealTimers ( ) ;
136+ } ) ;
69137} ) ;
0 commit comments