import { test, expect } from '@playwright/test'; import { login, DEMO } from './helpers/auth'; test.describe('Authentication', () => { test('login page renders correctly', async ({ page }) => { await page.goto('/login'); await expect(page.locator('text=FiberOps')).toBeVisible(); await expect(page.locator('text=Sign in')).toBeVisible(); await expect(page.locator('input[type="email"]')).toBeVisible(); await expect(page.locator('input[type="password"]')).toBeVisible(); }); test('login with valid credentials redirects to dashboard', async ({ page }) => { await login(page); // Should have left the login page expect(page.url()).not.toContain('/login'); }); test('login with wrong credentials stays on login', async ({ page }) => { await page.goto('/login'); await page.locator('input[placeholder*="demo-isp"], input#tenantSlug').first().fill(DEMO.tenant); await page.locator('input[type="email"]').first().fill(DEMO.email); await page.locator('input[type="password"]').first().fill('wrongpassword'); await page.click('button[type="submit"]'); await page.waitForTimeout(3000); // Should stay on login expect(page.url()).toContain('/login'); }); test('unauthenticated access redirects to login', async ({ page }) => { // Clear any stored auth await page.goto('/login'); await page.evaluate(() => localStorage.clear()); await page.goto('/dashboard'); await page.waitForTimeout(3000); expect(page.url()).toContain('/login'); }); test('logout returns to login', async ({ page }) => { await login(page); // Find and click logout const logoutBtn = page.locator('button:has-text("Logout"), a:has-text("Logout")').first(); await logoutBtn.click(); await page.waitForTimeout(3000); expect(page.url()).toContain('/login'); }); });