feat(alta): borrador, pre-llenado desde cotización y liga remota de firma
- Borradores por vendedor (guardar/continuar/eliminar), se limpia al registrar - Pre-llenado con ?cotizacion=<id> (cliente, contacto, proyecto, montos); botón 'Iniciar alta' en Mis cotizaciones del cotizador - Liga remota pública /client/firma/<token> (JWT scope firma-remota, 72h, rate limit, solo datos mínimos sin PLD): firma digital + subida de documentos que prende checkboxes en Monday Apartado - Tokens de liga no sirven como sesión y viceversa - Tests: api 228, alta 82, cotizador 82
This commit is contained in:
@@ -80,6 +80,36 @@ describe('authMiddleware (AUTH_ENABLED=true)', () => {
|
||||
expect(next).toHaveBeenCalledOnce()
|
||||
})
|
||||
|
||||
it('deja pasar los endpoints públicos de la liga de firma remota (el scope se verifica en el controlador)', () => {
|
||||
const casos: Partial<Request>[] = [
|
||||
{ method: 'GET', path: '/clientes/publico/token-abc' },
|
||||
{ method: 'POST', path: '/clientes/publico/token-abc/firma' },
|
||||
{ method: 'POST', path: '/clientes/publico/token-abc/documentos' },
|
||||
]
|
||||
for (const c of casos) {
|
||||
vi.clearAllMocks()
|
||||
authMiddleware(reqFake(c), resFake().res, next)
|
||||
expect(next).toHaveBeenCalledOnce()
|
||||
}
|
||||
})
|
||||
|
||||
it('el patrón público de la liga no abre otras rutas de clientes', () => {
|
||||
const casos: Partial<Request>[] = [
|
||||
{ method: 'GET', path: '/clientes/abc-123' },
|
||||
{ method: 'POST', path: '/clientes/abc-123/liga' },
|
||||
{ method: 'POST', path: '/clientes/publico/token-abc' },
|
||||
{ method: 'GET', path: '/clientes/publico/token-abc/firma' },
|
||||
{ method: 'DELETE', path: '/clientes/publico/token-abc' },
|
||||
{ method: 'GET', path: '/clientes/publico/token-abc/extra' },
|
||||
{ method: 'GET', path: '/clientes/publico' },
|
||||
]
|
||||
for (const c of casos) {
|
||||
const { res, status } = resFake()
|
||||
authMiddleware(reqFake(c), res, next)
|
||||
expect(status).toHaveBeenCalledWith(401)
|
||||
}
|
||||
})
|
||||
|
||||
it('el patrón público no abre otras rutas de cotizaciones', () => {
|
||||
const casos: Partial<Request>[] = [
|
||||
{ method: 'GET', path: '/cotizaciones/abc-123' },
|
||||
|
||||
Reference in New Issue
Block a user