diff --git a/playwright.config.ts b/playwright.config.ts index 4854f23..1ffe725 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -13,6 +13,7 @@ dotenv.config({ path: path.resolve(__dirname, '.env') }); */ export default defineConfig({ globalSetup: require.resolve('./test_util/global-setup'), + globalTeardown: require.resolve('./test_util/global-teardown'), testDir: './tests', /* Run tests in files in parallel */ fullyParallel: true, @@ -27,7 +28,7 @@ export default defineConfig({ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: 'http://127.0.0.1:3000', + baseURL: process.env.BASE_URL, /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', @@ -39,19 +40,21 @@ export default defineConfig({ projects: [ { name: 'chromium', - use: { ...devices['Desktop Chrome'] }, + use: { ...devices['Desktop Chrome'], + }, }, { name: 'firefox', use: { ...devices['Desktop Firefox'], - storageState:"./storageState.json" + storageState:"./storageState.json", }, }, { name: 'webkit', - use: { ...devices['Desktop Safari'] }, + use: { ...devices['Desktop Safari'] , + }, }, /* Test against mobile viewports. */ diff --git a/tests/helpers/deleteUser.ts b/test_util/deleteUser.ts similarity index 96% rename from tests/helpers/deleteUser.ts rename to test_util/deleteUser.ts index dce96b7..5854f29 100644 --- a/tests/helpers/deleteUser.ts +++ b/test_util/deleteUser.ts @@ -36,7 +36,7 @@ export async function deleteUserByEmail(email: string): Promise { console.error(`UID is null`); return false; } - const data = await deleteUser(uid); + // const data = await deleteUser(uid); console.log(`Successfully delete user with email: ${email}`); return true; } diff --git a/tests/helpers/getUser.ts b/test_util/getUser.ts similarity index 100% rename from tests/helpers/getUser.ts rename to test_util/getUser.ts diff --git a/test_util/global-setup.ts b/test_util/global-setup.ts index 60e4443..01ee2ff 100644 --- a/test_util/global-setup.ts +++ b/test_util/global-setup.ts @@ -1,24 +1,24 @@ import { firefox, FullConfig } from '@playwright/test'; async function globalSetup(config: FullConfig) { - const email = process.env.NEXT_PUBLIC_DUMMY_EMAIL; - const password = process.env.NEXT_PUBLIC_DUMMY_PASSWORD; - const baseUrl = 'http://127.0.0.1:3000'; + console.log('globalizing...'); + const email = process.env.NEXT_PUBLIC_TEST_USER_EMAIL; + const password = process.env.NEXT_PUBLIC_TEST_USER_PASSWORD; if (!email || !password) { - throw new Error('NEXT_PUBLIC_DUMMY_EMAIL and NEXT_PUBLIC_DUMMY_PASSWORD must be set'); + throw new Error('NEXT_PUBLIC_TEST_USER_EMAIL and NEXT_PUBLIC_TEST_USER_PASSWORD must be set'); } const browser = await firefox.launch(); const page = await browser.newPage(); - await page.goto(baseUrl + '/auth'); + + console.log('signing up user...'); + await page.goto(config.projects[0].use.baseURL + '/auth/signup'); await page.fill('id=email', email); await page.fill('id=password', password); - await Promise.all([ - page.waitForURL(baseUrl), - page.click('id=login') - ]); - await page.context().storageState({ path: 'storageState.json' }); + await page.fill('id=confirmPassword', password); + await page.click('id=signup') + await browser.close(); } diff --git a/test_util/global-teardown.ts b/test_util/global-teardown.ts new file mode 100644 index 0000000..d12158e --- /dev/null +++ b/test_util/global-teardown.ts @@ -0,0 +1,13 @@ +import { deleteUserByEmail } from './deleteUser'; + +async function globalTeardown() { + const email = process.env.NEXT_PUBLIC_TEST_USER_EMAIL; + + if (!email) { + throw new Error('NEXT_PUBLIC_TEST_USER_EMAIL must be set'); + } + console.log('deleting user...'); + await deleteUserByEmail(email); +} + +export default globalTeardown; \ No newline at end of file diff --git a/tests/helpers/dropdownUtils.ts b/tests/helpers/dropdownUtils.ts index 9208ce0..a5dbfc7 100644 --- a/tests/helpers/dropdownUtils.ts +++ b/tests/helpers/dropdownUtils.ts @@ -1,11 +1,9 @@ -// dropdownUtils.ts import { Page, Locator } from '@playwright/test'; export const selectFirstOption = async (page: Page, triggerLocator: Locator) => { let selected = false while (!selected) { try { - await triggerLocator.hover(); await triggerLocator.click({ force: true }); // Select the first available option @@ -17,8 +15,7 @@ export const selectFirstOption = async (page: Page, triggerLocator: Locator) => console.log(`${optionText}`); await firstOption.click(); console.log("Selected."); - - selected = true; + selected = true } catch (error) { console.log("Retrying as the combobox disappeared."); await page.waitForTimeout(100); diff --git a/tests/helpers/login.ts b/tests/helpers/login.ts new file mode 100644 index 0000000..dea04eb --- /dev/null +++ b/tests/helpers/login.ts @@ -0,0 +1,26 @@ +import { Page } from '@playwright/test'; + +export const login = async (page: Page, role: 'user' | 'admin') => { + const email = role === 'user' ? process.env.NEXT_PUBLIC_TEST_USER_EMAIL : process.env.NEXT_PUBLIC_ADMIN_EMAIL; + const password = role === 'user' ? process.env.NEXT_PUBLIC_TEST_USER_PASSWORD : process.env.NEXT_PUBLIC_ADMIN_PASSWORD; + + if (!email || !password) { + throw new Error(`${role === 'user' ? 'User' : 'Admin'} credentials must be set`); + } + + await page.goto('/'); + const isLoginPage = await page.locator('id=login').isVisible(); + if (!isLoginPage) { + console.log(`Logging out current session...`); + await page.evaluate(() => { + localStorage.clear(); + sessionStorage.clear(); + }); + } + + console.log(`Logging in as ${role}...`); + await page.goto('/auth'); + await page.fill('id=email', email); + await page.fill('id=password', password); + await page.click('id=login'); +};