es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Probando un backend de autenticación personalizado con Django Rest Framework.

Creé un backend de autenticación personalizado para mi aplicación DRF. No puedo entender cómo probarlo. Llamar al método client.post llama a mi función de autenticación (porque está en mi vista), pero necesito simular un método interno en mi ModelBackend.

Estoy un poco confundido sobre cómo proceder.

Vista:

class Web3UserToken(APIView):
    authentication_classes = []
    permission_classes = []

    def post(self, request, **kwargs):
        public_address = request.data["public_address"]
        web3 = Web3Backend()
        user, token = web3.authenticate(request)
        if token:
            return JsonResponse({'token': token})
        else:
            return Response({'message': 'Falta el token'}, status=400)

Prueba:

class TestWeb3AuthBackend(APITestCase):
    def setUp(self):
        # TODO: configurar usuario de prueba
        self.client = APIClient()
        # self.factory = APIRequestFactory()

    def test_authenticatepasseswithexistinguser(self):
        self.user = Web3User(public_address=TEST_PUBLIC_ADDRESS)
        auth_backend = Web3Backend()
        import ipdb; ipdb.set_trace()
        request = self.client.post('/api/token/', {'public_address': TEST_PUBLIC_ADDRESS, 'nonce': '0xsomething_random'}, follow=True)
        with mock.patch.object(auth_backend, '_check_nonce', return_value=True) as method:
            token, user = auth_backend.authenticate(request)
        self.assertTrue(token)
        self.assertTrue(user)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para simular un método interno en ModelBackend, puedes usar el decorador mock.patch en tu caso de prueba. En tu código, ya has agregado un parche para el método _check_nonce, pero debes asegurarte de que el backend de autenticación que estás probando sea el que se está llamando.

    Una forma de lograr esto es pasar la instancia del backend de autenticación a la vista en lugar de crear una nueva instancia:

    class Web3UserToken(APIView):
        authentication_classes = (Web3Backend,)
        permission_classes = []
    
        def post(self, request, **kwargs):
            ...
            user, token = request.auth.authenticate(request)
            ...
    

    Luego, en tu caso de prueba, pasa el backend de autenticación directamente al método authenticate:

    class TestWeb3AuthBackend(APITestCase):
        def test_authenticatepasseswithexistinguser(self):
            ...
            backend = Web3Backend()
            with mock.patch.object(backend, '_check_nonce', return_value=True) as method:
                token, user = backend.authenticate(request)
            ...
    

    Esto asegura que tu caso de prueba esté utilizando el mismo backend de autenticación que utiliza la vista, para que tu simulación se aplique correctamente.

Comments are closed.