New zt-gateway-setup script with subcommands for configuring this router as a ZeroTier exit gateway: bridge, routing (tables 100/101), DHCP, hotplug, and persistence. Exposes setup ubus method via backend with ACL and LuCI panel in overview. Also fixes two pre-existing test issues: - overview.spec.ts: active gateway radio is intentionally enabled (users need to re-trigger switch for the already-selected gateway) - drain.spec.ts: stubs drain status via page.route() since Docker has no real conntrack entries; fixed Playwright glob pattern bug where **/ubus* fails to match /ubus/?timestamp (regex needed)
35 lines
1.3 KiB
TypeScript
35 lines
1.3 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { login } from './utils/auth';
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await login(page);
|
|
await page.goto('/cgi-bin/luci/admin/services/zt-gateway');
|
|
await page.waitForSelector('#zt-gateway-root', { timeout: 15_000 });
|
|
});
|
|
|
|
test('displays gateway table with correct rows', async ({ page }) => {
|
|
const root = page.locator('#zt-gateway-root');
|
|
await expect(root).toBeVisible();
|
|
|
|
const rows = page.locator('.zt-gateways tbody tr.zt-gateway-row');
|
|
await expect(rows).toHaveCount(3);
|
|
|
|
await expect(page.locator('.zt-gateway-row[data-region="amsterdam"]')).toContainText('Amsterdam');
|
|
await expect(page.locator('.zt-gateway-row[data-region="tirunelveli"]')).toContainText('Tirunelveli');
|
|
|
|
const activeRow = page.locator('.zt-gateway-row', { hasText: 'active' });
|
|
await expect(activeRow).toHaveCount(1);
|
|
});
|
|
|
|
test('active gateway radio is enabled', async ({ page }) => {
|
|
const activeRow = page.locator('.zt-gateway-row', { hasText: 'active' });
|
|
const radio = activeRow.locator('input[type=radio]');
|
|
await expect(radio).toBeEnabled();
|
|
});
|
|
|
|
test('non-active gateway radios are enabled', async ({ page }) => {
|
|
const tirunelveliRow = page.locator('.zt-gateway-row[data-region="tirunelveli"]');
|
|
const radio = tirunelveliRow.locator('input[type=radio]');
|
|
await expect(radio).toBeEnabled();
|
|
});
|