diff --git a/app/apis/FirebaseAuth.py b/app/apis/FirebaseAuth.py index 9c1456d..a0a8c75 100644 --- a/app/apis/FirebaseAuth.py +++ b/app/apis/FirebaseAuth.py @@ -105,9 +105,10 @@ async def ver_datos_usuarios(firebase_app: App) -> tuple[int, list[dict] | None] usuarios = list_users(app=firebase_app) while True: - AUX.extend( - [ - { + lista = [] + for x in usuarios.users: + if x.custom_claims["eliminado"] == False: + lista.append({ "correo": x.email, "uid": x.uid, "nombre": x.display_name, @@ -118,11 +119,9 @@ async def ver_datos_usuarios(firebase_app: App) -> tuple[int, list[dict] | None] ), "ultima_conexion": convertir_datetime_str( x.user_metadata.last_refresh_timestamp - ), - } - for x in usuarios.users - ] - ) + ) + }) + AUX.extend(lista) if not usuarios.has_next_page: break else: @@ -147,6 +146,9 @@ async def ver_datos_usuario(firebase_app: App, uid: str) -> tuple[int, dict | No try: usuario = get_user(uid, firebase_app) + if usuario.custom_claims["eliminado"] == True: + raise UserNotFoundError("") + RES = { "correo": usuario.email, "uid": usuario.uid, @@ -203,7 +205,7 @@ def actualizar_estado_usuario( uid=uid, disabled=usuario.desactivar, app=firebase_app, - custom_claims={"admin": usuario.administrador}, + custom_claims={"admin": usuario.administrador, "eliminado": usuario.eliminado}, ) RES = { @@ -237,7 +239,7 @@ def establecer_rol_usuario(firebase_app: App, uid: str) -> tuple[int, str | None tuple[int, str | None]: Un código de estado indicando el resultado de la operación. """ try: - set_custom_user_claims(uid, {"admin": False}, app=firebase_app) + set_custom_user_claims(uid, {"admin": False, "eliminado": False}, app=firebase_app) return (COD_EXITO, None) except NotFoundError: return (COD_ERROR_ESPERADO, None) diff --git a/app/models/Peticiones.py b/app/models/Peticiones.py index b5d2f86..f7c24b9 100644 --- a/app/models/Peticiones.py +++ b/app/models/Peticiones.py @@ -124,4 +124,5 @@ class UsuarioActualizar(BaseModel): Clase que representa una petición para actualizar el estado de un usuario. """ desactivar: bool - administrador: bool \ No newline at end of file + administrador: bool + eliminado: bool \ No newline at end of file diff --git a/tests/scripts/api/test_firebaseauth.py b/tests/scripts/api/test_firebaseauth.py index 3a637ee..a236f10 100644 --- a/tests/scripts/api/test_firebaseauth.py +++ b/tests/scripts/api/test_firebaseauth.py @@ -160,7 +160,7 @@ async def test_26(mocker: MockerFixture): USUARIO.display_name = "usuario" USUARIO.user_metadata = METADATOS USUARIO.disabled = False - USUARIO.custom_claims = { "admin": False } + USUARIO.custom_claims = { "admin": False, "eliminado": False } LISTA.users = [USUARIO] LISTA.has_next_page = False @@ -192,7 +192,7 @@ async def test_27(mocker: MockerFixture): USUARIO.display_name = "usuario" USUARIO.user_metadata = METADATOS USUARIO.disabled = False - USUARIO.custom_claims = { "admin": False } + USUARIO.custom_claims = { "admin": False, "eliminado": False } LISTA2.users = [USUARIO] LISTA2.has_next_page = False @@ -240,7 +240,7 @@ async def test_39(mocker: MockerFixture): USUARIO.display_name = "usuario" USUARIO.user_metadata = METADATOS USUARIO.disabled = False - USUARIO.custom_claims = { "admin": False } + USUARIO.custom_claims = { "admin": False, "eliminado": False } FIREBASE = mocker.patch("app.apis.FirebaseAuth.get_user", return_value=USUARIO) @@ -341,7 +341,7 @@ def test_50(mocker: MockerFixture): METADATOS.last_refresh_timestamp = 175354900809 USUARIO.user_metadata = METADATOS - INST = UsuarioActualizar(desactivar=True, administrador=False) + INST = UsuarioActualizar(desactivar=True, administrador=False, eliminado=False) INSTANCIA = {"correo": "correo@correo.com", "uid": "1234", "nombre": "usuario", "administrador": False, "estado": True, "fecha_registro": "23/07/1975 08:41 AM", "ultima_conexion": "23/07/1975 08:41 AM"} FIREBASE = mocker.patch("app.apis.FirebaseAuth.update_user", return_value=USUARIO) @@ -349,31 +349,31 @@ def test_50(mocker: MockerFixture): assert RES == (1, INSTANCIA) - FIREBASE.assert_called_once_with(uid="1234", disabled=True, app="firebase_app", custom_claims={"admin": False}) + FIREBASE.assert_called_once_with(uid="1234", disabled=True, app="firebase_app", custom_claims={"admin": False, "eliminado": False}) def test_51(mocker: MockerFixture): """ Test para validar que la función "actualizar_estado_usuario" retorne un error cuando el UID proveído no corresponde a un usuario existente. """ - INST = UsuarioActualizar(desactivar=False, administrador=False) + INST = UsuarioActualizar(desactivar=False, administrador=False, eliminado=False) FIREBASE = mocker.patch("app.apis.FirebaseAuth.update_user") FIREBASE.side_effect = UserNotFoundError("Estado inválido") RES = actualizar_estado_usuario("firebase_app", "1234", INST) assert RES == (0, None) - FIREBASE.assert_called_once_with(uid="1234", disabled=False, app="firebase_app", custom_claims={"admin": False}) + FIREBASE.assert_called_once_with(uid="1234", disabled=False, app="firebase_app", custom_claims={"admin": False, "eliminado": False}) def test_52(mocker: MockerFixture): """ Test para validar que la función "actualizar_estado_usuario" maneje correctamente las excepciones """ - INST = UsuarioActualizar(desactivar=False, administrador=False) + INST = UsuarioActualizar(desactivar=False, administrador=False, eliminado=False) FIREBASE = mocker.patch("app.apis.FirebaseAuth.update_user") FIREBASE.side_effect = Exception("Error inesperado") RES = actualizar_estado_usuario("firebase_app", "1234", INST) assert RES == (-1, "Error inesperado") - FIREBASE.assert_called_once_with(uid="1234", disabled=False, app="firebase_app", custom_claims={"admin": False}) \ No newline at end of file + FIREBASE.assert_called_once_with(uid="1234", disabled=False, app="firebase_app", custom_claims={"admin": False, "eliminado": False}) \ No newline at end of file diff --git a/tests/scripts/models/test_peticiones.py b/tests/scripts/models/test_peticiones.py index 1ccb9fd..7f0b0eb 100644 --- a/tests/scripts/models/test_peticiones.py +++ b/tests/scripts/models/test_peticiones.py @@ -72,7 +72,7 @@ def test_29(): """ Test para validar que la clase reconoce correctamente una instancia. """ - instancia = UsuarioActualizar(**{"desactivar": False, "administrador": True}) + instancia = UsuarioActualizar(**{"desactivar": False, "administrador": True, "eliminado": False}) assert instancia.desactivar == False assert instancia.administrador == True diff --git a/tests/scripts/routers/test_usuarios_router.py b/tests/scripts/routers/test_usuarios_router.py index a7ad63c..dc1f4ac 100644 --- a/tests/scripts/routers/test_usuarios_router.py +++ b/tests/scripts/routers/test_usuarios_router.py @@ -294,7 +294,7 @@ def test_60(mocker: MockerFixture): "Host": "localhost", "Authorization": "Bearer token_valido", }, - json={"desactivar": False, "administrador": False}, + json={"desactivar": False, "administrador": False, "eliminado": False}, ) assert RES.status_code == 200 @@ -322,7 +322,7 @@ def test_61(mocker: MockerFixture): "Host": "localhost", "Authorization": "Bearer token_invalido", }, - json={"desactivar": True, "administrador": False}, + json={"desactivar": True, "administrador": False, "eliminado": False}, ) assert RES.status_code == 403 @@ -352,7 +352,7 @@ def test_62(mocker: MockerFixture): "Host": "localhost", "Authorization": "Bearer token_valido", }, - json={"desactivar": True, "administrador": False}, + json={"desactivar": True, "administrador": False, "eliminado": False}, ) assert RES.status_code == 404 @@ -381,7 +381,7 @@ def test_63(mocker: MockerFixture): "Host": "localhost", "Authorization": "Bearer token_valido", }, - json={"desactivar": True, "administrador": False}, + json={"desactivar": True, "administrador": False, "eliminado": False}, ) assert RES.status_code == 500