feat(auth): login JWT en API y las 4 apps
- Modelo Usuario + seed desde lista de vendedores (18 usuarios, bcrypt cost 12) - POST /api/auth/login + /api/auth/me; middleware Bearer en todo /api excepto health, login y webhook Monday; flag AUTH_ENABLED - Username = nombre completo normalizado (case/acentos insensible), password inicial Frasa2026, admin vía ADMIN_PASSWORD - Apps: LoginScreen + AuthGate (StudioBlank), token en localStorage, header Authorization en todas las llamadas, logout en 401 - Tests: api 136, cotizador 71, alta 65, cobranza 71, agente-ia 13, landing 4
This commit is contained in:
53
api-gateway/scripts/seed-usuarios.test.ts
Normal file
53
api-gateway/scripts/seed-usuarios.test.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { upsertUsuario, type DatosUsuarioSeed } from './seed-usuarios.js'
|
||||
|
||||
// ---------- Prisma mockeado (seed idempotente sin red ni BD) ----------
|
||||
|
||||
const prismaMock = vi.hoisted(() => ({
|
||||
usuario: {
|
||||
findUnique: vi.fn(),
|
||||
create: vi.fn(),
|
||||
update: vi.fn(),
|
||||
count: vi.fn(),
|
||||
},
|
||||
$disconnect: vi.fn(),
|
||||
}))
|
||||
|
||||
vi.mock('../src/services/prisma.js', () => ({ prisma: prismaMock }))
|
||||
|
||||
const datos: DatosUsuarioSeed = {
|
||||
username: 'erick israel pena ramos',
|
||||
nombre: 'ERICK ISRAEL PEÑA RAMOS',
|
||||
rol: 'vendedor',
|
||||
asignacion: 'MONTEBELLO',
|
||||
empleadoId: 13676,
|
||||
passwordHash: 'hash-inicial',
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
})
|
||||
|
||||
describe('upsertUsuario (seed idempotente)', () => {
|
||||
it('crea el usuario si no existe', async () => {
|
||||
prismaMock.usuario.findUnique.mockResolvedValue(null)
|
||||
const resultado = await upsertUsuario(datos, false)
|
||||
expect(resultado).toBe('creado')
|
||||
expect(prismaMock.usuario.create).toHaveBeenCalledWith({ data: datos })
|
||||
})
|
||||
|
||||
it('si ya existe actualiza datos sin tocar el password', async () => {
|
||||
prismaMock.usuario.findUnique.mockResolvedValue({ id: 'u-1' })
|
||||
const resultado = await upsertUsuario({ ...datos, passwordHash: 'hash-nuevo' }, false)
|
||||
expect(resultado).toBe('actualizado')
|
||||
const update = prismaMock.usuario.update.mock.calls[0][0]
|
||||
expect(update.data).not.toHaveProperty('passwordHash')
|
||||
})
|
||||
|
||||
it('con --reset-passwords sí restablece el password', async () => {
|
||||
prismaMock.usuario.findUnique.mockResolvedValue({ id: 'u-1' })
|
||||
await upsertUsuario({ ...datos, passwordHash: 'hash-nuevo' }, true)
|
||||
const update = prismaMock.usuario.update.mock.calls[0][0]
|
||||
expect(update.data.passwordHash).toBe('hash-nuevo')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user