1- import { getEnvironmentManager } from '@/helpers/environment' ;
2- import { test as setup , expect } from '@playwright/test' ;
1+ import * as path from 'path' ;
2+ import { AnalyticsOverviewPage } from '@/admin-pages' ;
3+ import { MailPit } from '@/helpers/services/email/mail-pit' ;
34import { SettingsPage } from '@/helpers/pages' ;
4- import { loginToGetAuthenticatedSession } from '@/helpers/playwright/flows/login ' ;
5+ import { SignupPage } from '@/helpers/pages/admin/signup-page ' ;
56import { createContextWithRoute } from '@/helpers/playwright/context-with-route' ;
6- import { MailPit } from '@/helpers/services/email/mail-pit' ;
7+ import { ensureDir } from '@/helpers/utils/ensure-dir' ;
8+ import { expect , test as setup } from '@playwright/test' ;
79import { extractInvitationLink } from '@/helpers/services/email/utils' ;
8- import { SignupPage } from '@/helpers/pages/admin/signup-page' ;
10+ import { getEnvironmentManager } from '@/helpers/environment' ;
11+ import { loginToGetAuthenticatedSession } from '@/helpers/playwright/flows/login' ;
912import { setupUser } from '@/helpers/utils/setup-user' ;
10- import * as path from 'path' ;
11- import { ensureDir } from '@/helpers/utils/ensure-dir' ;
1213
1314const AUTH_STATE_DIR = path . join ( process . cwd ( ) , 'e2e' , 'data' , 'state' , 'auth' ) ;
1415const PASSWORD = 'test@123@test' ;
1516
17+ setup . describe . configure ( { mode : 'serial' } ) ;
1618// Setup environment first
17- setup ( 'environment setup' , async ( ) => {
19+ setup ( 'setup environment ' , async ( ) => {
1820 const manager = await getEnvironmentManager ( ) ;
1921 const result = await manager . globalSetup ( ) ;
2022
@@ -29,7 +31,7 @@ setup('environment setup', async () => {
2931} ) ;
3032
3133// Setup owner user
32- setup ( 'setup owner user' , async ( { browser} ) => {
34+ setup ( 'create owner user' , async ( { browser} ) => {
3335 const backendURL = process . env . E2E_BASE_URL ! ;
3436 const ownerEmail = 'owner@ghost.org' ;
3537
@@ -50,32 +52,33 @@ setup('setup owner user', async ({browser}) => {
5052 await context . close ( ) ;
5153} ) ;
5254
53- // Invite and onboard staff members using parameterized tests
5455const staffRoles : Array < { role : 'administrator' | 'editor' | 'author' | 'contributor' ; name : string ; email : string } > = [
5556 { role : 'administrator' , name : 'Test Administrator' , email : 'administrator@ghost.org' } ,
5657 { role : 'editor' , name : 'Test Editor' , email : 'editor@ghost.org' } ,
5758 { role : 'author' , name : 'Test Author' , email : 'author@ghost.org' } ,
5859 { role : 'contributor' , name : 'Test Contributor' , email : 'contributor@ghost.org' }
5960] ;
61+ setup ( `invite staff users` , async ( { browser} ) => {
62+ const backendURL = process . env . E2E_BASE_URL ! ;
63+
64+ const context = await createContextWithRoute ( browser , backendURL , {
65+ role : 'owner'
66+ } ) ;
6067
61- for ( const { role, name, email} of staffRoles ) {
62- setup ( `invite ${ role } ` , async ( { browser} ) => {
63- const backendURL = process . env . E2E_BASE_URL ! ;
64-
65- const context = await createContextWithRoute ( browser , backendURL , {
66- role : 'owner'
67- } ) ;
68-
69- const page = await context . newPage ( ) ;
70- const settingsPage = new SettingsPage ( page ) ;
71- await settingsPage . goto ( ) ;
72- await settingsPage . staffSection . goto ( ) ;
68+ const page = await context . newPage ( ) ;
69+ const settingsPage = new SettingsPage ( page ) ;
70+ await settingsPage . goto ( ) ;
71+ await settingsPage . staffSection . goto ( ) ;
7372
73+ for ( const { role, email} of staffRoles ) {
7474 await settingsPage . staffSection . inviteUser ( email , role ) ;
75- await context . close ( ) ;
76- } ) ;
75+ }
76+
77+ await context . close ( ) ;
78+ } ) ;
7779
78- setup ( `complete ${ role } signup` , async ( { browser} ) => {
80+ for ( const { role, name, email} of staffRoles ) {
81+ setup ( `create ${ role } user` , async ( { browser} ) => {
7982 const backendURL = process . env . E2E_BASE_URL ! ;
8083 const emailClient = new MailPit ( ) ;
8184
@@ -85,37 +88,34 @@ for (const {role, name, email} of staffRoles) {
8588 const emailMessage = await emailClient . getMessageDetailed ( messages [ 0 ] ) ;
8689 const invitationLink = extractInvitationLink ( emailMessage . HTML || emailMessage . Text ) ;
8790
88- let signupUrl = invitationLink . startsWith ( 'http' )
91+ // Extract the path from the invitation link and use consistent baseURL
92+ const invitationUrl = new URL ( invitationLink . startsWith ( 'http' )
8993 ? invitationLink
90- : `${ backendURL } ${ invitationLink } ` ;
91- signupUrl = signupUrl . replace ( / \/ g h o s t \/ s i g n u p \/ / , '/ghost/#/signup/' ) ;
94+ : `${ backendURL } ${ invitationLink } ` ) ;
95+ const signupPath = invitationUrl . pathname . replace ( / \/ g h o s t \/ s i g n u p \/ / , '/ghost/#/signup/' ) ;
9296
9397 const context = await createContextWithRoute ( browser , backendURL ) ;
9498 const page = await context . newPage ( ) ;
9599
96- await page . goto ( signupUrl ) ;
100+ // Use relative path so it goes through our route interception
101+ await page . goto ( signupPath ) ;
97102 const signupPage = new SignupPage ( page ) ;
98103 await signupPage . nameField . waitFor ( { state : 'visible' } ) ;
99104
100- await signupPage . completeSignup ( name , PASSWORD ) ;
101- await context . close ( ) ;
102- } ) ;
103-
104- setup ( `authenticate ${ role } ` , async ( { browser} ) => {
105- const backendURL = process . env . E2E_BASE_URL ! ;
106-
107- const context = await createContextWithRoute ( browser , backendURL ) ;
108- const page = await context . newPage ( ) ;
105+ await signupPage . nameField . fill ( name ) ;
106+ await signupPage . emailField . fill ( email ) ;
107+ await signupPage . passwordField . fill ( PASSWORD ) ;
108+ await signupPage . submitButton . click ( ) ;
109109
110- await loginToGetAuthenticatedSession ( page , email , PASSWORD ) ;
110+ await page . waitForURL ( / \/ g h o s t \/ # \/ ( a n a l y t i c s | p o s t s | s i t e ) / ) ;
111111
112112 await context . storageState ( { path : path . join ( AUTH_STATE_DIR , `${ role } .json` ) } ) ;
113113 await context . close ( ) ;
114114 } ) ;
115115}
116116
117117// Create database snapshot after all users are onboarded
118- setup ( 'create database snapshot' , async ( ) => {
118+ setup ( 'save database snapshot' , async ( ) => {
119119 const manager = await getEnvironmentManager ( ) ;
120120 if ( 'createSnapshot' in manager && typeof manager . createSnapshot === 'function' ) {
121121 await manager . createSnapshot ( ) ;
0 commit comments