Probar la seguridad con System.runAs
Un test se ejecuta como un usuario que puede con casi todo, así que no dice nada sobre lo que pasa con un becario. System.runAs ejecuta un trozo del test como otro usuario, y así el permiso queda demostrado en cada despliegue.
✓ En esta sub-lección
- 01Crear un usuario de prueba con un perfil concreto.
- 02Ejecutar parte de un test como ese usuario con System.runAs.
- 03Saber qué aplica runAs y qué no.
La nutria: ¿Te acuerdas? · Repaso de la lección 4
El usuario elige el campo por el que ordenar. ¿Cómo entra en la consulta con seguridad?
El auditor vuelve con una pregunta incómoda: «Habéis cerrado los hallazgos. ¿Cómo sé que dentro de seis meses siguen cerrados?». Si alguien quita un «as user» por error, los tests del Módulo 10 seguirán en verde, porque todos se ejecutan como un usuario con permisos de sobra. Hace falta un test que se ponga en la piel del becario.
Un bloque que se ejecuta como otra persona
User intern = newIntern(); // un usuario creado en el test, con su perfil
System.runAs(intern) {
// aquí dentro, el usuario que ejecuta es el becario
RenewalDesk.applyDiscount(o.Id, 10);
}
// aquí fuera vuelve a ser el usuario del testQué aplica y qué no
Aquí está la trampa del examen. Dentro del bloque, runAs cambia quién es el usuario: se aplica su sharing, y todo lo que pregunta por sus permisos contesta por él (Schema, WITH USER_MODE, «as user», stripInaccessible). Pero runAs no convierte el código en seguro: una consulta o un guardado en modo sistema siguen sin mirar los permisos de objeto ni de campo, sea quien sea el usuario. Por eso este test es útil: si el código respeta los permisos, el becario es rechazado; si alguien lo deja en modo sistema, el descuento se guarda y el test se pone en rojo.
EL CÓDIGO GUARDA CON…
- Discount__cguardado: 10
- El test «el becario no puede»en rojo
El usuario del test puede con todo: el descuento se guarda escriba lo que escriba el código. Este test no demuestra nada sobre el becario.
La nutria: ¿Y por qué no un Flow? Porque allí se prueba a mano