Bug #32886
tests sur cook.py (côté serveur)
0%
Description
Ticket pour ajouter des tests unitaires sur
hobo/environment/management/commands/cook.py
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Nicolas Roche il y a presque 5 ans
- Fichier 0001-cook-add-unit-tests-for-cook.py-32886.patch 0001-cook-add-unit-tests-for-cook.py-32886.patch ajouté
- Fichier 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch ajouté
- Tracker changé de Autre à Bug
- Sujet changé de tests unitaires sur cook.py à tests sur cook.py
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
voici pour la partie serveur (qui ne teste pas hobo-deploy)
- j'ai l'impression que rien n'est prévu si set_idp() est appelé sans aucun service Authentic de configuré.
Faut-il corriger ?
- je ne trouve pas dans quel contexte la fonction cook() est appelée (peut-être qu'il s'agit de code mort).
Elle lève une exception si self.permissive n'est pas déclarée, idem faut-il corriger ?
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Statut changé de Solution proposée à Résolu (à déployer)
Nicolas Roche a écrit :
voici pour la partie serveur (qui ne teste pas hobo-deploy)
- j'ai l'impression que rien n'est prévu si set_idp() est appelé sans aucun service Authentic de configuré.
Faut-il corriger ?
Indique plus précisément le problème et la correction que tu envisages.
- je ne trouve pas dans quel contexte la fonction cook() est appelée (peut-être qu'il s'agit de code mort).
Elle lève une exception si self.permissive n'est pas déclarée, idem faut-il corriger ?
Le journal de git est en général une saine lecture :
commit c25b14cf2517b0bd587f74261f67e73d03831290 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Wed Jun 28 22:34:12 2017 +0200 cook: add cook step, to run "sub-"recipes (#15797) { "cook": { "filename": "secondary-recipe.json" }}
C'est donc pour lancer des sous-recettes dans un cadre multi-publik avec des hobos primaires et secondaires, je laisse Fred en dire plus mais je pense que ça devrait être testé aussi, voir #15797.
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Pour des tests en grandeur nature je signale cela : https://pypi.org/project/pytest-rabbitmq/
Mis à jour par Nicolas Roche il y a presque 5 ans
- Statut changé de Résolu (à déployer) à Information nécessaire
J'ai raté cette piste, merci.
Je pensais attraper les exceptions standards pour lever à la place des 'CommandError':
- IndexError
pour test_set_idp()
utilisée sans Authentic configuré
- AttributeError
pour cook()
utilisée avec permissive
non déclaré
- AttributeError
pour set_theme()
utilisée sans que les thèmes soient installés
En fait, cette 3ème erreur fait que le test pseudo 'grandeur nature' ne passe pas sur Jenkins.
Est-ce que cela reste envisageable de pousser un tel test ?
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Benjamin Dauvergne a écrit :
Pour des tests en grandeur nature je signale cela : https://pypi.org/project/pytest-rabbitmq/
Ça ne représente aucune nécessité dans le cadre de ce ticket, je signale juste pour plus tard (voir pour ouvrir un nouveau ticket suite à celui-ci).
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Nicolas Roche a écrit :
J'ai raté cette piste, merci.
Je pensais attraper les exceptions standards pour lever à la place des 'CommandError':
-IndexError
pourtest_set_idp()
utilisée sans Authentic configuré
-AttributeError
pourcook()
utilisée avecpermissive
non déclaré
-AttributeError
pourset_theme()
utilisée sans que les thèmes soient installés
Je n'ai pas vraiment le contexte mais réutiliser les exceptions de la lib standard est une idée acceptable pour des petites fonctions se rapprochant d'une fonction de base genre émettre IndexError/KeyError
sur une erreur dans get_truc(i)
. Mais s'en servir pour propager des erreurs à travers un graphe d'appel c'est une mauvaise idée, il vaut mieux dans ce cas prévoir une exception spécifique.
En fait, cette 3ème erreur fait que le test pseudo 'grandeur nature' ne passe pas sur Jenkins.
Est-ce que cela reste envisageable de pousser un tel test ?
Désolé je ne comprends pas vraiment là, poste une trace peut-être.
Mis à jour par Nicolas Roche il y a presque 5 ans
Merci benj, j'essaye d'être plus explicite :
Les 3 levées d'exceptions décrites ci-dessus seraient atteignables directement via la ligne de commande
$ hobo-manage cook recipe.json
Il ne s'agit donc pas tant de gérer les exceptions propagées dans les appels mais plutôt celles reçues dans le terminal de l'administrateur.
Cf les 2 'TODO' dans les 2 patchs ci-dessus,
et la trace dans jenkins : https://jenkins2.entrouvert.org/job/hobo-wip/job/wip%252F32886-add-tests-for-cook/1/testReport/junit/tests_schemas/test_cook/test_cook_ozwillo/
La seconde question (erreur avec tox, désolé d'avoir embrouillé le ticket) c'est de savoir si c'est envisageable de modifier jenkins pour prendre en compte les thèmes. Je dis ça parce qu'il faut que les thèmes ne soient pas installés (via make install
) pour reproduire la trace jenkins ci-dessus.
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Nicolas Roche a écrit :
Merci benj, j'essaye d'être plus explicite :
Les 3 levées d'exceptions décrites ci-dessus seraient atteignables directement via la ligne de commande
[...]
Oui oui mais donc on devrait avoir une méthode cook générique qui génère des CookError et la commande doit convertir ça en CommandError proprement.
Cf les 2 'TODO' dans les 2 patchs ci-dessus,
et la trace dans jenkins : https://jenkins2.entrouvert.org/job/hobo-wip/job/wip%252F32886-add-tests-for-cook/1/testReport/junit/tests_schemas/test_cook/test_cook_ozwillo/
En tout cas pour celle-ci ça me parait parfait pour une CookError('unknown theme %s' % theme_id)
justement mais pas dans ce ticket, ici pour que ça fonctionne je dirai qu'il faut juste avoir une fixture qui crée un répertoire y met un faux thème et qui définit settings.THEMES_DIRECTORY pour que hobo.theme.utils.get_themes() fonctionne.
La seconde question (erreur avec tox, désolé d'avoir embrouillé le ticket) c'est de savoir si c'est envisageable de modifier jenkins pour prendre en compte les thèmes. Je dis ça parce qu'il faut que les thèmes ne soient pas installés (via
make install
) pour reproduire la trace jenkins ci-dessus.
Réponse dans mon dernier paragraphe, non le test doit être indépendant du paquet publik-base-theme.
Mis à jour par Nicolas Roche il y a presque 5 ans
- Fichier 0001-cook-add-unit-tests-for-cook.py-32886.patch 0001-cook-add-unit-tests-for-cook.py-32886.patch ajouté
- Fichier 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch ajouté
- Statut changé de Information nécessaire à Solution proposée
- tests/cook.py pour les tests unitaires
- tests_schemas/cook.py : ajoute un scénario plausible côté serveur
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Nicolas Roche a écrit :
voici donc deux patchs qui ajoutent des tests pour cook.py :
- tests/cook.py pour les tests unitaires
- tests_schemas/cook.py : ajoute un scénario plausible côté serveur
Pour faire des répertoires temporaires tu as une fixure tmpdir
[1] qui gère tout pour toi (mais ça renvoie des objets Path
de pathlib il faut faire str()
dessus avant des les utiliser dans du code normal).
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- test_handle c'est un peu exagéré on ne descend pas aussi bas dans nos tests en général, enfin on va le garder
- Ça c'est assez étrange :
assert str(command.check_action.mock_calls) == expected1
Il me semble que tu peux directement instancier des objets call() et qu'ils sont comparables1 tant que leurs arguments le sont. Ça devrait rendre tout ça plus lisible.
1 Et oui
In [1]: from mock import call In [2]: call('a', object) == call(u'a', object) Out[2]: True
Mis à jour par Nicolas Roche il y a presque 5 ans
- Fichier .coverage ajouté
- Fichier 0001-cook-add-unit-tests-for-cook.py-32886.patch 0001-cook-add-unit-tests-for-cook.py-32886.patch ajouté
- Fichier 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch ajouté
call
, c'est beaucoup plus simple comme ça !
- fixure tmpdir
- comparaisons des appels via objets call
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
C'est possible de pas avoir de expected et de mettre directement la valeur sur la ligne assert ? C'est plus lisible je trouve.
Mis à jour par Nicolas Roche il y a presque 5 ans
- Fichier 0001-cook-add-unit-tests-for-cook.py-32886.patch 0001-cook-add-unit-tests-for-cook.py-32886.patch ajouté
- Fichier 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch ajouté
voilà
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Nicolas Roche a écrit :
voilà
Ça ne doit pas être les bons patchs :
expected = [call('recipe_me.json')]
Mis à jour par Nicolas Roche il y a presque 5 ans
- Fichier 0001-cook-add-unit-tests-for-cook.py-32886.patch 0001-cook-add-unit-tests-for-cook.py-32886.patch ajouté
- Fichier 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch 0002-cook-add-tests-using-tenants-for-cook.py-32886.patch ajouté
non en effet, désolé.
Mis à jour par Nicolas Roche il y a presque 5 ans
- Sujet changé de tests sur cook.py à tests sur cook.py (côté serveur)
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- receipe -> recipe
- plutôt qu'un mock d'open posé le fichier dans un tmpdir
with tmpdir / 'recipe.json' as path: with path.open() as fd: fd.write(json.dumps(recipe)) command.run_cook(str(path))
je ne suis pas fan d'utiliser mock quand ce n'est pas nécessaire et qu'on peut tester le vrai code - plus court que
value = Variable.objects.get(name='foo').value label = Variable.objects.get(name='foo').label assert value == 'bar' assert label == 'foo'
on peutvariables = Variable.objects ... var = variables.get(name='foo') assert var.value == 'bar' assert var.label == 'foo'
etvalue = Variable.objects.get(name='foo').value ordered_dump = json.dumps(json.loads(value), sort_keys=True) assert ordered_dump == '{"key1": "bar", "key2": "baz"}'
plutôtvar = variables.get(name='foo') assert var.json == {"key1": "bar", "key2": "baz"}
- je ne comprends pas cette remarque, la virer si ce n'est plus d'actualité
""" code redondant ? service_type=obj_type, service_pk=obj.id, """
- je n'avais pas remarqué avant mais je ne vois pas le rapport avec ozwillo (faudrait renommer ça autrement)
Mis à jour par Nicolas Roche il y a presque 5 ans
- Fichier 0001-cook-add-unit-tests-for-cook.py-32886.patch 0001-cook-add-unit-tests-for-cook.py-32886.patch ajouté
merci benjamin, j'ai pris en compte tes remarques et j'ai mergé les 2 patchs.
pour create_site, je ne suis pas expert ORM mais d'après la doc :
https://docs.djangoproject.com/fr/1.11/ref/models/querysets/#get-or-create
variable, created = Variable.objects.get_or_create(name=variable_name, service_type=obj_type, service_pk=obj.id, defaults={'label': label or variable_name})fait un select sur le nom ET sur 2 paramètres supplémentaires,
si ne trouve rien, alors crée cet enregistrement avec ces 2 paramètres.
Dans les 2 cas on aura :
- service_type=obj_type,
- service_pk=obj.id,
Voilà pourquoi je pense que les 2 lignes qui suivent sont redondantes :
variable.service_type = obj_type variable.service_pk = obj.id
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Je veux bien mais je ne vois pas de quels lignes tu parles.
Mis à jour par Nicolas Roche il y a presque 5 ans
c'est dans hobo/environment/management/commands/cook.py::create_site()
et c'était à propos de ma remarque sur du code redondant :
for variable_name in variables.keys(): label = variables[variable_name].get('label') variable, created = Variable.objects.get_or_create(name=variable_name, service_type=obj_type, service_pk=obj.id, defaults={'label': label or variable_name}) variable.service_type = obj_type # <-- ici variable.service_pk = obj.id # <-- et là
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Nicolas Roche a écrit :
c'est dans
hobo/environment/management/commands/cook.py::create_site()
et c'était à propos de ma remarque sur du code redondant :
[...]
Oui tout à fait c'est redondant :)
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Statut changé de Solution proposée à Solution validée
C'est ok pour moi, un petit coup de json_pp -json_opt pretty
sur tests_schemas/example_env.json j'aime bien quand les fixtures sont lisibles.
Mis à jour par Nicolas Roche il y a presque 5 ans
- Fichier 0001-cook-add-unit-tests-for-cook.py-32886.patch 0001-cook-add-unit-tests-for-cook.py-32886.patch ajouté
- Statut changé de Solution validée à Résolu (à déployer)
commit 2afc250a9796447bd02e408aa2bed94aac861945 Author: Nicolas ROCHE <nroche@entrouvert.com> Date: Mon May 27 19:35:36 2019 +0200 cook: add unit tests for cook.py (#32886)
Mis à jour par Nicolas Roche il y a presque 5 ans
- Lié à Bug #33536: tests sur cook.py (correction) ajouté
Mis à jour par Frédéric Péters il y a presque 5 ans
- Statut changé de Résolu (à déployer) à Solution déployée
cook: add unit tests for cook.py (#32886)