Tests de seguridad en Laravel con Pest
Hola, bienvenido. En esta lección vamos a preparar el método con el que vamos a comprobar la seguridad de invoices durante todo el curso. Un test de seguridad en Laravel con Pest describe lo que la aplicación tiene que impedir, por ejemplo que un invitado vea una factura, y lo comprueba con entradas inofensivas. Vamos a dejar en tests/Pest.php unos helpers para crear usuarios con sus facturas, vamos a escribir el primer test en tests/Feature/Security/ y vamos a añadir el preset security de Pest como red de fondo.
Cómo es un test de seguridad
Todas las lecciones del curso en las que corregimos un fallo siguen el mismo orden. Primero escribimos un test que describe el comportamiento seguro: la factura de otro usuario devuelve un 403, un campo que no está en el formulario no se asigna o unas notas con una etiqueta salen escapadas. Lo lanzamos contra el código de partida y falla, porque el fallo está ahí. Después aplicamos la solución, el cambio mínimo en la aplicación, y el test pasa.
¿Por qué el test primero y no directamente la solución? Por 2 motivos. El primero es que un test que falla con el código de partida demuestra 2 cosas a la vez: que el fallo existe y que el test lo detecta. Si pasara desde el principio, no sabríamos si comprueba algo. El segundo es que el test se queda en el proyecto. Entra en composer qa, y si dentro de 3 meses un agente reescribe ese controlador y deja fuera la comprobación, el circuito se pone en rojo. La solución la puede deshacer cualquier cambio, y el test es lo que lo vigila.
Ese test también hay que vigilarlo. Un agente al que le pides que deje los tests en verde puede conseguirlo borrando o debilitando el test que le molesta, y de eso va el artículo TDD con IA: la trampa de dejar que el agente borre sus propios tests (se abre en una pestaña nueva). Por eso los tests de seguridad van en su propia carpeta, tests/Feature/Security/: cualquier cambio que la toque salta a la vista al revisar el diff.
Hay una regla más que no nos podemos saltar: los tests usan entradas inofensivas. Para comprobar que una búsqueda no rompe la consulta basta una comilla simple ('), y para comprobar que una salida se escapa basta una etiqueta <b>.
- 02Helpers para los tests de seguridad
- 03El primer test: un invitado no ve facturas
- 04La red de fondo: el preset security de Pest
- 05El circuito con los tests de seguridad