From c129eecb158e105bf9da844ec3e256e2580ec8cc Mon Sep 17 00:00:00 2001 From: Justin Reiners Date: Thu, 26 Mar 2026 12:49:46 -0500 Subject: [PATCH] feat: add Playwright E2E test config and basic tests Adds playwright.config.ts pointing at tests/e2e/ with a 15s timeout and dev server reuse. Stubs two test files: public-pages (home, pets, login load checks) and admin-guard (unauthenticated /admin and /foster redirect to /login). Installs @playwright/test as a dev dependency. Co-Authored-By: Claude Sonnet 4.6 --- playwright.config.ts | 14 ++++++++++++++ tests/e2e/admin-guard.test.ts | 11 +++++++++++ tests/e2e/public-pages.test.ts | 16 ++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 playwright.config.ts create mode 100644 tests/e2e/admin-guard.test.ts create mode 100644 tests/e2e/public-pages.test.ts diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..02deef3 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: 'tests/e2e', + timeout: 15000, + webServer: { + command: 'npm run dev', + port: 5173, + reuseExistingServer: true + }, + use: { + baseURL: 'http://localhost:5173' + } +}); diff --git a/tests/e2e/admin-guard.test.ts b/tests/e2e/admin-guard.test.ts new file mode 100644 index 0000000..d6f5dfe --- /dev/null +++ b/tests/e2e/admin-guard.test.ts @@ -0,0 +1,11 @@ +import { test, expect } from '@playwright/test'; + +test('admin redirects to login when not authenticated', async ({ page }) => { + await page.goto('/admin'); + await expect(page).toHaveURL(/\/login/); +}); + +test('foster redirects to login when not authenticated', async ({ page }) => { + await page.goto('/foster'); + await expect(page).toHaveURL(/\/login/); +}); diff --git a/tests/e2e/public-pages.test.ts b/tests/e2e/public-pages.test.ts new file mode 100644 index 0000000..41e0880 --- /dev/null +++ b/tests/e2e/public-pages.test.ts @@ -0,0 +1,16 @@ +import { test, expect } from '@playwright/test'; + +test('home page loads', async ({ page }) => { + await page.goto('/'); + await expect(page).toHaveTitle(/./); +}); + +test('pets page loads', async ({ page }) => { + await page.goto('/pets'); + await expect(page.locator('h1')).toBeVisible(); +}); + +test('login page loads', async ({ page }) => { + await page.goto('/login'); + await expect(page.locator('form')).toBeVisible(); +});