Date: February 17, 2026 Status: TESTED — 28/31 automated E2E tests passing (90%)
File: tests/playwright/lms-functional.spec.ts
Run: npx playwright test tests/playwright/lms-functional.spec.ts --project=desktop-chromium
| Group | Tests | Passed | Failed | Notes |
|---|---|---|---|---|
| Authentication Flow | 7 | 7 | 0 | All roles login, signup, redirect |
| Student Dashboard | 6 | 4 | 2 | Intermittent timeout under parallel load |
| Teacher Dashboard | 3 | 3 | 0 | Dashboard, course creation form |
| Admin Dashboard | 2 | 1 | 1 | Intermittent timeout under parallel load |
| Multi-Tenant | 5 | 5 | 0 | Isolation, join-school, pricing |
| Internationalization | 3 | 3 | 0 | Locale routing, Spanish login |
| Payments | 4 | 4 | 0 | Pricing, manual checkout, payment requests |
| Total | 31 | 28 | 3 | 90% pass rate |
All 3 failures are page.goto timeouts caused by dev server load under 4 parallel workers — not actual bugs. They pass when run individually.
Student Dashboard > lesson complete toggle is interactive— goto timeoutStudent Dashboard > browse courses shows courses for tenant— goto timeoutAdmin Dashboard > admin can access teacher course creation— goto timeout
| Password | Role | Tenant | |
|---|---|---|---|
student@e2etest.com |
password123 | student | Default School (lvh.me) |
owner@e2etest.com |
password123 | teacher | Default School (lvh.me) |
creator@codeacademy.com |
password123 | admin | Code Academy Pro |
alice@student.com |
password123 | student | Code Academy Pro |
All tests use data-testid attributes for reliable selectors. IDs added to:
| Component | Test IDs |
|---|---|
components/login-form.tsx |
login-title, login-email, login-password, login-submit |
components/sign-up-form.tsx |
signup-title, signup-email, signup-password, signup-repeat-password, signup-submit |
components/student/welcome-hero.tsx |
welcome-hero |
app/[locale]/dashboard/student/page.tsx |
student-dashboard |
app/[locale]/dashboard/student/courses/page.tsx |
student-courses-page, my-courses-title |
app/[locale]/dashboard/student/browse/page.tsx |
browse-courses-page, browse-title, browse-course-count |
app/[locale]/dashboard/teacher/page.tsx |
teacher-dashboard, teacher-welcome |
app/[locale]/dashboard/admin/page.tsx |
admin-dashboard, admin-stats-grid |
app/[locale]/(public)/pricing/page.tsx |
pricing-title |
app/[locale]/checkout/manual/page.tsx |
manual-checkout-title |
app/[locale]/dashboard/student/payments/page.tsx |
payments-page, payments-title |
app/[locale]/join-school/page.tsx |
join-school-title |
BASE = http://lvh.me:3000 # Default School
TENANT_BASE = http://code-academy.lvh.me:3000 # Code Academy Pro
Requires NEXT_PUBLIC_PLATFORM_DOMAIN=lvh.me:3000 in .env.local.
- Login page displays correctly (all form elements visible)
- Login as student → redirects to
/dashboard/student - Login as teacher → redirects to
/dashboard/teacher - Login as admin → redirects to
/dashboard/admin(on tenant subdomain) - Invalid credentials stay on login page
- Sign-up page accessible with all form fields
- Role-based redirect:
/dashboard→/dashboard/student
- Dashboard loads with welcome hero
- View enrolled courses page
- Navigate to course detail
- Browse courses shows courses for tenant
- View lesson content with complete toggle (timeout, passes individually)
- Lesson complete toggle is interactive (timeout, passes individually)
- Teacher dashboard loads with welcome message
- Navigate to create new course form
- Course creation form has title, description, status fields
- Admin dashboard loads with stats grid
- Admin can access teacher course creation (timeout, passes individually)
- Platform root (lvh.me) loads
- Subdomain shows Code Academy Pro
- Default tenant sees only its 2 courses (no Python for Beginners)
- Code Academy tenant sees only its 1 course (Python for Beginners)
- Non-member redirected to join-school or login
- Default route includes
/enlocale segment -
/es/locale route loads - Login page works in Spanish locale
- Pricing page renders (requires auth)
- Tenant pricing shows tenant plans (Code Academy Pro Monthly)
- Manual checkout page renders for product (Python for Beginners $49.99)
- Student can view payment requests
Features tested manually via browser on Feb 17, 2026:
- Password reset flow — Form submits, "Check Your Email" confirmation shown
- Post comment on lesson — Comment posted, shows with Like/Reply buttons
- Submit course review — 4-star review submitted (after fixing
handle_review_posted_xptrigger:NEW.id->NEW.review_id) - Publish course (teacher) — Course settings page loads with status dropdown, Update Course button works
- View all users (admin) — 4 users in table with Roles/View actions (minor: search placeholder shows raw i18n key)
- View transactions (admin UI) — Page loads with stats cards and table (shows $0 for tenant-scoped view)
- View enrollments (admin UI) — 1 active enrollment shown (minor: student name shows "Unknown")
- Exam submission flow — Results page shows questions, answers, scores, "Pending Review" for free text
- Gamification header bar — Level 3, Day Streak, Coins display in header
- Point Store page — Loads with balance display (store empty, DB error on
gamification_store_items) - Student profile — Account details, billing history, certificates, achievements sections
- Edit lesson content (teacher) — NOTE:
crypto.randomUUIDissue is in dependency, not source code - Progress Report page — FIXED: Route
/dashboard/student/progressimplemented - Certificates page — FIXED: Route
/dashboard/student/certificatesimplemented - Stripe checkout — Not configured locally
| Bug | Severity | Fix Applied? |
|---|---|---|
handle_review_posted_xp trigger references NEW.id instead of NEW.review_id |
P1 | Yes (migration: fix_review_posted_xp_trigger) |
BlockEditor crypto.randomUUID() fails on HTTP (non-secure context) |
P2 | Not in source code — dependency issue only |
Point Store query fails on gamification_store_items (column error 42703) |
P2 | Not a code bug — DB migration issue (run supabase db push) |
| Admin Users search placeholder shows raw i18n key | P3 | Yes — keys already exist |
| Admin Enrollments shows "Unknown" for student name | P3 | Yes — profiles join + email fetch added |
| Progress Report page is 404 | P2 | Yes — route implemented |
| Certificates page is 404 | P2 | Yes — route implemented |
# Run full suite
npx playwright test tests/playwright/lms-functional.spec.ts --project=desktop-chromium
# Run with UI
npx playwright test tests/playwright/lms-functional.spec.ts --ui
# Run single test
npx playwright test -g "login page displays correctly"
# Run a test group
npx playwright test -g "Authentication Flow"In addition to the functional test suite above, there are 4 security-focused test files in tests/playwright/:
| File | Tests | Priority | Focus |
|---|---|---|---|
multi-tenant-isolation.spec.ts |
8 | P0 | Cross-tenant data isolation, RLS enforcement |
authentication-security.spec.ts |
6 | P0 | Auth flows, session handling, role enforcement |
payment-security.spec.ts |
7 | P0 | Payment integrity, Stripe webhook validation |
comprehensive-security-audit.spec.ts |
26 | P1/P2 | Broad security coverage across all features |
Total security tests: 47
The following newer features do not yet have automated test coverage:
- Puck landing page builder — visual editor, templates, publish flow
- Guided tours — Driver.js onboarding tours for dashboards and editors
- Onboarding wizard — new school setup wizard
- Invitation system — user invitations with role assignment
- Aristotle AI tutor — AI-powered student assistance
- Artifact/voice exercises — interactive exercise types
- Block editor — visual lesson content editor (22 block types)
Last Updated: March 2026 Tester: Claude Code + Playwright