82 lines
4.0 KiB
TypeScript
82 lines
4.0 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { login, BASE_URL } from '../../helpers/auth';
|
|
import { markPartial } from '../../helpers/manual';
|
|
|
|
test.describe('pbx-management', () => {
|
|
test('pbx-management-check-cli_management', async ({ page }, testInfo) => {
|
|
testInfo.annotations.push({ type: 'automationStatus', description: 'partial' });
|
|
testInfo.annotations.push({ type: 'testType', description: 'check' });
|
|
markPartial('CLI commands can be scripted via SSH automation (separate Node.js/shell step in CI); Playwright verifies the management web console if one exists. Full CLI coverage requires ssh2 integration alongside this test.');
|
|
testInfo.annotations.push({ type: 'description', description: 'Verify CLI management interface is accessible and key management commands execute correctly' });
|
|
|
|
await test.step('Navigate to admin portal — Web SSH / Console (if available)', async () => {
|
|
await login(page);
|
|
await page.goto(`${BASE_URL}/admin/console`);
|
|
});
|
|
|
|
await test.step('Verify web console loads or CLI section is accessible', async () => {
|
|
const pageText = await page.locator('body').textContent() ?? '';
|
|
const hasConsole = /console|terminal|ssh|cli/i.test(pageText);
|
|
// If no web console, note it — CLI testing must be done via separate SSH step
|
|
testInfo.annotations.push({
|
|
type: 'note',
|
|
description: hasConsole
|
|
? 'Web console found — proceed with command verification'
|
|
: 'No web console detected — CLI testing must be done via SSH in CI pipeline',
|
|
});
|
|
});
|
|
|
|
// TODO_MANUAL / TODO_SSH: Connect via SSH and verify these commands execute successfully:
|
|
// - `pbx-ctl status` → shows all services running
|
|
// - `pbx-ctl restart sip` → restarts SIP service without error
|
|
// - `pbx-cli show version` → shows correct version string
|
|
// - `pbx-cli show extensions` → lists all extensions
|
|
// - `pbx-cli show calls` → shows current active calls (empty if no calls)
|
|
});
|
|
|
|
test('pbx-management-check-gui_management', async ({ page }, testInfo) => {
|
|
testInfo.annotations.push({ type: 'automationStatus', description: 'automated' });
|
|
testInfo.annotations.push({ type: 'testType', description: 'check' });
|
|
testInfo.annotations.push({ type: 'description', description: 'Verify GUI admin portal is accessible, all main sections load correctly, and management actions are functional' });
|
|
|
|
await test.step('Login to admin portal', async () => {
|
|
await login(page);
|
|
});
|
|
|
|
const sections = [
|
|
{ name: 'Dashboard', path: '/admin/dashboard' },
|
|
{ name: 'Extensions', path: '/admin/extensions' },
|
|
{ name: 'Trunks', path: '/admin/trunks' },
|
|
{ name: 'Dial Plans', path: '/admin/dialplans' },
|
|
{ name: 'Conferences', path: '/admin/conferences' },
|
|
{ name: 'Ring Groups', path: '/admin/ring-groups' },
|
|
{ name: 'IVR', path: '/admin/ivr' },
|
|
{ name: 'Voicemail', path: '/admin/voicemail' },
|
|
{ name: 'Backup', path: '/admin/backup' },
|
|
{ name: 'Security', path: '/admin/security' },
|
|
{ name: 'Logs', path: '/admin/logs' },
|
|
{ name: 'Settings', path: '/admin/settings' },
|
|
];
|
|
|
|
for (const section of sections) {
|
|
await test.step(`Verify "${section.name}" section is accessible`, async () => {
|
|
const response = await page.goto(`${BASE_URL}${section.path}`);
|
|
expect(
|
|
response?.status(),
|
|
`Section "${section.name}" returned HTTP ${response?.status()}`,
|
|
).toBeLessThan(500);
|
|
await expect(page.locator('body')).not.toContainText(/500 internal server error/i);
|
|
});
|
|
}
|
|
|
|
await test.step('Verify navigation menu is displayed', async () => {
|
|
await page.goto(`${BASE_URL}/admin/dashboard`);
|
|
await expect(page.locator('nav, .sidebar, .menu').first()).toBeVisible();
|
|
});
|
|
|
|
await test.step('Verify user info / logout option is visible', async () => {
|
|
await expect(page.locator('body')).toContainText(/logout|log out|sign out|admin/i);
|
|
});
|
|
});
|
|
});
|