En el post anterior, vimos como hacer nuestra primera prueba que consistía en crear una cuenta correctamente. En esta ocasión, vamos a atacar una prueba que valide que un usuario no pueda estar repetido.
Antes de saltar al código analicemos tres posibles soluciones.
La primera y más obvia sería ambientar el backend localmente y crear el usuario. Sin embargo, esto puede ser un proceso engorroso y en ocasiones frustrante. ¿Por qué? Twitch tiene una gran cantidad de usuarios y funcionalidades, puede ser que los equipos esten divididos y asignados a servicios específicos. Estos servicios pueden ser microservicios u otro tipo de aplicativo.
Imaginemos en el mejor de los casos, solo necesitar 4 aplicativos para crear un usuario. Al inicio pueden parecer pocos, pero no hemos considerado que cada aplicativo tiene sus propias dependencias, configuraciones, versiones de framework y lenguaje, entre otras cosas. Esto puede llevar un par de horas hasta días.
La segunda solución, sería usar un MockServer para simular la comunicación con el backend. Esta solución puede ser más rápida que la primera solución, ya que solo necesitamos inicializar un aplicativo pero aun así, debemos saber elegir entre usar uno de terceros o crear uno propio. De igual manera pueden ser horas de aprendizaje o días.
La última solución, es realizar una prueba donde simularemos directamente en el código una respuesta del backend. Al hacer esto, evitamos muchos de los problemas de las soluciones anteriores.
Dicho esto, saltemos a tirar código.
Lo primero que haremos es definir el nombre de la prueba
1: import {fireEvent, render, screen} from "@testing-library/react";
2: import CreateTwitchAccount from "./CreateTwitchAccount";
…
28:
29: it('si el usuario se repite mostrar mensaje de error', () => {
30:
31: });
32: });
Como ven el nombre es bastante claro sobre el propósito de la prueba. Recomiendo en el mayor de los casos nombrar las pruebas como si fuéramos nosotros el usuario final y evitar usar términos técnicos.
Antes de continuar con la implementación de la prueba pensemos en el flujo.
Usuario ingresa nombre de usuario
Se valida con el backend la existencia del usuario
En caso de existir, mostramos mensaje de error y deshabilitamos botón de guardar
Ahora que ya sabemos el flujo, veamos la implementación
Línea 30..32. Definimos los props que el componente necesita
Línea 34..36. Montamos el componente y pasamos los props
Línea 38. Asignamos el valor “Gabriel” al campo Usuario
Línea 40. Validamos que el texto se encuentre dentro del componente
Ejecutemos la prueba.
Como era de esperarse nos ha arrojado un error 😣 no ha encontrado el mensaje “El usuario Gabriel ya existe”.
Un error en ocasiones es visto como algo muy malo aunque en ciertas ocasiones es lo contrario, una oportunidad para detectar flujos alternos que no se habían contemplado. Dicho esto, implementemos la solución para esta prueba.
Línea 5. Definimos un estado para almacenar los errores
Línea 15..17. Si existen errores no permitimos crear el usuario
Línea 22..32 Función que valida si el usuario ingresado existe
Línea 36..38. Mostramos los errores devueltos por el endpoint users
Línea 40. Se asocia la función handleUsernameChange al campo usuario
Línea 47. Deshabilitamos el botón si existen errores
Ejecutemos nuestra prueba y crucemos dedos 🤞🏼
Lo hemos logrado 🎉🎉
Para finalizar y como una buena práctica, ejecutemos todas las pruebas.
Noooooo 😭, descuida, como lo comentamos arriba, los errores igual son vistos como oportunidades para aprender nuevas cosas. Analicemos, parece que en la línea 45 del componente CreateTwitchAccount esta el problema.