GOOGLE ADS

jueves, 28 de abril de 2022

Cómo probar que un decorador está asignado a múltiples funciones

Leí en algún lugar de SO que no debes probar el decorador sino la funcionalidad de la función envuelta. Sin embargo, podría haber una forma más corta de probar si un determinado decorador está asignado a múltiples funciones.

Tengo este decorador:

def check_user(func):
"""Only allow admins to change the user_id in the annotated function.
Use as decorator: @check_user
"""
@wraps(func)
def wrapper(*args, **kwargs):
...

Tengo algunas pruebas para probar la función de decorador en sí, por ejemplo:

def test_check_user(self):
"""Test the check user decorator if a non admin wants to overwrite the user."""
with pytest.raises(ValueError) as ex:
@check_user
def foo(login: str, userId: str):
return True
foo(login="Foo", userId="Bar")
assert ex.value.args[0] == "Only admin users may overwrite the userId."

Ahora tengo alrededor de 20 puntos finales de FastAPI donde asigné este decorador. Quiero evitar repetir las mismas pruebas (ver el ejemplo anterior y otras pruebas) para cada función. Así que algo como esto sería genial:

@pytest.mark.parametrize("method", ["foo", "bar", "gaga",....])
def test_decorated_methods(self, method):
assert assigned(check_user, method) # or so


Solución del problema

Debería poder parametrizar test_check_userpara verificar la misma afirmación para cada función decorada en una prueba. Esto es superior a simplemente verificar si se aplica un decorador porque valida el requisito funcional real de evitar que cambien los usuarios que no son administradores userId.

Recuerda que el objetivo de redactar buenos exámenes es protegerte de tu yo futuro. Si bien actualmente cree que puede inferir una característica de seguridad a partir de la presencia de este decorador, ¿puede estar seguro de que esta inferencia siempre será cierta durante el resto de la vida útil del proyecto? Es mejor asegurarse de que sus características de seguridad realmente se comporten según lo previsto.

@pytest.mark.parametrize("method,args,kwargs", [(my_func, ["Foo"], {}),
(my_other_func, ["bar"], {})])
def test_cant_change_id_if_not_admin(func, args, kwargs):
kwargs["userId"]="Bar"
with pytest.raises(ValueError) as ex:
func(*args, **kwargs)
assert ex.value.args[0] == "Only admin users may overwrite the userId."

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...