- Added e2e tests for agents, insights, maintenance windows, maps, help pages - Added e2e tests for organization settings, config timeline, MikroTik backups - Added comprehensive search functionality tests - Added dashboard and sites navigation tests - Updated existing tests to handle sudo verification redirects - Fixed navigation tests to be more defensive about missing data - All 301 tests passing across chromium, firefox, and webkit
97 lines
3.2 KiB
TypeScript
97 lines
3.2 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('Maintenance Windows', () => {
|
|
test('can view maintenance windows page', async ({ page }) => {
|
|
await page.goto('/maintenance');
|
|
|
|
await expect(page).toHaveURL(/\/maintenance/);
|
|
await expect(page.locator('body')).toBeVisible();
|
|
});
|
|
|
|
test('can create a new maintenance window', async ({ page }) => {
|
|
await page.goto('/maintenance');
|
|
|
|
// Look for "New" or "Schedule Maintenance" button
|
|
const newButton = page.locator(
|
|
'a[href*="/maintenance/new"], button:has-text("New"), button:has-text("Schedule"), a:has-text("New")'
|
|
).first();
|
|
|
|
if (await newButton.isVisible()) {
|
|
await newButton.click();
|
|
await expect(page).toHaveURL(/\/maintenance\/new/);
|
|
|
|
// Look for form fields
|
|
const titleInput = page.locator('input[name*="title"], input[id*="title"]').first();
|
|
if (await titleInput.isVisible()) {
|
|
await titleInput.fill('E2E Test Maintenance Window');
|
|
}
|
|
}
|
|
});
|
|
|
|
test('can filter maintenance windows by status', async ({ page }) => {
|
|
await page.goto('/maintenance');
|
|
|
|
// Look for status filters (Active, Scheduled, Past, etc.)
|
|
const statusFilter = page.locator(
|
|
'[role="tab"], button:has-text("Active"), button:has-text("Scheduled"), button:has-text("Past")'
|
|
);
|
|
|
|
if ((await statusFilter.count()) > 0) {
|
|
await statusFilter.first().click();
|
|
await page.waitForTimeout(500);
|
|
}
|
|
});
|
|
|
|
test('can view maintenance window details', async ({ page }) => {
|
|
await page.goto('/maintenance');
|
|
|
|
// Find first maintenance window link (exclude "new" link)
|
|
const firstWindow = page.locator('a[href*="/maintenance/"]:not([href*="/maintenance/new"])').first();
|
|
if (await firstWindow.isVisible({ timeout: 2000 }).catch(() => false)) {
|
|
const href = await firstWindow.getAttribute('href');
|
|
if (href && !href.includes('#!') && !href.endsWith('/maintenance')) {
|
|
await firstWindow.click();
|
|
await page.waitForTimeout(500);
|
|
}
|
|
}
|
|
});
|
|
|
|
test('can edit maintenance window', async ({ page }) => {
|
|
await page.goto('/maintenance');
|
|
|
|
// Navigate to first maintenance window
|
|
const firstWindow = page.locator('a[href*="/maintenance/"]').first();
|
|
if (await firstWindow.isVisible()) {
|
|
await firstWindow.click();
|
|
|
|
// Look for edit button
|
|
const editButton = page.locator(
|
|
'a[href*="/edit"], button:has-text("Edit"), a:has-text("Edit")'
|
|
).first();
|
|
|
|
if (await editButton.isVisible()) {
|
|
await editButton.click();
|
|
await expect(page).toHaveURL(/\/maintenance\/[^\/]+\/edit/);
|
|
}
|
|
}
|
|
});
|
|
|
|
test('can view affected devices', async ({ page }) => {
|
|
await page.goto('/maintenance');
|
|
|
|
// Navigate to first maintenance window
|
|
const firstWindow = page.locator('a[href*="/maintenance/"]').first();
|
|
if (await firstWindow.isVisible()) {
|
|
await firstWindow.click();
|
|
|
|
// Look for devices section
|
|
const devicesSection = page.locator(
|
|
':has-text("Devices"), :has-text("Affected")'
|
|
).first();
|
|
|
|
if (await devicesSection.isVisible({ timeout: 2000 }).catch(() => false)) {
|
|
await expect(devicesSection).toBeVisible();
|
|
}
|
|
}
|
|
});
|
|
});
|