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.

Cómo probar las API GET y POST que requieren que el usuario haya iniciado sesión en pytest Django?

He creado un elemento para crear un usuario y autenticarse automáticamente en conftest.py

@pytest.fixture
def test_password():
return ‘strong-test-pass’;

@pytest.fixture(scope=’session’)
def create_user(db, test_password):
def make_user(kwargs):
employee = e_ge_employee.objects.create()
kwargs[‘password’] = test_password
if ‘username’ not in kwargs:
kwargs[‘username’] = str(uuid.uuid4())
if ’employee’ not in kwargs:
kwargs[’employee’] = employee
return e_ge_user.objects.create(
kwargs)
return make_user

@pytest.fixture
def auto_login_user(db, client, create_user, test_password):
def make_auto_login(user=None):
if user is None:
user = create_user()
client.login(username=user.username, password=test_password)
return client, user
return make_auto_login

y luego escribí una prueba para verificar la API GET en test_urls.py

class TestUrls:

@pytest.mark.parametrize(‘param’, [
(‘generate_token’),
(‘roi_report’)
])
def test_generate_token_url(self, auto_login_user, param):
url = reverse(param)
client, user = auto_login_user()
print(“client”,client)
print(“user”,user)
resp = client.get(url)
print(resp)
assert resp.status_code == 200

Me está dando el error
{“detail”:”No se proporcionaron credenciales de autenticación.”}

en mis vistas de api estoy usando las clases de autenticación = [SessionAuthentication, ]
permission_classes = [IsAuthenticated, ] estas dos clases

¿Alguien puede por favor proporcionarme la solución…..Gracias de antemano

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que las credenciales de autenticación no se están pasando a las vistas de la API al realizar la solicitud desde el caso de prueba. Para solucionar este problema, puedes hacer lo siguiente:

    1. Pasar las credenciales de autenticación manualmente en el caso de prueba:

    En la función auto_login_user (arreglo de inicio de sesión automático), puedes modificar el valor de retorno para incluir la información de sesión del usuario:

    def make_auto_login(user=None):
        if user is None:
            user = create_user()
        client.login(username=user.username, password=test_password)
        return client, user, client.session
    

    Luego, en el caso de prueba, puedes pasar la información de sesión junto con la solicitud:

    def test_generate_token_url(self, auto_login_user, param):
        url = reverse(param)
    
        # Extrayendo el objeto de sesión de auto_login_user
        client, user, session = auto_login_user()
    
        # Haciendo la solicitud con la sesión
        resp = client.get(url, session=session)
        assert resp.status_code == 200
    
    1. Modificar la función auto_login_user para utilizar el método force_login incorporado de Django:

    En lugar de iniciar sesión manualmente en el usuario utilizando client.login, puedes utilizar el método force_login incorporado de Django que establece automáticamente los datos de sesión requeridos:

    def make_auto_login(user=None):
        if user is None:
            user = create_user()
        client.force_login(user)
        return client, user
    

    Luego, en el caso de prueba, puedes realizar la solicitud sin pasar la sesión:

    def test_generate_token_url(self, auto_login_user, param):
        url = reverse(param)
        client, user = auto_login_user()
        resp = client.get(url)
        assert resp.status_code == 200
    

    Estas modificaciones al caso de prueba y función deberían proporcionar las credenciales de autenticación requeridas a la vista de la API y resolver el error.

Comments are closed.