Apex Academy
Módulo 12·05·30 min

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 Admin esEl botón «Login as» de Setup, pero escrito en un test

✓ En esta sub-lección

  1. 01Crear un usuario de prueba con un perfil concreto.
  2. 02Ejecutar parte de un test como ese usuario con System.runAs.
  3. 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

Apex
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 test
System.runAs solo existe en los tests. El usuario no hace falta insertarlo: basta con construirlo con sus campos obligatorios y un perfil.

Qué 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.

Ejecuta la llamada:

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.

Elige quién ejecuta el test y cómo guarda el código, y mira si el descuento se guarda y de qué color queda el test.

La nutria: ¿Y por qué no un Flow? Porque allí se prueba a mano

La idea ya la conoces: en Setup usas «Login as» para ver lo que ve otra persona, y al depurar un flow en una sandbox puedes marcar «Run flow as another user». Es lo mismo que runAs, pero hecho a mano y una vez. La diferencia del test de Apex es que queda escrito y se repite solo en cada despliegue: si alguien abre el agujero, lo sabes antes de llegar a producción.