58 lines
2.5 KiB
TypeScript
58 lines
2.5 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { login } from './helpers/auth';
|
|
|
|
test.describe('Dashboard', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await login(page);
|
|
});
|
|
|
|
test('dashboard page loads with correct title', async ({ page }) => {
|
|
await expect(page.locator('h1:has-text("Dashboard")')).toBeVisible();
|
|
await expect(page.locator('text=Overview of your ISP operations')).toBeVisible();
|
|
});
|
|
|
|
test('KPI cards render after loading', async ({ page }) => {
|
|
// Wait for skeletons to disappear
|
|
await page.waitForSelector('.skeleton', { state: 'detached', timeout: 15000 }).catch(() => {});
|
|
await expect(page.locator('text=Total Clients')).toBeVisible();
|
|
await expect(page.locator('text=Active Subscriptions')).toBeVisible();
|
|
await expect(page.locator('text=Overdue Invoices')).toBeVisible();
|
|
});
|
|
|
|
test('revenue card and chart only visible to admin', async ({ page }) => {
|
|
// Admin login — revenue card should show
|
|
await page.waitForSelector('.skeleton', { state: 'detached', timeout: 15000 }).catch(() => {});
|
|
await expect(page.locator('text=Monthly Revenue')).toBeVisible();
|
|
await expect(page.locator('text=Revenue Overview')).toBeVisible();
|
|
});
|
|
|
|
test('recent tickets section renders', async ({ page }) => {
|
|
await expect(page.locator('text=Recent Tickets')).toBeVisible();
|
|
await expect(page.locator('text=View all →')).toBeVisible();
|
|
});
|
|
|
|
test('refresh button works without crash', async ({ page }) => {
|
|
await page.click('button:has-text("Refresh")');
|
|
// Should not crash — page still has dashboard title
|
|
await expect(page.locator('h1:has-text("Dashboard")')).toBeVisible();
|
|
});
|
|
|
|
test('New Client button navigates to clients', async ({ page }) => {
|
|
// Wait for dashboard to fully render before interacting
|
|
await expect(page.locator('h1:has-text("Dashboard")')).toBeVisible();
|
|
// Use data-testid if available (post-deploy), fall back to text selector
|
|
const btn = page.locator('[data-testid="new-client-btn"], button:has-text("+ New Client")').first();
|
|
await expect(btn).toBeVisible({ timeout: 10000 });
|
|
await btn.click();
|
|
await expect(page).toHaveURL(/\/clients/);
|
|
});
|
|
|
|
test('KPI card click navigates correctly', async ({ page }) => {
|
|
await page.waitForSelector('.skeleton', { state: 'detached', timeout: 15000 }).catch(() => {});
|
|
// Click Total Clients card
|
|
const clientsCard = page.locator('text=Total Clients').first();
|
|
await clientsCard.click();
|
|
await expect(page).toHaveURL(/\/clients/);
|
|
});
|
|
});
|