76 lines
3.9 KiB
TypeScript
76 lines
3.9 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { loginAs, navigateTo, expectSidebarLink } from '../helpers/auth';
|
|
import { APP_URL } from '../helpers/api';
|
|
|
|
test.describe('OU Admin — acceso a gestión sin infraestructura', () => {
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await loginAs(page, 'ouAdmin');
|
|
});
|
|
|
|
// ── Sidebar ─────────────────────────────────────────────────────────────────
|
|
test.describe('Sidebar', () => {
|
|
test('ve /groups', async ({ page }) => expectSidebarLink(page, '/groups', true));
|
|
test('ve /dhcp-servers', async ({ page }) => expectSidebarLink(page, '/dhcp-servers', true));
|
|
test('ve /boot-servers', async ({ page }) => expectSidebarLink(page, '/boot-servers', true));
|
|
test('ve /calendars', async ({ page }) => expectSidebarLink(page, '/calendars', true));
|
|
test('ve /repositories', async ({ page }) => expectSidebarLink(page, '/repositories', true));
|
|
test('ve /menus', async ({ page }) => expectSidebarLink(page, '/menus', true));
|
|
});
|
|
|
|
// ── Rutas permitidas ─────────────────────────────────────────────────────────
|
|
test.describe('Rutas — puede acceder', () => {
|
|
const allowed = [
|
|
'/groups', '/commands', '/dhcp-servers', '/boot-servers',
|
|
'/calendars', '/repositories', '/pxe',
|
|
];
|
|
for (const route of allowed) {
|
|
test(`accede a ${route}`, async ({ page }) => {
|
|
const finalUrl = await navigateTo(page, route);
|
|
expect(finalUrl).toContain(route);
|
|
});
|
|
}
|
|
});
|
|
|
|
// ── Rutas bloqueadas (solo super-admin) ──────────────────────────────────────
|
|
test.describe('Rutas — redirige a /groups cuando accede a rutas de super-admin', () => {
|
|
const blocked = ['/users', '/roles', '/env-vars', '/import-legacy'];
|
|
for (const route of blocked) {
|
|
test(`${route} → redirige a /groups`, async ({ page }) => {
|
|
const finalUrl = await navigateTo(page, route);
|
|
expect(finalUrl).toContain('/groups');
|
|
});
|
|
}
|
|
});
|
|
|
|
// ── GUI: botones de infraestructura OCULTOS ──────────────────────────────────
|
|
test('NO ve el botón "Añadir OU" en /groups (solo ou-admin no puede crear desde aquí... wait, sí puede)', async ({ page }) => {
|
|
await page.goto(`${APP_URL}/groups`);
|
|
// ou-admin SÍ ve el botón de añadir OU (no es ou-operator ni ou-minimal)
|
|
const addOuBtn = page.locator('button.action-button').first();
|
|
await expect(addOuBtn).toBeVisible({ timeout: 5_000 });
|
|
});
|
|
|
|
test('NO ve botón crear en /dhcp-servers (solo super-admin puede crear servidores DHCP)', async ({ page }) => {
|
|
await page.goto(`${APP_URL}/dhcp-servers`);
|
|
await page.waitForLoadState('networkidle');
|
|
// El botón de añadir dhcp tiene *ngIf="auth.isSuperAdmin" → no debe aparecer
|
|
const addBtn = page.locator('button[color="primary"]').filter({ hasText: /add|añadir/i });
|
|
await expect(addBtn).not.toBeAttached({ timeout: 5_000 });
|
|
});
|
|
|
|
test('NO ve botón crear en /boot-servers (solo super-admin)', async ({ page }) => {
|
|
await page.goto(`${APP_URL}/boot-servers`);
|
|
await page.waitForLoadState('networkidle');
|
|
const addBtn = page.locator('button').filter({ hasText: /add|añadir/i }).first();
|
|
await expect(addBtn).not.toBeAttached({ timeout: 5_000 });
|
|
});
|
|
|
|
test('NO ve botón crear en /commands (solo super-admin)', async ({ page }) => {
|
|
await page.goto(`${APP_URL}/commands`);
|
|
await page.waitForLoadState('networkidle');
|
|
const addBtn = page.locator('button.action-button');
|
|
await expect(addBtn).not.toBeAttached({ timeout: 5_000 });
|
|
});
|
|
});
|