diff --git a/.gitignore b/.gitignore index 1b095bf..eddfdda 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,10 @@ composer.lock # PHPUnit .phpunit.result.cache +# Playwright +test-results/ +playwright-report/ + # OS / Editor Files .DS_Store Thumbs.db diff --git a/src/pages/profile.html b/src/pages/profile.html index 000873b..054b13d 100644 --- a/src/pages/profile.html +++ b/src/pages/profile.html @@ -1,10 +1,10 @@ -
+

Profile

- Sign out -

Name: {{user.name}}

+

Name: {{user.name}}

diff --git a/src/pages/register.html b/src/pages/register.html index d1ff6e7..4ab678f 100644 --- a/src/pages/register.html +++ b/src/pages/register.html @@ -1,4 +1,4 @@ -
+

Register

diff --git a/test/e2e/auth.spec.js b/test/e2e/auth.spec.js new file mode 100644 index 0000000..00fd782 --- /dev/null +++ b/test/e2e/auth.spec.js @@ -0,0 +1,52 @@ +import { expect, test } from '@playwright/test'; + +test('registers, signs out, rejects a bad password, and logs back in', async ({ page }) => { + await page.route(/^https?:\/\/(?!(127\.0\.0\.1|localhost)(:\d+)?\/).*/, (route) => { + route.abort(); + }); + + const suffix = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`; + const username = `e2euser${suffix}`; + const password = `pass-${suffix}`; + + await page.goto('/register'); + const registerView = page.getByTestId('register-view'); + await expect(registerView).toBeVisible(); + + await registerView.getByTestId('register-username-input').fill(username); + await registerView.getByTestId('register-password-input').fill(password); + await registerView.getByTestId('register-submit').click(); + + const createView = page.getByTestId('create-view'); + await expect(createView).toBeVisible(); + await expect(createView).toContainText(`Created By ${username}`); + + await page.getByRole('link', { name: /profile/i }).click(); + const profileView = page.getByTestId('profile-view'); + await expect(profileView).toBeVisible(); + await expect(profileView.getByTestId('profile-name')).toHaveText(`Name: ${username}`); + + await profileView.getByTestId('sign-out').click(); + await expect(page.getByRole('link', { name: /^register/i })).toBeVisible(); + + await page.goto('/register'); + await registerView.getByTestId('login-username-input').fill(username); + await registerView.getByTestId('login-password-input').fill(`${password}-wrong`); + await registerView.getByTestId('login-submit').click(); + await expect(registerView.getByTestId('login-error')).toBeVisible(); + + await registerView.getByTestId('login-password-input').fill(password); + await registerView.getByTestId('login-remember-input').check(); + await registerView.getByTestId('login-submit').click(); + + await expect(profileView).toBeVisible(); + await expect(profileView.getByTestId('profile-name')).toHaveText(`Name: ${username}`); + + await page.reload(); + await expect(registerView.getByTestId('signed-in-message')).toHaveText( + `Thank you for signing in as ${username}.` + ); + await page.getByRole('link', { name: /profile/i }).click(); + await expect(profileView).toBeVisible(); + await expect(profileView.getByTestId('profile-name')).toHaveText(`Name: ${username}`); +});