diff --git a/playwright/e2e/page/share-page.spec.ts b/playwright/e2e/page/share-page.spec.ts index e9b51de0..8f167b67 100644 --- a/playwright/e2e/page/share-page.spec.ts +++ b/playwright/e2e/page/share-page.spec.ts @@ -2,6 +2,7 @@ import { test, expect, Page } from '@playwright/test'; import { DropdownSelectors, PageSelectors, SidebarSelectors, ShareSelectors } from '../../support/selectors'; import { generateRandomEmail } from '../../support/test-config'; import { signInAndWaitForApp } from '../../support/auth-flow-helpers'; +import { createUserAccount } from '../../support/auth-utils'; /** * Share Page Tests @@ -96,7 +97,8 @@ test.describe('Share Page Test', () => { } }); - // 1. Sign in as user A + // 1. Sign in as user A and create user B account + await createUserAccount(request, userBEmail); await signInAndWaitForApp(page, request, testEmail); // Wait for app to fully load @@ -148,6 +150,7 @@ test.describe('Share Page Test', () => { } }); + await createUserAccount(request, userBEmail); await signInAndWaitForApp(page, request, testEmail); await expect(SidebarSelectors.pageHeader(page)).toBeVisible({ timeout: 30000 }); @@ -200,6 +203,12 @@ test.describe('Share Page Test', () => { const userCEmail = generateRandomEmail(); const userDEmail = generateRandomEmail(); + // Create all invited user accounts first + await Promise.all([ + createUserAccount(request, userBEmail), + createUserAccount(request, userCEmail), + createUserAccount(request, userDEmail), + ]); await signInAndWaitForApp(page, request, testEmail); await expect(SidebarSelectors.pageHeader(page)).toBeVisible({ timeout: 30000 }); @@ -242,6 +251,7 @@ test.describe('Share Page Test', () => { } }); + await createUserAccount(request, userBEmail); await signInAndWaitForApp(page, request, testEmail); await expect(SidebarSelectors.pageHeader(page)).toBeVisible({ timeout: 30000 }); @@ -290,6 +300,7 @@ test.describe('Share Page Test', () => { } }); + await createUserAccount(request, userBEmail); await signInAndWaitForApp(page, request, testEmail); await expect(SidebarSelectors.pageHeader(page)).toBeVisible({ timeout: 30000 }); @@ -332,6 +343,7 @@ test.describe('Share Page Test', () => { const userCEmail = generateRandomEmail(); + await createUserAccount(request, userBEmail); await signInAndWaitForApp(page, request, testEmail); await expect(SidebarSelectors.pageHeader(page)).toBeVisible({ timeout: 30000 }); @@ -390,6 +402,7 @@ test.describe('Share Page Test', () => { } }); + await createUserAccount(request, userBEmail); await signInAndWaitForApp(page, request, testEmail); await expect(SidebarSelectors.pageHeader(page)).toBeVisible({ timeout: 30000 }); @@ -433,6 +446,7 @@ test.describe('Share Page Test', () => { } }); + await createUserAccount(request, userBEmail); await signInAndWaitForApp(page, request, testEmail); await expect(SidebarSelectors.pageHeader(page)).toBeVisible({ timeout: 30000 }); diff --git a/playwright/support/auth-utils.ts b/playwright/support/auth-utils.ts index 63045a42..ea8dcf2c 100644 --- a/playwright/support/auth-utils.ts +++ b/playwright/support/auth-utils.ts @@ -242,3 +242,31 @@ export async function signInTestUser( const authUtils = new AuthTestUtils(); await authUtils.signInWithTestUrl(page, request, email); } + +/** + * Create a user account without signing in via the browser. + * Uses GoTrue admin generate_link to create the user, then calls + * the verify endpoint to ensure the user profile exists. + */ +export async function createUserAccount( + request: APIRequestContext, + email: string +): Promise { + const authUtils = new AuthTestUtils(); + const callbackLink = await authUtils.generateSignInUrl(request, email); + + const hashIndex = callbackLink.indexOf('#'); + if (hashIndex === -1) return; + + const hash = callbackLink.substring(hashIndex); + const params = new URLSearchParams(hash.slice(1)); + const accessToken = params.get('access_token'); + + if (!accessToken) return; + + // Call verify endpoint to create the user profile in the backend + await request.get(`${TestConfig.apiUrl}/api/user/verify/${accessToken}`, { + failOnStatusCode: false, + timeout: 30000, + }); +}