import { beforeEach, describe, expect, it, vi } from 'vitest' import { MODULOS, esRolValido, modulosDeRol } from './roles.js' // ---------- Prisma mockeado ---------- // modulosDeRol lee RolConfiguracion (BD) y cae a la MATRIZ estática cuando no // hay fila para el rol. Los permisos reales se editan desde la UI, así que la // BD viva cambia con el tiempo: estos tests fijan el contrato por defecto // (sin override en BD), que es lo que recibe una instalación nueva. const prismaMock = vi.hoisted(() => ({ rolConfiguracion: { findUnique: vi.fn() }, })) vi.mock('../services/prisma.js', () => ({ prisma: prismaMock })) beforeEach(() => { prismaMock.rolConfiguracion.findUnique.mockResolvedValue(null) }) const ESPERADOS: Record = { vendedor: ['mi-dia', 'alta-cliente', 'alta-afluencia', 'cotizador', 'mi-tablero', 'contactos', 'chat', 'clientes-maestro', 'captura', 'soporte'], administracion_venta: [ 'mi-dia', 'alta-cliente', 'alta-afluencia', 'cotizador', 'mi-tablero', 'contactos', 'chat', 'clientes-maestro', 'captura', 'soporte', 'cobranza', ], director_ventas: [ 'mi-dia', 'alta-cliente', 'alta-afluencia', 'cotizador', 'mi-tablero', 'contactos', 'chat', 'clientes-maestro', 'captura', 'soporte', 'cobranza', 'tablero-comercial', ], escrituracion: [ 'mi-dia', 'alta-cliente', 'alta-afluencia', 'cotizador', 'mi-tablero', 'contactos', 'chat', 'clientes-maestro', 'captura', 'soporte', 'cobranza', ], direccion_general: ['mi-dia', 'tablero-comercial', 'cobranza', 'chat', 'clientes-maestro', 'captura', 'soporte'], admin: [...MODULOS], } describe('modulosDeRol', () => { it.each(Object.entries(ESPERADOS))('rol %s devuelve exactamente su lista', async (rol, esperados) => { expect(await modulosDeRol(rol)).toEqual(esperados) }) it('roles legacy (coordinador, corporativo) se tratan como director_ventas', async () => { expect(await modulosDeRol('coordinador')).toEqual(ESPERADOS['director_ventas']) expect(await modulosDeRol('corporativo')).toEqual(ESPERADOS['director_ventas']) }) it('rol desconocido cae al fallback seguro (vendedor)', async () => { expect(await modulosDeRol('otro')).toEqual(ESPERADOS['vendedor']) expect(await modulosDeRol('')).toEqual(ESPERADOS['vendedor']) }) it('tolera mayúsculas y espacios', async () => { expect(await modulosDeRol(' Admin ')).toEqual([...MODULOS]) }) }) describe('esRolValido', () => { it('acepta solo los roles de la matriz nueva', () => { for (const rol of Object.keys(ESPERADOS)) expect(esRolValido(rol)).toBe(true) expect(esRolValido('coordinador')).toBe(false) expect(esRolValido('vendedorx')).toBe(false) }) })