Some checks failed
/ Deploy to Cloudflare Pages (push) Has been cancelled
Cambios en WorkspacePage.tsx: orgName ahora es string | null | undefined. undefined = query no completó aún, null = proceso sin org (o query sin resultado), string = nombre real. Reemplazó .single() por .maybeSingle() — .single() lanzaba PGRST116 cuando el org no existía, data quedaba en null y setOrgName nunca se llamaba, dejando el estado indefinido. setOrgName(data?.name ?? null) se llama siempre, sin condición if (data). backLabel pasa de orgId ? (orgName ?? 'Volver') : 'Biblioteca' a simplemente orgName ?? 'Biblioteca' — el nombre real si cargó, o el fallback genérico en cualquier otro caso. Ya no depende de orgId para decidir el label. handleBack() no cambió — sigue usando currentProcess?.orgId para construir el URL correcto a /library?org=xxx. Listo para validación visual en workspace con un proceso de cliente que tenga org_id en la DB.
59 lines
2.5 KiB
TypeScript
59 lines
2.5 KiB
TypeScript
/**
|
|
* Tests del back button contextual en el workspace header.
|
|
* Verifica que backLabel y backTo se calculen correctamente según rol y orgId del proceso.
|
|
*/
|
|
import { describe, it, expect } from 'vitest'
|
|
|
|
type PlatformRole = 'platform_admin' | 'member' | 'client_editor' | 'client_viewer' | 'guest'
|
|
|
|
function resolveBackButton(
|
|
platformRole: PlatformRole | undefined,
|
|
orgId: string | null,
|
|
orgName: string | null | undefined, // undefined = cargando, null = sin resultado
|
|
): { backLabel: string; backTo: string } {
|
|
const isClientRole = platformRole === 'client_editor' || platformRole === 'client_viewer'
|
|
const backLabel = isClientRole
|
|
? 'Procesos'
|
|
: orgName ?? 'Biblioteca'
|
|
const backTo = orgId && !isClientRole ? `/library?org=${orgId}` : '/library'
|
|
return { backLabel, backTo }
|
|
}
|
|
|
|
describe('workspace back button — lógica de backLabel y backTo', () => {
|
|
it('1. admin con proceso de cliente → muestra nombre de org y navega a /library?org=uuid', () => {
|
|
const { backLabel, backTo } = resolveBackButton('platform_admin', 'org-uuid-123', 'Solar Banco')
|
|
expect(backLabel).toBe('Solar Banco')
|
|
expect(backTo).toBe('/library?org=org-uuid-123')
|
|
})
|
|
|
|
it('2. admin con proceso de cliente mientras orgName carga → muestra "Biblioteca" como fallback', () => {
|
|
const { backLabel, backTo } = resolveBackButton('platform_admin', 'org-uuid-123', undefined)
|
|
expect(backLabel).toBe('Biblioteca')
|
|
expect(backTo).toBe('/library?org=org-uuid-123')
|
|
})
|
|
|
|
it('3. admin sin org asignada → muestra "Biblioteca" y navega a /library', () => {
|
|
const { backLabel, backTo } = resolveBackButton('platform_admin', null, null)
|
|
expect(backLabel).toBe('Biblioteca')
|
|
expect(backTo).toBe('/library')
|
|
})
|
|
|
|
it('4. member sin org → igual que platform_admin', () => {
|
|
const { backLabel, backTo } = resolveBackButton('member', null, null)
|
|
expect(backLabel).toBe('Biblioteca')
|
|
expect(backTo).toBe('/library')
|
|
})
|
|
|
|
it('5. client_editor con proceso de cliente → muestra "Procesos" y navega a /library', () => {
|
|
const { backLabel, backTo } = resolveBackButton('client_editor', 'org-uuid-123', 'Solar Banco')
|
|
expect(backLabel).toBe('Procesos')
|
|
expect(backTo).toBe('/library')
|
|
})
|
|
|
|
it('6. client_viewer con proceso de cliente → muestra "Procesos" y navega a /library', () => {
|
|
const { backLabel, backTo } = resolveBackButton('client_viewer', 'org-uuid-123', 'Solar Banco')
|
|
expect(backLabel).toBe('Procesos')
|
|
expect(backTo).toBe('/library')
|
|
})
|
|
})
|