1+ import React from 'react' ;
2+ import { render , screen , waitFor , act } from '@testing-library/react' ;
3+ import { CenteredTypewriter } from '../CenteredTypewriter' ;
4+
5+ jest . useFakeTimers ( ) ;
6+
7+ describe ( 'CenteredTypewriter' , ( ) => {
8+ beforeEach ( ( ) => {
9+ jest . clearAllTimers ( ) ;
10+ } ) ;
11+
12+ it ( 'renders with default props' , ( ) => {
13+ const originalMatchMedia = window . matchMedia ;
14+ window . matchMedia = jest . fn ( ) . mockImplementation ( query => ( {
15+ matches : false ,
16+ media : query ,
17+ onchange : null ,
18+ addListener : jest . fn ( ) ,
19+ removeListener : jest . fn ( ) ,
20+ addEventListener : jest . fn ( ) ,
21+ removeEventListener : jest . fn ( ) ,
22+ dispatchEvent : jest . fn ( ) ,
23+ } ) ) ;
24+
25+ render ( < CenteredTypewriter text = "Hello World" /> ) ;
26+ expect ( screen . getByTestId ( 'typewriter-container' ) ) . toBeInTheDocument ( ) ;
27+
28+ window . matchMedia = originalMatchMedia ;
29+ } ) ;
30+
31+ it ( 'types out text character by character' , async ( ) => {
32+ const originalMatchMedia = window . matchMedia ;
33+ window . matchMedia = jest . fn ( ) . mockImplementation ( query => ( {
34+ matches : false ,
35+ media : query ,
36+ onchange : null ,
37+ addListener : jest . fn ( ) ,
38+ removeListener : jest . fn ( ) ,
39+ addEventListener : jest . fn ( ) ,
40+ removeEventListener : jest . fn ( ) ,
41+ dispatchEvent : jest . fn ( ) ,
42+ } ) ) ;
43+
44+ render ( < CenteredTypewriter text = "Hi" speed = { 100 } /> ) ;
45+
46+ await act ( async ( ) => {
47+ jest . advanceTimersByTime ( 200 ) ;
48+ } ) ;
49+
50+ await waitFor ( ( ) => {
51+ expect ( screen . getByTestId ( 'typewriter-cursor' ) ) . toBeInTheDocument ( ) ;
52+ } ) ;
53+
54+ await act ( async ( ) => {
55+ jest . advanceTimersByTime ( 100 ) ;
56+ } ) ;
57+
58+ await waitFor ( ( ) => {
59+ expect ( screen . getByTestId ( 'typewriter-container' ) ) . toHaveTextContent ( 'Hi' ) ;
60+ expect ( screen . queryByTestId ( 'typewriter-cursor' ) ) . not . toBeInTheDocument ( ) ;
61+ } ) ;
62+
63+ window . matchMedia = originalMatchMedia ;
64+ } ) ;
65+
66+ it ( 'calls onComplete when finished' , async ( ) => {
67+ const originalMatchMedia = window . matchMedia ;
68+ window . matchMedia = jest . fn ( ) . mockImplementation ( query => ( {
69+ matches : false ,
70+ media : query ,
71+ onchange : null ,
72+ addListener : jest . fn ( ) ,
73+ removeListener : jest . fn ( ) ,
74+ addEventListener : jest . fn ( ) ,
75+ removeEventListener : jest . fn ( ) ,
76+ dispatchEvent : jest . fn ( ) ,
77+ } ) ) ;
78+
79+ const onComplete = jest . fn ( ) ;
80+ render ( < CenteredTypewriter text = "Hi" speed = { 100 } onComplete = { onComplete } /> ) ;
81+
82+ await act ( async ( ) => {
83+ jest . advanceTimersByTime ( 300 ) ;
84+ } ) ;
85+
86+ await waitFor ( ( ) => {
87+ expect ( onComplete ) . toHaveBeenCalled ( ) ;
88+ } ) ;
89+
90+ window . matchMedia = originalMatchMedia ;
91+ } ) ;
92+
93+ it ( 'respects prefers-reduced-motion' , ( ) => {
94+ const originalMatchMedia = window . matchMedia ;
95+ window . matchMedia = jest . fn ( ) . mockImplementation ( query => ( {
96+ matches : true ,
97+ media : query ,
98+ onchange : null ,
99+ addListener : jest . fn ( ) ,
100+ removeListener : jest . fn ( ) ,
101+ addEventListener : jest . fn ( ) ,
102+ removeEventListener : jest . fn ( ) ,
103+ dispatchEvent : jest . fn ( ) ,
104+ } ) ) ;
105+
106+ render ( < CenteredTypewriter text = "Hello World" /> ) ;
107+
108+ expect ( screen . getByTestId ( 'typewriter-container' ) ) . toHaveTextContent ( 'Hello World' ) ;
109+ expect ( screen . queryByTestId ( 'typewriter-cursor' ) ) . not . toBeInTheDocument ( ) ;
110+
111+ window . matchMedia = originalMatchMedia ;
112+ } ) ;
113+ } ) ;
0 commit comments