@@ -4,9 +4,27 @@ import { appConfigs } from '../presets';
4
4
import type { FakeUser } from '../testUtils' ;
5
5
import { createTestUtils , testAgainstRunningApps } from '../testUtils' ;
6
6
7
+ const make500ClerkResponse = ( ) => ( {
8
+ status : 500 ,
9
+ body : JSON . stringify ( {
10
+ errors : [
11
+ {
12
+ message : 'Oops, an unexpected error occurred' ,
13
+ long_message : "There was an internal error on our servers. We've been notified and are working on fixing it." ,
14
+ code : 'internal_clerk_error' ,
15
+ } ,
16
+ ] ,
17
+ clerk_trace_id : 'some-trace-id' ,
18
+ } ) ,
19
+ } ) ;
20
+
7
21
testAgainstRunningApps ( { withEnv : [ appConfigs . envs . withEmailCodes ] } ) ( 'resiliency @generic' , ( { app } ) => {
8
22
test . describe . configure ( { mode : 'serial' } ) ;
9
23
24
+ if ( app . name . includes ( 'next' ) ) {
25
+ test . skip ( ) ;
26
+ }
27
+
10
28
let fakeUser : FakeUser ;
11
29
12
30
test . beforeAll ( async ( ) => {
@@ -32,22 +50,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes] })('resilienc
32
50
} ) ;
33
51
34
52
// Simulate developer coming back and client fails to load.
35
- await page . route ( '**/v1/client?**' , route => {
36
- return route . fulfill ( {
37
- status : 500 ,
38
- body : JSON . stringify ( {
39
- errors : [
40
- {
41
- message : 'Oops, an unexpected error occurred' ,
42
- long_message :
43
- "There was an internal error on our servers. We've been notified and are working on fixing it." ,
44
- code : 'internal_clerk_error' ,
45
- } ,
46
- ] ,
47
- clerk_trace_id : 'some-trace-id' ,
48
- } ) ,
49
- } ) ;
50
- } ) ;
53
+ await page . route ( '**/v1/client?**' , route => route . fulfill ( make500ClerkResponse ( ) ) ) ;
51
54
52
55
await page . waitForTimeout ( 1_000 ) ;
53
56
await page . reload ( ) ;
@@ -140,4 +143,116 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes] })('resilienc
140
143
141
144
await u . po . clerk . toBeLoaded ( ) ;
142
145
} ) ;
146
+
147
+ test . describe ( 'Clerk.status' , ( ) => {
148
+ test ( 'normal flow shows correct states and transitions' , async ( { page, context } ) => {
149
+ const u = createTestUtils ( { app, page, context } ) ;
150
+ await u . page . goToRelative ( '/clerk-status' ) ;
151
+
152
+ // Initial state checks
153
+ await expect ( page . getByText ( 'Status: loading' , { exact : true } ) ) . toBeVisible ( ) ;
154
+ await expect ( page . getByText ( 'Clerk is loading' , { exact : true } ) ) . toBeVisible ( ) ;
155
+ await expect ( page . getByText ( 'Clerk is NOT loaded' , { exact : true } ) ) . toBeVisible ( ) ;
156
+ await expect ( page . getByText ( 'Clerk is out' ) ) . toBeHidden ( ) ;
157
+ await expect ( page . getByText ( 'Clerk is degraded' ) ) . toBeHidden ( ) ;
158
+ await expect ( page . getByText ( '(comp) Waiting for clerk to fail, ready or regraded.' ) ) . toBeVisible ( ) ;
159
+ await u . po . clerk . toBeLoading ( ) ;
160
+
161
+ // Wait for loading to complete and verify final state
162
+ await expect ( page . getByText ( 'Status: ready' , { exact : true } ) ) . toBeVisible ( ) ;
163
+ await u . po . clerk . toBeLoaded ( ) ;
164
+ await u . po . clerk . toBeReady ( ) ;
165
+ await expect ( page . getByText ( 'Clerk is ready' , { exact : true } ) ) . toBeVisible ( ) ;
166
+ await expect ( page . getByText ( 'Clerk is ready or degraded (loaded)' ) ) . toBeVisible ( ) ;
167
+ await expect ( page . getByText ( 'Clerk is loaded' , { exact : true } ) ) . toBeVisible ( ) ;
168
+ await expect ( page . getByText ( '(comp) Clerk is loaded,(ready or degraded)' ) ) . toBeVisible ( ) ;
169
+
170
+ // Verify loading component is no longer visible
171
+ await expect ( page . getByText ( '(comp) Waiting for clerk to fail, ready or regraded.' ) ) . toBeHidden ( ) ;
172
+ } ) ;
173
+
174
+ test ( 'clerk-js hotloading failed' , async ( { page, context } ) => {
175
+ const u = createTestUtils ( { app, page, context } ) ;
176
+
177
+ await page . route ( '**/clerk.browser.js' , route => route . abort ( ) ) ;
178
+
179
+ await u . page . goToRelative ( '/clerk-status' ) ;
180
+
181
+ // Initial state checks
182
+ await expect ( page . getByText ( 'Status: loading' , { exact : true } ) ) . toBeVisible ( ) ;
183
+ await expect ( page . getByText ( 'Clerk is loading' , { exact : true } ) ) . toBeVisible ( ) ;
184
+ await expect ( page . getByText ( 'Clerk is NOT loaded' , { exact : true } ) ) . toBeVisible ( ) ;
185
+
186
+ // Wait for loading to complete and verify final state
187
+ await expect ( page . getByText ( 'Status: error' , { exact : true } ) ) . toBeVisible ( {
188
+ timeout : 10_000 ,
189
+ } ) ;
190
+ await expect ( page . getByText ( 'Clerk is out' , { exact : true } ) ) . toBeVisible ( ) ;
191
+ await expect ( page . getByText ( 'Clerk is ready or degraded (loaded)' ) ) . toBeHidden ( ) ;
192
+ await expect ( page . getByText ( 'Clerk is loaded' , { exact : true } ) ) . toBeHidden ( ) ;
193
+ await expect ( page . getByText ( '(comp) Clerk is loaded,(ready or degraded)' ) ) . toBeHidden ( ) ;
194
+ await expect ( page . getByText ( 'Clerk is NOT loaded' , { exact : true } ) ) . toBeVisible ( ) ;
195
+
196
+ // Verify loading component is no longer visible
197
+ await expect ( page . getByText ( 'Clerk is loading' , { exact : true } ) ) . toBeHidden ( ) ;
198
+ } ) ;
199
+
200
+ // TODO: Fix detection of hotloaded clerk-js failing
201
+ test . skip ( 'clerk-js client fails and status degraded' , async ( { page, context } ) => {
202
+ const u = createTestUtils ( { app, page, context } ) ;
203
+
204
+ await page . route ( '**/v1/client?**' , route => route . fulfill ( make500ClerkResponse ( ) ) ) ;
205
+
206
+ await u . page . goToRelative ( '/clerk-status' ) ;
207
+
208
+ // Initial state checks
209
+ await expect ( page . getByText ( 'Status: loading' , { exact : true } ) ) . toBeVisible ( ) ;
210
+ await expect ( page . getByText ( 'Clerk is loading' , { exact : true } ) ) . toBeVisible ( ) ;
211
+ await expect ( page . getByText ( 'Clerk is NOT loaded' , { exact : true } ) ) . toBeVisible ( ) ;
212
+
213
+ // Wait for loading to complete and verify final state
214
+ await expect ( page . getByText ( 'Status: degraded' , { exact : true } ) ) . toBeVisible ( {
215
+ timeout : 10_000 ,
216
+ } ) ;
217
+ await u . po . clerk . toBeDegraded ( ) ;
218
+ await expect ( page . getByText ( 'Clerk is degraded' , { exact : true } ) ) . toBeVisible ( ) ;
219
+ await expect ( page . getByText ( 'Clerk is ready' , { exact : true } ) ) . toBeHidden ( ) ;
220
+ await expect ( page . getByText ( 'Clerk is ready or degraded (loaded)' ) ) . toBeVisible ( ) ;
221
+ await expect ( page . getByText ( 'Clerk is loaded' , { exact : true } ) ) . toBeVisible ( ) ;
222
+ await expect ( page . getByText ( '(comp) Clerk is loaded,(ready or degraded)' ) ) . toBeVisible ( ) ;
223
+ await expect ( page . getByText ( 'Clerk is NOT loaded' , { exact : true } ) ) . toBeHidden ( ) ;
224
+ await expect ( page . getByText ( '(comp) Clerk is degraded' ) ) . toBeVisible ( ) ;
225
+
226
+ // Verify loading component is no longer visible
227
+ await expect ( page . getByText ( 'Clerk is loading' , { exact : true } ) ) . toBeHidden ( ) ;
228
+ } ) ;
229
+
230
+ test ( 'clerk-js environment fails and status degraded' , async ( { page, context } ) => {
231
+ const u = createTestUtils ( { app, page, context } ) ;
232
+
233
+ await page . route ( '**/v1/environment?**' , route => route . fulfill ( make500ClerkResponse ( ) ) ) ;
234
+
235
+ await u . page . goToRelative ( '/clerk-status' ) ;
236
+
237
+ // Initial state checks
238
+ await expect ( page . getByText ( 'Status: loading' , { exact : true } ) ) . toBeVisible ( ) ;
239
+ await expect ( page . getByText ( 'Clerk is loading' , { exact : true } ) ) . toBeVisible ( ) ;
240
+ await expect ( page . getByText ( 'Clerk is NOT loaded' , { exact : true } ) ) . toBeVisible ( ) ;
241
+ await u . po . clerk . toBeLoading ( ) ;
242
+
243
+ // Wait for loading to complete and verify final state
244
+ await expect ( page . getByText ( 'Status: degraded' , { exact : true } ) ) . toBeVisible ( ) ;
245
+ await u . po . clerk . toBeDegraded ( ) ;
246
+ await expect ( page . getByText ( 'Clerk is degraded' , { exact : true } ) ) . toBeVisible ( ) ;
247
+ await expect ( page . getByText ( 'Clerk is ready' , { exact : true } ) ) . toBeHidden ( ) ;
248
+ await expect ( page . getByText ( 'Clerk is ready or degraded (loaded)' ) ) . toBeVisible ( ) ;
249
+ await expect ( page . getByText ( 'Clerk is loaded' , { exact : true } ) ) . toBeVisible ( ) ;
250
+ await expect ( page . getByText ( '(comp) Clerk is loaded,(ready or degraded)' ) ) . toBeVisible ( ) ;
251
+ await expect ( page . getByText ( 'Clerk is NOT loaded' , { exact : true } ) ) . toBeHidden ( ) ;
252
+ await expect ( page . getByText ( '(comp) Clerk is degraded' ) ) . toBeVisible ( ) ;
253
+
254
+ // Verify loading component is no longer visible
255
+ await expect ( page . getByText ( 'Clerk is loading' , { exact : true } ) ) . toBeHidden ( ) ;
256
+ } ) ;
257
+ } ) ;
143
258
} ) ;
0 commit comments