| 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; |
|
|