Skip to content

Instantly share code, notes, and snippets.

@jasonLaster
Created April 28, 2025 16:48
Show Gist options
  • Save jasonLaster/272c4a49c9f488aa32fbeff5df2bd09b to your computer and use it in GitHub Desktop.
Save jasonLaster/272c4a49c9f488aa32fbeff5df2bd09b to your computer and use it in GitHub Desktop.
diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts
index 688cde0..6a22247 100644
--- a/apps/web/playwright.config.ts
+++ b/apps/web/playwright.config.ts
@@ -15,7 +15,7 @@ export default defineConfig({
retries: process.env.CI ? 2 : 0,
workers: 1,
- reporter: process.env.CI ? "html" : "dot",
+ reporter: process.env.CI ? "html" : "line",
globalSetup: "./tests/global.setup.ts",
diff --git a/apps/web/tests/global.setup.ts b/apps/web/tests/global.setup.ts
index e5fe9d6..2fd034d 100644
--- a/apps/web/tests/global.setup.ts
+++ b/apps/web/tests/global.setup.ts
@@ -1,8 +1,8 @@
-import { clerkSetup } from "@clerk/testing/playwright";
+import { clerkSetup, setupClerkTestingToken } from "@clerk/testing/playwright";
// import { test as setup } from "@playwright/test";
import { chromium } from "@playwright/test";
-import { signin } from "./utils";
+import { signin, createClerkSession } from "./utils";
const port = process.env.PORT ? parseInt(process.env.PORT) : 3000;
const usePreviewUrl = !!process.env.PLAYWRIGHT_TEST_BASE_URL;
@@ -12,19 +12,35 @@ const baseURL = usePreviewUrl
: `http://localhost:${port}`;
export default async function globalSetup() {
+ console.log("globalSetup: Starting Clerk setup");
await clerkSetup();
+ console.log("globalSetup: Clerk setup complete");
const browser = await chromium.launch();
const page = await browser.newPage();
- console.log("globalSetup: Signing in");
- await signin(page, baseURL);
-
- await page.waitForURL(`${baseURL}/`);
+ // Use Clerk testing token utility to authenticate
+ await setupClerkTestingToken({ page });
+ const { sessionToken } = await createClerkSession(
+ process.env.CLERK_TEST_USER_ID!
+ );
+
+ await page.context().addCookies([
+ {
+ name: "__session",
+ value: sessionToken,
+ },
+ ]);
+
+ console.log("globalSetup: Clerk testing token setup complete");
+ // Optionally, navigate to your app to ensure the session is loaded
+ await page.goto(baseURL);
+ console.log("globalSetup: Navigated to baseURL");
+ // Save the authenticated storage state for all tests
await page
.context()
.storageState({ path: "playwright/.auth/storageState.json" });
- console.log("globalSetup: Done signing in");
+ console.log("globalSetup: Done signing in with Clerk testing token");
await browser.close();
}
diff --git a/apps/web/tests/upload.spec.ts b/apps/web/tests/upload.spec.ts
index 9aaa926..6d42991 100644
--- a/apps/web/tests/upload.spec.ts
+++ b/apps/web/tests/upload.spec.ts
@@ -25,12 +25,6 @@ test("Uploading a PDF", async ({ page }) => {
.getByTestId("upload-loader")
.waitFor({ state: "hidden", timeout: 30_000 });
- // Force a page reload to ensure the list updates
- console.log("Reloading page...");
- await page.reload();
- await page.waitForLoadState("domcontentloaded", { timeout: 15_000 });
- console.log("Page reloaded.");
-
// Wait for the link count to increase by one after upload completes and refresh happens
await expect(
page.getByRole("link", { name: /yakima/i, exact: false })
@@ -55,7 +49,6 @@ test("Uploading a PDF", async ({ page }) => {
await menuButton.click();
// Find and click the delete button in the dropdown menu
- // Note: The delete button is likely added to the page body, not within the list item, so we select it globally
const deleteButton = page.locator(
'[data-testid="pdf-list-item-delete-button"]'
);
diff --git a/apps/web/tests/utils.ts b/apps/web/tests/utils.ts
index 4b66b2e..30b7e81 100644
--- a/apps/web/tests/utils.ts
+++ b/apps/web/tests/utils.ts
@@ -82,3 +82,38 @@ export async function navigateToPdf(page: Page, name: string) {
return href;
}
+
+export async function createClerkSession(userId: string) {
+ if (!userId) {
+ throw new Error("userId is required");
+ }
+
+ const apiContext = await request.newContext({
+ baseURL: CLERK_API_URL,
+ extraHTTPHeaders: {
+ Authorization: `Bearer ${CLERK_API_KEY}`,
+ "Content-Type": "application/json",
+ },
+ });
+
+ const response = await apiContext.post("/sessions", {
+ data: {
+ user_id: userId,
+ },
+ });
+
+ let json;
+ try {
+ json = await response.json();
+ } catch (err) {
+ const text = await response.text();
+ console.error("Clerk session creation failed:", {
+ status: response.status(),
+ body: text,
+ });
+ throw err;
+ }
+
+ const { id, session_token } = json;
+ return { sessionId: id, sessionToken: session_token };
+}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment