Ejercicio para trabajar dobles de test
User login módulo es una plataforma que se encarga de iniciar la sesión de nuestros usuarios usando diferentes proveedores.
Este módulo fue subcontratado a una empresa externa con la que, por varios desacuerdos, no ha llegado a finalizar el desarrollo. Es por esto que la implementación de esta parte se ha quedado sin terminar. Nuestro trabajo, acabarlo.
El código está separado de la siguiente manera:
- User: Es la clase que vamos a utilizar para modelar la información de nuestros usuarios.
- UserLoginService: Es un servicio que se va a encargar de loggear a los usuarios.
- SessionManager: Es una interfaz que define el contrato que habrá que cumplir para añadir un nuevo proveedor de sesión.
- FacebookSessionManager: Esto parece ser la implementación de Facebook como proveedor de sesión de usuarios. La empresa externa nos dijo que esta parte estaba implementada, era funcional y cumplía con las reglas de negocio...
Este módulo es una parte clave de nuestro negocio (entonces, ¿por qué se externalizó? No lo sabemos). Es un sistema que vamos a necesitar que escale con fácilmente con nuevas funcionalidades e implementaciones de diferentes gestores de sesión (Google, Facebook, Github...) para que el negocio pueda seguir incorporando nuevos usuarios.
¿Vamos a por ello?
Planteamos los siguientes pasos para resolver el ejercicio:
Queremos un inicializador de sesiones de usuario que permita añadir usuarios a la sesión manualmente. Para ello, implementaremos el método manualLogin(user: User): string siguiendo la siguiente lógica:
- Si el usuario no está en la lista, se añade al array de usuarios (loggedUsers) e indica que se ha añadido: "User successfully logged in"
- Si el usuario ya está logueado se lanza un mensaje indicando que el usuario ya está logueado: “User already logged in”
Queremos que dicho inicializador de sesiones nos permita recuperar los usuarios que están actualmente logueados en nuestro sistema:
Añadir el método getLoggedUsers() que devuelva un array de usuarios logueados.
Necesitamos saber cuántas sesiones tenemos activas en un servicio externo (Facebook).
Para ello crearemos un método getExternalSessions() en nuestro UserLoginService que llamará a FacebookSessionManager.getSessions() Este método devuelve el número total de sesiones activas en el servicio externo. Devolveremos directamente el valor que retorne la llamada externa.
Queremos poder loguear usuarios usando el API de Facebook.
- Crear un método login(userName: string, password: string): string en nuestro UserLoginService.
- Para loguear un usuario llamaremos a FacebookSessionManager.login(String userName: string, password: string)
- Si devuelve true significará que el usuario ha sido logueado correctamente. En este caso crearemos un usuario con ese userName, lo añadiremos al listado de usuarios logeados de nuestro sistema y devolveremos un mensaje “Login correcto”
- Si devuelve false, no crearemos el usuario y devolveremos un mensaje de “Login incorrecto”
Queremos poder desloguear usuarios del servicio externo (Facebook)
- Crear un método String logout(user: User) en nuestro UserLoginService
Para desloguear un usuario llamaremos a FacebookSessionManager.logout(userName: string)
- En caso de existir el usuario en el listado de usuarios logeados lo eliminaremos del listado y llamaremos al logout de FacebookSessionManager devolviendo un mensaje de “User logged out” desde el UserLoginService
- En caso de no existir, devolveremos un mensaje de “User not found” desde UserLoginService
Queremos controlar las posibles causas de un error en el logout.
-
FacebookSessionManager lanzará un error en cada caso y en userLoginService manejaremos el error y devolveremos un mensaje descriptivo al usuario.
- Errores:
- FacebookSessionManager no responde: error “ServiceNotAvailable”
- Usuario no logueado en Facebook: error “UserNotLoggedIn”
- Errores:
-
El servicio userLoginService devolverá los siguientes mensajes para cada error:
- “ServiceNotAvailable” -> ‘Service not available’
- “UserNotLoggedIn” -> ‘User not logged in Facebook’