11import { createClerkClient as backendCreateClerkClient } from '@clerk/backend' ;
2- import { setupClerkTestingToken } from '@clerk/testing/playwright' ;
3- import type { Browser , BrowserContext , Page , Response } from '@playwright/test' ;
4- import { expect } from '@playwright/test' ;
2+ import { createPageObjects , createAppPageObject , type EnhancedPage } from '@clerk/testing/playwright/unstable' ;
3+ import type { Browser , BrowserContext , Page } from '@playwright/test' ;
54
65import type { Application } from '../models/application' ;
7- import { createAppPageObject } from './appPageObject' ;
86import { createEmailService } from './emailService' ;
9- import { createImpersonationPageObject } from './impersonationPageObjects' ;
107import { createInvitationService } from './invitationsService' ;
11- import { createKeylessPopoverPageObject } from './keylessPopoverPageObject' ;
128import { createOrganizationsService } from './organizationsService' ;
13- import { createOrganizationSwitcherComponentPageObject } from './organizationSwitcherPageObject' ;
14- import { createSessionTaskComponentPageObject } from './sessionTaskPageObject' ;
15- import type { EnchancedPage , TestArgs } from './signInPageObject' ;
16- import { createSignInComponentPageObject } from './signInPageObject' ;
17- import { createSignUpComponentPageObject } from './signUpPageObject' ;
18- import { createUserButtonPageObject } from './userButtonPageObject' ;
19- import { createUserProfileComponentPageObject } from './userProfilePageObject' ;
9+
2010import type { FakeOrganization , FakeUser } from './usersService' ;
2111import { createUserService } from './usersService' ;
22- import { createUserVerificationComponentPageObject } from './userVerificationPageObject' ;
23- import { createWaitlistComponentPageObject } from './waitlistPageObject' ;
2412
2513export type { FakeUser , FakeOrganization } ;
2614const createClerkClient = ( app : Application ) => {
@@ -31,91 +19,14 @@ const createClerkClient = (app: Application) => {
3119 } ) ;
3220} ;
3321
34- const createExpectPageObject = ( { page } : TestArgs ) => {
35- return {
36- toBeHandshake : async ( res : Response ) => {
37- // Travel the redirect chain until we find the handshake header
38- // TODO: Loop through the redirects until we find a handshake header, or timeout trying
39- const redirect = await res . request ( ) . redirectedFrom ( ) . redirectedFrom ( ) . response ( ) ;
40- expect ( redirect . status ( ) ) . toBe ( 307 ) ;
41- expect ( redirect . headers ( ) [ 'x-clerk-auth-status' ] ) . toContain ( 'handshake' ) ;
42- } ,
43- toBeSignedOut : ( args ?: { timeOut : number } ) => {
44- return page . waitForFunction (
45- ( ) => {
46- return ! window . Clerk ?. user ;
47- } ,
48- null ,
49- { timeout : args ?. timeOut } ,
50- ) ;
51- } ,
52- toBeSignedIn : async ( ) => {
53- return page . waitForFunction ( ( ) => {
54- return ! ! window . Clerk ?. user ;
55- } ) ;
56- } ,
57- toBeSignedInAsActor : async ( ) => {
58- return page . waitForFunction ( ( ) => {
59- return ! ! window . Clerk ?. session ?. actor ;
60- } ) ;
61- } ,
62- toHaveResolvedTask : async ( ) => {
63- return page . waitForFunction ( ( ) => {
64- return ! window . Clerk ?. session ?. currentTask ;
65- } ) ;
66- } ,
67- } ;
68- } ;
69-
70- const createClerkUtils = ( { page } : TestArgs ) => {
71- return {
72- toBeLoaded : async ( ) => {
73- return page . waitForFunction ( ( ) => {
74- return ! ! window . Clerk ?. loaded ;
75- } ) ;
76- } ,
77- getClientSideActor : ( ) => {
78- return page . evaluate ( ( ) => {
79- return window . Clerk ?. session ?. actor ;
80- } ) ;
81- } ,
82- toBeLoading : async ( ) => {
83- return page . waitForFunction ( ( ) => {
84- return window . Clerk ?. status === 'loading' ;
85- } ) ;
86- } ,
87- toBeReady : async ( ) => {
88- return page . waitForFunction ( ( ) => {
89- return window . Clerk ?. status === 'ready' ;
90- } ) ;
91- } ,
92- toBeDegraded : async ( ) => {
93- return page . waitForFunction ( ( ) => {
94- return window . Clerk ?. status === 'degraded' ;
95- } ) ;
96- } ,
97- getClientSideUser : ( ) => {
98- return page . evaluate ( ( ) => {
99- return window . Clerk ?. user ;
100- } ) ;
101- } ,
102- } ;
103- } ;
104-
105- const createTestingTokenUtils = ( { context } : TestArgs ) => {
106- return {
107- setup : async ( ) => setupClerkTestingToken ( { context } ) ,
108- } ;
109- } ;
110-
11122export type CreateAppPageObjectArgs = { page : Page ; context : BrowserContext ; browser : Browser } ;
11223
11324export const createTestUtils = <
11425 Params extends { app : Application ; useTestingToken ?: boolean } & Partial < CreateAppPageObjectArgs > ,
11526 Services = typeof services ,
11627 PO = typeof pageObjects ,
11728 BH = typeof browserHelpers ,
118- FullReturn = { services : Services ; po : PO ; tabs : BH ; page : EnchancedPage ; nextJsVersion : string } ,
29+ FullReturn = { services : Services ; po : PO ; tabs : BH ; page : EnhancedPage ; nextJsVersion : string } ,
11930 OnlyAppReturn = { services : Services } ,
12031> (
12132 params : Params ,
@@ -135,54 +46,37 @@ export const createTestUtils = <
13546 return { services } as any ;
13647 }
13748
138- const page = createAppPageObject ( { page : params . page , useTestingToken } , app ) ;
139- const testArgs = { page, context, browser } ;
140-
141- const pageObjects = {
142- clerk : createClerkUtils ( testArgs ) ,
143- expect : createExpectPageObject ( testArgs ) ,
144- impersonation : createImpersonationPageObject ( testArgs ) ,
145- keylessPopover : createKeylessPopoverPageObject ( testArgs ) ,
146- organizationSwitcher : createOrganizationSwitcherComponentPageObject ( testArgs ) ,
147- sessionTask : createSessionTaskComponentPageObject ( testArgs ) ,
148- signIn : createSignInComponentPageObject ( testArgs ) ,
149- signUp : createSignUpComponentPageObject ( testArgs ) ,
150- testingToken : createTestingTokenUtils ( testArgs ) ,
151- userButton : createUserButtonPageObject ( testArgs ) ,
152- userProfile : createUserProfileComponentPageObject ( testArgs ) ,
153- userVerification : createUserVerificationComponentPageObject ( testArgs ) ,
154- waitlist : createWaitlistComponentPageObject ( testArgs ) ,
155- } ;
49+ const pageObjects = createPageObjects ( { page : params . page , useTestingToken, baseURL : app . serverUrl } ) ;
15650
15751 const browserHelpers = {
15852 runInNewTab : async (
159- cb : ( u : { services : Services ; po : PO ; page : EnchancedPage } , context : BrowserContext ) => Promise < unknown > ,
53+ cb : ( u : { services : Services ; po : PO ; page : EnhancedPage } , context : BrowserContext ) => Promise < unknown > ,
16054 ) => {
16155 const u = createTestUtils ( {
16256 app,
163- page : createAppPageObject ( { page : await context . newPage ( ) , useTestingToken } , app ) ,
57+ page : createAppPageObject ( { page : await context . newPage ( ) , useTestingToken } , { baseURL : app . serverUrl } ) ,
16458 } ) ;
16559 await cb ( u as any , context ) ;
16660 return u ;
16761 } ,
16862 runInNewBrowser : async (
169- cb : ( u : { services : Services ; po : PO ; page : EnchancedPage } , context : BrowserContext ) => Promise < unknown > ,
63+ cb : ( u : { services : Services ; po : PO ; page : EnhancedPage } , context : BrowserContext ) => Promise < unknown > ,
17064 ) => {
17165 if ( ! browser ) {
17266 throw new Error ( 'Browser is not defined. Did you forget to pass it to createPageObjects?' ) ;
17367 }
17468 const context = await browser . newContext ( ) ;
17569 const u = createTestUtils ( {
17670 app,
177- page : createAppPageObject ( { page : await context . newPage ( ) , useTestingToken } , app ) ,
71+ page : createAppPageObject ( { page : await context . newPage ( ) , useTestingToken } , { baseURL : app . serverUrl } ) ,
17872 } ) ;
17973 await cb ( u as any , context ) ;
18074 return u ;
18175 } ,
18276 } ;
18377
18478 return {
185- page,
79+ page : pageObjects . page ,
18680 services,
18781 po : pageObjects ,
18882 tabs : browserHelpers ,
0 commit comments