Browse Source

test: Better coverage

pull/1/head
Michael COSTA 6 months ago
parent
commit
6794171896
9 changed files with 142 additions and 20 deletions
  1. +2
    -1
      .gitignore
  2. +6
    -3
      Makefile
  3. +10
    -0
      scrippy_template/__init__.py
  4. +12
    -15
      scrippy_template/template/__init__.py
  5. +14
    -0
      tests/templates/basic_template.j2
  6. +0
    -0
      tests/templates/loop_template.j2
  7. +58
    -0
      tests/test_load_template.py
  8. +1
    -1
      tests/test_loop_template.py
  9. +39
    -0
      tests/test_template_error.py

+ 2
- 1
.gitignore View File

@ -1,7 +1,7 @@
*un~
*.swp
*.pyc
*/__pycache__
**/__pycache__/
build/
dist/
scrippy_template.egg-info/
@ -9,6 +9,7 @@ test.py
populate_dir.py
.vscode/
venv/
.pytest_cache/
.idea
.coverage
junit_report.xml

+ 6
- 3
Makefile View File

@ -1,7 +1,7 @@
VERSION=$(shell python3 ./setup.py --version)
.RECIPEPREFIX +=
.PHONY: install uninstall all distclean bumpversion autochangelog tag dist push release
.PHONY: install uninstall all distclean test bumpversion autochangelog tag dist push release
all: | uninstall install distclean
@ -12,7 +12,10 @@ uninstall:
sudo pip3 uninstall -y scrippy-template
distclean:
sudo rm -Rf ./build ./dist ./scrippy_template.egg-info
sudo rm -Rf ./build ./dist ./scrippy_template.egg-info ./scrippy_template/__pycache__ ./tests/__pycache__
test:
python3 -m pytest --cov=scrippy_template --junitxml=./junit_report.xml
bumpversion:
bump2version patch
@ -38,4 +41,4 @@ push:
git push origin
git push --tags
release: | distclean bumpversion autochangelog tag dist push
release: | distclean test bumpversion autochangelog tag dist push

+ 10
- 0
scrippy_template/__init__.py View File

@ -0,0 +1,10 @@
"""Module de gestion de fichiers modèles."""
class ScrippyTemplateError(Exception):
"""Classe d'erreur spécifique."""
def __init__(self, message):
"""Initialise l'instance."""
self.message = message
super().__init__(self.message)

+ 12
- 15
scrippy_template/template/__init__.py View File

@ -19,15 +19,13 @@ Le dictionnaire "params" devra être:
params = {'user': 'harry.fink', 'sender': 'Luigi Vercotti'}
"""
import sys
import logging
import jinja2
from scrippy_template import ScrippyTemplateError as ScrippyTemplateError
class Renderer:
"""
L'objet Renderer est en charge du chargement et du rendu des fichiers modèles.
"""
"""L'objet Renderer est en charge du chargement et du rendu des fichiers modèles."""
def __init__(self, base_path, template_filename):
"""
@ -41,7 +39,7 @@ class Renderer:
def load(self, template_filename):
"""
La méthode "Renderer.load()" permet à un même objet Renderer de charger un autre fichier modèle.
Permet à un même objet Renderer de charger un autre fichier modèle.
Le fichier modèle précédemment chargé est perdu au chargement du nouveau fichier.
"""
@ -49,7 +47,7 @@ class Renderer:
def render(self, params=None):
"""
La méthode "Renderer.render()" renvoie le rendu du fichier modèle.
Renvoie le rendu du fichier modèle.
Si des variables doivent être fournies au fichier modèle, elle doivent l'être sous la forme d'un
dictionnaire.
@ -57,19 +55,18 @@ class Renderer:
Le dictionnaire sera alors transmis au fichier modèle qui sera chargé de faire l'interpolation
de ces variables.
"""
logging.info("[+] Rendu du modele: {}".format(self.template_filename))
try:
env = jinja2.Environment(loader=jinja2.FileSystemLoader(self.base_path),
autoescape=True)
template = env.get_template(self.template_filename)
return template.render(params=params)
except jinja2.exceptions.TemplateNotFound as e:
logging.critical(" '-> Modele introuvable: [{}] {}".format(e.__class__.__name__, e))
sys.exit(1)
except jinja2.exceptions.TemplateNotFound:
err_msg = "Modele introuvable: {}".format(self.template_filename)
raise ScrippyTemplateError(err_msg)
except jinja2.exceptions.UndefinedError as e:
logging.critical(" '-> Erreur: [{}] {}".format(e.__class__.__name__, e))
sys.exit(1)
err_msg = "Erreur indefinie: [{}] {}".format(e.__class__.__name__, e)
raise ScrippyTemplateError(err_msg)
except Exception as e:
logging.critical(" '-> Erreur inattendue: [{}] {}".format(e.__class__.__name__, e))
logging.critical(" '-> Merci de remonter cette erreur afin qu'elle soit integree")
sys.exit(1)
logging.critical("Merci de remonter l'erreur suivante afin qu'elle soit integree au module scrippy_template")
err_msg = "Erreur inattendue: [{}] {}".format(e.__class__.__name__, e)
raise ScrippyTemplateError(err_msg)

+ 14
- 0
tests/templates/basic_template.j2 View File

@ -0,0 +1,14 @@
Bonjour {{params.user}}
Vous recevez cet e-mail car vous faites partie des administrateurs fonctionnels de l'application {{params.app}}.
L'exécution du script {{params.script}} du {{params.date}} s'est terminé:
{% if params.num_errors == 0 -%}
- Sans erreur
{% else -%}
- avec {{params.num_errors}} erreur(s)
{%- endif %}
--
Cordialement.
{{params.sender}}

tests/templates/template.j2 → tests/templates/loop_template.j2 View File


+ 58
- 0
tests/test_load_template.py View File

@ -0,0 +1,58 @@
"""Test de fichier modèle à boucle."""
import datetime
from scrippy_template import template
EXPECTED_LOOP = """Bonjour Harry Fink
Vous recevez cet e-mail car vous faites partie des administrateurs fonctionnels de l'application Flying Circus.
L'exécution du script dead_parrot.py du 21/01/2021 s'est terminé avec les erreurs suivantes:
2: It's not pinin’! It's passed on! This parrot is no more!
3: Ohh! The cat's eaten it.
--
Cordialement.
Luiggi Vercotti"""
EXPECTED_BASIC = """Bonjour Harry Fink
Vous recevez cet e-mail car vous faites partie des administrateurs fonctionnels de l'application Flying Circus.
L'exécution du script dead_parrot.py du 21/01/2021 s'est terminé:
- avec 42 erreur(s)
--
Cordialement.
Luiggi Vercotti"""
def test_template():
"""Test de fichier modèle à boucle."""
params_loop = {"user": "Harry Fink",
"app": "Flying Circus",
"script": "dead_parrot.py",
"date": datetime.datetime.now().strftime("%d/%m/%Y"),
'errors': [{'code': 2, 'msg': "It's not pinin’! It's passed on! This parrot is no more!"},
{'code': 3, 'msg': "Ohh! The cat's eaten it."}],
"sender": "Luiggi Vercotti"}
params_basic = {"user": "Harry Fink",
"app": "Flying Circus",
"script": "dead_parrot.py",
"date": datetime.datetime.now().strftime("%d/%m/%Y"),
"num_errors": 42,
"sender": "Luiggi Vercotti"}
base_path = "./tests/templates"
loop_template = "loop_template.j2"
basic_template = "basic_template.j2"
renderer = template.Renderer(base_path, loop_template)
message = renderer.render(params_loop)
assert message == EXPECTED_LOOP
renderer.load(basic_template)
message = renderer.render(params_basic)
assert message == EXPECTED_BASIC

tests/test_template.py → tests/test_loop_template.py View File

@ -29,7 +29,7 @@ def test_template():
{'code': 3, 'msg': "Ohh! The cat's eaten it."}],
"sender": "Luiggi Vercotti"}
base_path = "./tests/templates"
template_file = "template.j2"
template_file = "loop_template.j2"
renderer = template.Renderer(base_path, template_file)
message = renderer.render(params)
assert message == EXPECTED

+ 39
- 0
tests/test_template_error.py View File

@ -0,0 +1,39 @@
"""Test de fichier modèle à boucle."""
import datetime
from scrippy_template import template
from scrippy_template import ScrippyTemplateError as ScrippyTemplateError
EXPECTED = """Bonjour Harry Fink
Vous recevez cet e-mail car vous faites partie des administrateurs fonctionnels de l'application Flying Circus.
L'exécution du script dead_parrot.py du 21/01/2021 s'est terminé avec les erreurs suivantes:
2: It's not pinin’! It's passed on! This parrot is no more!
3: Ohh! The cat's eaten it.
--
Cordialement.
Luiggi Vercotti"""
def test_template_error():
"""Test de levée d'erreur."""
params = {"user": "Harry Fink",
"app": "Flying Circus",
"script": "dead_parrot.py",
"date": datetime.datetime.now().strftime("%d/%m/%Y"),
'errors': [{'code': 2, 'msg': "It's not pinin’! It's passed on! This parrot is no more!"},
{'code': 3, 'msg': "Ohh! The cat's eaten it."}],
"sender": "Luiggi Vercotti"}
base_path = "./tests/templates"
template_file = "inexistant"
try:
renderer = template.Renderer(base_path, template_file)
renderer.render(params)
except ScrippyTemplateError:
pass

Loading…
Cancel
Save