Projet

Général

Profil

Development #49009

non déterminisme dans les tests

Ajouté par Benjamin Dauvergne il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
01 décembre 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Les utilisateurs sont triés par flag is_active et username, si is_active et username sont identiques pour tous, l'order est indéterminé, ça gêne dans login().

Message d'erreur

AssertionError

Pile d'exécution

db = None, app = <django_webtest.DjangoTestApp object at 0x7f462ce017b8>

    def test_login_inactive_user(db, app):
        user1 = User.objects.create(username='john.doe')
        user1.set_password('john.doe')
        user1.save()
        user2 = User.objects.create(username='john.doe')
        user2.set_password('john.doe')
        user2.save()

>       login(app, user1)

tests/test_login.py:50: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

app = <django_webtest.DjangoTestApp object at 0x7f462ce017b8>
user = <User: 'john.doe (18a07c)'>, path = None, password = None
remember_me = None, args = None, kwargs = None, fail = False

    def login(app, user, path=None, password=None, remember_me=None, args=None, kwargs=None, fail=False):
        if path:
            args = args or []
            kwargs = kwargs or {}
            path = resolve_url(path, *args, **kwargs)
            login_page = app.get(path, status=302).maybe_follow()
        else:
            login_page = app.get(reverse('auth_login'))
        assert login_page.request.path == reverse('auth_login')
        form = login_page.form
        username = user.username if hasattr(user, 'username') else user
        form.set('username', username)
        # password is supposed to be the same as username
        form.set('password', password or (user.clear_password if hasattr(user, 'clear_password') else username))
        if remember_me is not None:
            form.set('remember_me', bool(remember_me))
        response = form.submit(name='login-password-submit')
        if fail:
            assert response.status_code == 200
            assert '_auth_user_id' not in app.session
        else:
            response = response.follow()
            if path:
                assert response.request.path == path
            else:
                assert response.request.path == reverse('auth_homepage')
            assert '_auth_user_id' in app.session
>           assert not hasattr(user, 'id') or (app.session['_auth_user_id'] == str(user.id))
E           AssertionError

tests/utils.py:65: AssertionError


Fichiers

Révisions associées

Révision 5371f986 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 3 ans

backends: define a total ordering for user's querysets (#49009)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

  • Assigné à mis à Benjamin Dauvergne
#2

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

#3

Mis à jour par Emmanuel Cazenave il y a plus de 3 ans

Pourquoi tu changes pas juste le username de user2 dans test_login_inactive_user ?

#4

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

Emmanuel Cazenave a écrit :

Pourquoi tu changes pas juste le username de user2 dans test_login_inactive_user ?

Parce que le test vise justement à vérifier qu'un utilisateur inactif avec le même username est choisi à la place du premier, la seule autre solution est de virer ce test qu'on pourrait juger inutile.

#5

Mis à jour par Emmanuel Cazenave il y a plus de 3 ans

  • Statut changé de Solution proposée à Solution validée

Non mais d'accord.

#6

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 5371f986b69ccfd1796b5df609c51fc285cc4234
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Tue Dec 1 12:28:01 2020 +0100

    backends: define a total ordering for user's querysets (#49009)
#7

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF