forked from DGNum/gestioCOF
Meilleure doc (j'espère !)
This commit is contained in:
parent
88c9187e2e
commit
b1c69eddb5
1 changed files with 50 additions and 63 deletions
|
@ -197,75 +197,68 @@ class TestCaseMixin:
|
|||
self.assertEqual(actual, expected)
|
||||
|
||||
|
||||
|
||||
class ViewTestCaseMixin(TestCaseMixin):
|
||||
"""
|
||||
TestCase extension to ease tests of kfet views.
|
||||
Utilitaire pour automatiser certains tests sur les vues Django.
|
||||
|
||||
Création d'utilisateurs
|
||||
------------------------
|
||||
# Données de base
|
||||
On crée dans tous les cas deux utilisateurs : un utilisateur normal "user",
|
||||
et un superutilisateur "root", avec un mot de passe identique au username.
|
||||
|
||||
Urls concerns
|
||||
-------------
|
||||
# Accès et utilisateurs supplémentaires
|
||||
Les utilisateurs créés sont accessibles dans le dict `self.users`, qui associe
|
||||
un label à une instance de User.
|
||||
|
||||
# Basic usage
|
||||
Pour rajouter des utilisateurs supplémentaires (et s'assurer qu'ils sont
|
||||
disponibles dans `self.users`), on peut redéfinir la fonction `get_users_extra()`,
|
||||
qui doit renvoyer là aussi un dict <label: User instance>.
|
||||
|
||||
Attributes:
|
||||
url_name (str): Name of view under test, as given to 'reverse'
|
||||
function.
|
||||
url_args (list, optional): Will be given to 'reverse' call.
|
||||
url_kwargs (dict, optional): Same.
|
||||
url_expcted (str): What 'reverse' should return given previous
|
||||
attributes.
|
||||
Misc QoL
|
||||
------------------------
|
||||
Pour éviter une erreur de login (puisque les messages de Django ne sont pas
|
||||
disponibles), les messages de bienvenue de GestioCOF sont patchés.
|
||||
Un attribut `self.now` est fixé au démarrage, pour être donné comme valeur
|
||||
de retour à un patch local de `django.utils.timezone.now`. Cela permet de
|
||||
tester des dates/heures de manière robuste.
|
||||
|
||||
View url can then be accessed at the 'url' attribute.
|
||||
Test d'URLS
|
||||
------------------------
|
||||
|
||||
# Advanced usage
|
||||
# Usage basique
|
||||
Teste que l'URL générée par `reverse` correspond bien à l'URL théorique.
|
||||
Attributs liés :
|
||||
- `url_name` : nom de l'URL qui sera donné à `reverse`,
|
||||
- `url_expected` : URL attendue en retour.
|
||||
- (optionnels) `url_args` et `url_kwargs` : arguments de l'URL pour `reverse`.
|
||||
|
||||
If multiple combinations of url name, args, kwargs can be used for a view,
|
||||
it is possible to define 'urls_conf' attribute. It must be a list whose
|
||||
each item is a dict defining arguments for 'reverse' call ('name', 'args',
|
||||
'kwargs' keys) and its expected result ('expected' key).
|
||||
# Usage avancé
|
||||
On peut tester plusieurs URLs pour une même vue, en redéfinissant la fonction
|
||||
`urls_conf()`. Cette fonction doit retourner une liste de dicts, avec les clés
|
||||
suivantes : `name`, `args`, `kwargs`, `expected`.
|
||||
|
||||
The reversed urls can be accessed at the 't_urls' attribute.
|
||||
# Accès aux URLs générées
|
||||
Dans le cas d'usage basique, l'attribut `self.url` contient l'URL de la vue testée
|
||||
(telle que renvoyée par `reverse()`). Si plusieurs URLs sont définies dans
|
||||
`urls_conf()`, elles sont accessibles par la suite dans `self.reversed_urls`.
|
||||
|
||||
Authentification
|
||||
------------------------
|
||||
Si l'attribut `auth_user` est dans `self.users`, l'utilisateur correspondant
|
||||
est authentifié avant chaque test (cela n'empêche bien sûr pas de login un autre
|
||||
utilisateur à la main).
|
||||
|
||||
Users concerns
|
||||
--------------
|
||||
|
||||
During setup, the following users are created:
|
||||
- 'user': a basic user without any permission,
|
||||
- 'root': a superuser, account trigramme: 200.
|
||||
Their password is their username.
|
||||
|
||||
One can create additionnal users with 'get_users_extra' method, or prevent
|
||||
these users to be created with 'get_users_base' method. See these two
|
||||
methods for further informations.
|
||||
|
||||
By using 'register_user' method, these users can then be accessed at
|
||||
'users' attribute by their label.
|
||||
|
||||
A user label can be given to 'auth_user' attribute. The related user is
|
||||
then authenticated on self.client during test setup. Its value defaults to
|
||||
'None', meaning no user is authenticated.
|
||||
|
||||
|
||||
Automated tests
|
||||
---------------
|
||||
|
||||
# Url reverse
|
||||
|
||||
Based on url-related attributes/properties, the test 'test_urls' checks
|
||||
that expected url is returned by 'reverse' (once with basic url usage and
|
||||
each for advanced usage).
|
||||
|
||||
# Forbidden responses
|
||||
|
||||
The 'test_forbidden' test verifies that each user, from labels of
|
||||
'auth_forbidden' attribute, can't access the url(s), i.e. response should
|
||||
be a 403, or a redirect to login view.
|
||||
|
||||
Tested HTTP requests are given by 'http_methods' attribute. Additional data
|
||||
can be given by defining an attribute '<method(lowercase)>_data'.
|
||||
Test de restrictions d'accès
|
||||
------------------------
|
||||
L'utilitaire vérifie automatiquement que certains utilisateurs n'ont pas accès à la
|
||||
vue. Plus spécifiquement, sont testés toutes les méthodes dans `self.http_methods`
|
||||
et tous les utilisateurs dans `self.auth_forbidden`. Pour rappel, l'utilisateur
|
||||
`None` sert à tester la vue sans authentification.
|
||||
On peut donner des paramètres GET/POST/etc. aux tests en définissant un attribut
|
||||
<methode>_data.
|
||||
|
||||
TODO (?): faire pareil pour vérifier les GET/POST classiques (code 200)
|
||||
"""
|
||||
|
||||
url_name = None
|
||||
|
@ -280,19 +273,13 @@ class ViewTestCaseMixin(TestCaseMixin):
|
|||
"""
|
||||
Warning: Do not forget to call super().setUp() in subclasses.
|
||||
"""
|
||||
# Signals handlers on login/logout send messages.
|
||||
# Due to the way the Django' test Client performs login, this raise an
|
||||
# error. As workaround, we mock the Django' messages module.
|
||||
|
||||
patcher_messages = mock.patch("gestioncof.signals.messages")
|
||||
patcher_messages.start()
|
||||
self.addCleanup(patcher_messages.stop)
|
||||
|
||||
# A test can mock 'django.utils.timezone.now' and give this as return
|
||||
# value. E.g. it is useful if the test checks values of 'auto_now' or
|
||||
# 'auto_now_add' fields.
|
||||
self.now = timezone.now()
|
||||
|
||||
# Register of User instances.
|
||||
self.users = {}
|
||||
|
||||
for label, user in dict(self.users_base, **self.users_extra).items():
|
||||
|
|
Loading…
Reference in a new issue