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 }); }); });