| | import { Page, FullConfig, chromium } from '@playwright/test'; |
| | import type { User } from '../types'; |
| | import cleanupUser from './cleanupUser'; |
| | import dotenv from 'dotenv'; |
| | dotenv.config(); |
| |
|
| | const timeout = 6000; |
| |
|
| | async function register(page: Page, user: User) { |
| | await page.getByRole('link', { name: 'Sign up' }).click(); |
| | await page.getByLabel('Full name').click(); |
| | await page.getByLabel('Full name').fill('test'); |
| | await page.getByText('Username (optional)').click(); |
| | await page.getByLabel('Username (optional)').fill('test'); |
| | await page.getByLabel('Email').click(); |
| | await page.getByLabel('Email').fill(user.email); |
| | await page.getByLabel('Email').press('Tab'); |
| | await page.getByTestId('password').click(); |
| | await page.getByTestId('password').fill(user.password); |
| | await page.getByTestId('confirm_password').click(); |
| | await page.getByTestId('confirm_password').fill(user.password); |
| | await page.getByLabel('Submit registration').click(); |
| | } |
| |
|
| | async function logout(page: Page) { |
| | await page.getByTestId('nav-user').click(); |
| | await page.getByRole('button', { name: 'Log out' }).click(); |
| | } |
| |
|
| | async function login(page: Page, user: User) { |
| | await page.locator('input[name="email"]').fill(user.email); |
| | await page.locator('input[name="password"]').fill(user.password); |
| | await page.locator('input[name="password"]').press('Enter'); |
| | } |
| |
|
| | async function authenticate(config: FullConfig, user: User) { |
| | console.log('π€: global setup has been started'); |
| | const { baseURL, storageState } = config.projects[0].use; |
| | console.log('π€: using baseURL', baseURL); |
| | console.dir(user, { depth: null }); |
| | const browser = await chromium.launch({ |
| | headless: false, |
| | }); |
| | try { |
| | const page = await browser.newPage(); |
| | console.log('π€: π authenticating user:', user.email); |
| |
|
| | if (!baseURL) { |
| | throw new Error('π€: baseURL is not defined'); |
| | } |
| |
|
| | |
| | await page.context().addInitScript(() => { |
| | localStorage.setItem('navVisible', 'true'); |
| | }); |
| | console.log('π€: βοΈ localStorage: set Nav as Visible', storageState); |
| |
|
| | await page.goto(baseURL, { timeout }); |
| | await register(page, user); |
| | try { |
| | await page.waitForURL(`${baseURL}/c/new`, { timeout }); |
| | } catch (error) { |
| | console.error('Error:', error); |
| | const userExists = page.getByTestId('registration-error'); |
| | if (userExists) { |
| | console.log('π€: π¨ user already exists'); |
| | await cleanupUser(user); |
| | await page.goto(baseURL, { timeout }); |
| | await register(page, user); |
| | } else { |
| | throw new Error('π€: π¨ user failed to register'); |
| | } |
| | } |
| | console.log('π€: βοΈ user successfully registered'); |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | await login(page, user); |
| | await page.waitForURL(`${baseURL}/c/new`, { timeout }); |
| | console.log('π€: βοΈ user successfully authenticated'); |
| |
|
| | await page.context().storageState({ path: storageState as string }); |
| | console.log('π€: βοΈ authentication state successfully saved in', storageState); |
| | |
| | |
| | } finally { |
| | await browser.close(); |
| | console.log('π€: global setup has been finished'); |
| | } |
| | } |
| |
|
| | export default authenticate; |
| |
|