From 761d73c27f9e1d754886dfff53f1a5524c87a5f2 Mon Sep 17 00:00:00 2001 From: April Hall Date: Wed, 26 Feb 2025 02:07:28 -0500 Subject: [PATCH] feat: E2E Tests for change username --- .gitignore | 3 ++ bun.lockb | Bin 239724 -> 241190 bytes package.json | 5 +++- playwright.config.ts | 12 ++++++++ src/lib/components/user.svelte | 2 +- tests/updateUsername.spec.ts | 50 +++++++++++++++++++++++++++++++++ tests/utils.ts | 10 +++++++ 7 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 playwright.config.ts create mode 100644 tests/updateUsername.spec.ts create mode 100644 tests/utils.ts diff --git a/.gitignore b/.gitignore index a0e84f5..2f0291d 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ Thumbs.db !.env.example !.env.test +# Tests +test-results + # Vite vite.config.js.timestamp-* vite.config.ts.timestamp-* diff --git a/bun.lockb b/bun.lockb index 83707674c0cec51ea6bc5724cfcb579c14b12084..a78075dd655702a947637608382e46e61f653bc1 100755 GIT binary patch delta 35566 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
-

{data.user.username}

+

{data.user.username}

diff --git a/tests/updateUsername.spec.ts b/tests/updateUsername.spec.ts new file mode 100644 index 0000000..9171e30 --- /dev/null +++ b/tests/updateUsername.spec.ts @@ -0,0 +1,50 @@ +import { test, expect, type Page, type Locator } from '@playwright/test'; +import { login } from './utils'; + +test.describe.configure({ mode: 'parallel' }); +test.describe('Username Update Form', () => { + let page: Page; + let usernameInput: Locator; + let submitButton: Locator; + let currentUsernameElement: Locator; + const newUsername: string = 'testuser' + Math.floor(Math.random() * 10000); + + test.beforeEach(async ({ browser }) => { + page = await browser.newPage(); + // Initialize locators + usernameInput = page.locator('input#username'); + submitButton = page.getByRole('button', { name: 'Update Username' }); + currentUsernameElement = page.locator('#currentuser-username'); + + await login(page); + page.goto('http://localhost:5173/account'); + }); + + // Test that the username will change + test('should successfully update the username', async () => { + await usernameInput.fill(newUsername); + await submitButton.click(); + + // Check for success message + const successMessageLocator = page.locator('p.text-sm.text-green-500:has-text("Username updated.")'); + await expect(successMessageLocator).toBeVisible(); + + // Verify the username displayed in the UI has been updated + const updatedUsername: string = (await currentUsernameElement.textContent()) || ''; + expect(updatedUsername).toBe(newUsername); + }); + + // Test invalidator + test('should show validation error for invalid username', async () => { + await usernameInput.fill('a'); + await submitButton.click(); + + // Check for error message + const errorMessageLocator = page.locator('span.text-sm.text-red-500:has-text("Username must be at least 3 characters.")'); + await expect(errorMessageLocator).toBeVisible(); + + // Ensure the username wasn't updated + const currentUsername: string = (await currentUsernameElement.textContent()) || ''; + expect(currentUsername).not.toBe('a'); + }); +}); diff --git a/tests/utils.ts b/tests/utils.ts new file mode 100644 index 0000000..00192ec --- /dev/null +++ b/tests/utils.ts @@ -0,0 +1,10 @@ +import type { Page } from '@playwright/test'; + +export async function login(page: Page): Promise { + await page.goto('http://localhost:5174/login'); + await page.waitForLoadState('domcontentloaded'); + console.log('loaded'); + await page.fill('#email', 'playwright@playwright.com'); + await page.fill('#password', 'Password1234!'); + await page.click('button[type="submit"]'); +}