-
Notifications
You must be signed in to change notification settings - Fork 338
/
Copy pathindex.ts
88 lines (77 loc) · 3.25 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { createClerkClient as backendCreateClerkClient } from '@clerk/backend';
import { createPageObjects, createAppPageObject, type EnhancedPage } from '@clerk/testing/playwright/unstable';
import type { Browser, BrowserContext, Page } from '@playwright/test';
import type { Application } from '../models/application';
import { createEmailService } from './emailService';
import { createInvitationService } from './invitationsService';
import { createOrganizationsService } from './organizationsService';
import type { FakeOrganization, FakeUser } from './usersService';
import { createUserService } from './usersService';
export type { FakeUser, FakeOrganization };
const createClerkClient = (app: Application) => {
return backendCreateClerkClient({
apiUrl: app.env.privateVariables.get('CLERK_API_URL'),
secretKey: app.env.privateVariables.get('CLERK_SECRET_KEY'),
publishableKey: app.env.publicVariables.get('CLERK_PUBLISHABLE_KEY'),
});
};
export type CreateAppPageObjectArgs = { page: Page; context: BrowserContext; browser: Browser };
export const createTestUtils = <
Params extends { app: Application; useTestingToken?: boolean } & Partial<CreateAppPageObjectArgs>,
Services = typeof services,
PO = typeof pageObjects,
BH = typeof browserHelpers,
FullReturn = { services: Services; po: PO; tabs: BH; page: EnhancedPage; nextJsVersion: string },
OnlyAppReturn = { services: Services },
>(
params: Params,
): Params extends Partial<CreateAppPageObjectArgs> ? FullReturn : OnlyAppReturn => {
const { app, context, browser, useTestingToken = true } = params || {};
const clerkClient = createClerkClient(app);
const services = {
clerk: clerkClient,
email: createEmailService(),
users: createUserService(clerkClient),
invitations: createInvitationService(clerkClient),
organizations: createOrganizationsService(clerkClient),
};
if (!params.page) {
return { services } as any;
}
const pageObjects = createPageObjects({ page: params.page, useTestingToken, baseURL: app.serverUrl });
const browserHelpers = {
runInNewTab: async (
cb: (u: { services: Services; po: PO; page: EnhancedPage }, context: BrowserContext) => Promise<unknown>,
) => {
const u = createTestUtils({
app,
page: createAppPageObject({ page: await context.newPage(), useTestingToken }, { baseURL: app.serverUrl }),
});
await cb(u as any, context);
return u;
},
runInNewBrowser: async (
cb: (u: { services: Services; po: PO; page: EnhancedPage }, context: BrowserContext) => Promise<unknown>,
) => {
if (!browser) {
throw new Error('Browser is not defined. Did you forget to pass it to createPageObjects?');
}
const context = await browser.newContext();
const u = createTestUtils({
app,
page: createAppPageObject({ page: await context.newPage(), useTestingToken }, { baseURL: app.serverUrl }),
});
await cb(u as any, context);
return u;
},
};
return {
page: pageObjects.page,
services,
po: pageObjects,
tabs: browserHelpers,
// eslint-disable-next-line turbo/no-undeclared-env-vars
nextJsVersion: process.env.E2E_NEXTJS_VERSION,
} as any;
};
export { testAgainstRunningApps } from './testAgainstRunningApps';