@@ -2,20 +2,11 @@ import { render, waitFor } from "@testing-library/react";
2
2
import { vi , describe , it , expect , beforeEach , afterEach } from "vitest" ;
3
3
import { Turnstile } from "./turnstile" ;
4
4
5
- // Mock Next.js Script component
6
- vi . mock ( "next/script" , ( ) => ( {
7
- default : ( { onLoad } : { onLoad : ( ) => void } ) => {
8
- // Simulate script loading
9
- setTimeout ( ( ) => onLoad ( ) , 0 ) ;
10
- return null ;
11
- } ,
12
- } ) ) ;
13
-
14
5
describe ( "Turnstile" , ( ) => {
15
6
const mockRender = vi . fn ( ) . mockReturnValue ( "widget-123" ) ;
16
7
const mockReset = vi . fn ( ) ;
17
8
const mockRemove = vi . fn ( ) ;
18
- const mockOnVerify = vi . fn ( ) ;
9
+ const mockOnSuccess = vi . fn ( ) ;
19
10
const mockOnError = vi . fn ( ) ;
20
11
const mockOnExpire = vi . fn ( ) ;
21
12
@@ -39,7 +30,7 @@ describe("Turnstile", () => {
39
30
const { container } = render (
40
31
< Turnstile
41
32
sitekey = "test-site-key"
42
- onVerify = { mockOnVerify }
33
+ onSuccess = { mockOnSuccess }
43
34
onError = { mockOnError }
44
35
onExpire = { mockOnExpire }
45
36
/>
@@ -56,24 +47,27 @@ describe("Turnstile", () => {
56
47
"expired-callback" : expect . any ( Function ) ,
57
48
theme : "auto" ,
58
49
size : "normal" ,
50
+ appearance : "interaction-only" ,
51
+ execution : "render" ,
52
+ language : "auto" ,
59
53
} )
60
54
) ;
61
55
} ) ;
62
56
63
57
// Check container exists
64
- const turnstileContainer = container . querySelector ( ".cf-turnstile " ) ;
58
+ const turnstileContainer = container . querySelector ( "div " ) ;
65
59
expect ( turnstileContainer ) . toBeInTheDocument ( ) ;
66
60
67
61
// Test that callbacks are properly forwarded
68
62
const renderCall = mockRender . mock . calls [ 0 ] [ 1 ] ;
69
63
70
- // Test onVerify callback
64
+ // Test onSuccess callback
71
65
renderCall . callback ( "test-token" ) ;
72
- expect ( mockOnVerify ) . toHaveBeenCalledWith ( "test-token" ) ;
66
+ expect ( mockOnSuccess ) . toHaveBeenCalledWith ( "test-token" ) ;
73
67
74
68
// Test onError callback
75
- renderCall [ "error-callback" ] ( "test-error" ) ;
76
- expect ( mockOnError ) . toHaveBeenCalledWith ( "test-error" ) ;
69
+ renderCall [ "error-callback" ] ( ) ;
70
+ expect ( mockOnError ) . toHaveBeenCalled ( ) ;
77
71
78
72
// Test onExpire callback
79
73
renderCall [ "expired-callback" ] ( ) ;
@@ -84,7 +78,7 @@ describe("Turnstile", () => {
84
78
render (
85
79
< Turnstile
86
80
sitekey = "test-site-key"
87
- onVerify = { mockOnVerify }
81
+ onSuccess = { mockOnSuccess }
88
82
theme = "dark"
89
83
size = "compact"
90
84
/>
@@ -103,7 +97,7 @@ describe("Turnstile", () => {
103
97
104
98
it ( "cleans up widget on unmount" , async ( ) => {
105
99
const { unmount } = render (
106
- < Turnstile sitekey = "test-site-key" onVerify = { mockOnVerify } />
100
+ < Turnstile sitekey = "test-site-key" onSuccess = { mockOnSuccess } />
107
101
) ;
108
102
109
103
await waitFor ( ( ) => {
@@ -115,76 +109,14 @@ describe("Turnstile", () => {
115
109
expect ( mockRemove ) . toHaveBeenCalledWith ( "widget-123" ) ;
116
110
} ) ;
117
111
118
- it ( "handles render errors gracefully" , async ( ) => {
119
- mockRender . mockImplementationOnce ( ( ) => {
120
- throw new Error ( "Render failed" ) ;
121
- } ) ;
122
-
123
- render (
124
- < Turnstile
125
- sitekey = "test-site-key"
126
- onVerify = { mockOnVerify }
127
- onError = { mockOnError }
128
- />
129
- ) ;
130
-
131
- await waitFor ( ( ) => {
132
- expect ( mockOnError ) . toHaveBeenCalledWith (
133
- "Failed to load verification widget"
134
- ) ;
135
- } ) ;
136
- } ) ;
137
-
138
- it ( "applies custom className" , ( ) => {
139
- const { container } = render (
140
- < Turnstile
141
- sitekey = "test-site-key"
142
- onVerify = { mockOnVerify }
143
- className = "custom-class"
144
- />
145
- ) ;
146
-
147
- const turnstileContainer = container . querySelector ( ".cf-turnstile" ) ;
148
- expect ( turnstileContainer ) . toHaveClass ( "custom-class" ) ;
149
- } ) ;
150
-
151
- it ( "applies correct height classes based on size" , ( ) => {
152
- const { container : container1 } = render (
153
- < Turnstile
154
- sitekey = "test-site-key"
155
- onVerify = { mockOnVerify }
156
- size = "compact"
157
- />
158
- ) ;
159
- expect ( container1 . querySelector ( ".cf-turnstile" ) ) . toHaveClass ( "h-[65px]" ) ;
112
+ it ( "checks script is loaded" , async ( ) => {
113
+ render ( < Turnstile sitekey = "test-site-key" onSuccess = { mockOnSuccess } /> ) ;
160
114
161
- const { container : container2 } = render (
162
- < Turnstile
163
- sitekey = "test-site-key"
164
- onVerify = { mockOnVerify }
165
- size = "normal"
166
- />
167
- ) ;
168
- expect ( container2 . querySelector ( ".cf-turnstile" ) ) . toHaveClass ( "h-[65px]" ) ;
169
-
170
- const { container : container3 } = render (
171
- < Turnstile
172
- sitekey = "test-site-key"
173
- onVerify = { mockOnVerify }
174
- size = "flexible"
175
- />
176
- ) ;
177
- expect ( container3 . querySelector ( ".cf-turnstile" ) ) . toHaveClass (
178
- "min-h-[65px]"
179
- ) ;
180
-
181
- const { container : container4 } = render (
182
- < Turnstile
183
- sitekey = "test-site-key"
184
- onVerify = { mockOnVerify }
185
- size = "invisible"
186
- />
115
+ // Check that script was added
116
+ const script = document . getElementById ( "cf-turnstile-script" ) ;
117
+ expect ( script ) . toBeTruthy ( ) ;
118
+ expect ( script ?. getAttribute ( "src" ) ) . toBe (
119
+ "https://challenges.cloudflare.com/turnstile/v0/api.js"
187
120
) ;
188
- expect ( container4 . querySelector ( ".cf-turnstile" ) ) . toHaveClass ( "h-0" ) ;
189
121
} ) ;
190
122
} ) ;
0 commit comments