Skip to content

Commit 45092af

Browse files
Test: Ajout des tests unitaires pour FiltreLogApache (#42)
- Ajout des tests unitaires pour la classe FiltreLogApache - Mise à jour des tests unitaires des classes ParseurArgumentsCLI et AnalyseurLogApache suite à l'ajout de la classe FiltreLogApache
1 parent 74fcf31 commit 45092af

5 files changed

Lines changed: 280 additions & 16 deletions

File tree

tests/conftest.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from cli.afficheur_cli import AfficheurCLI
77
from cli.parseur_arguments_cli import ParseurArgumentsCLI
88
from parse.parseur_log_apache import ParseurLogApache
9+
from analyse.filtre_log_apache import FiltreLogApache
910
from analyse.analyseur_log_apache import AnalyseurLogApache
1011
from export.exporteur import Exporteur
1112

@@ -148,21 +149,34 @@ def entree_log_apache(fichier_log_apache):
148149
"""
149150
return fichier_log_apache.entrees[0]
150151

152+
@pytest.fixture
153+
def filtre_log_apache():
154+
"""
155+
Fixture pour initialiser un filtre de fichier de log Apache.
156+
Par défaut, toutes les vérifications de ce filtre sont à ``None``.
157+
158+
Returns:
159+
FiltreLogApache: Une instance de la classe :class:`FiltreLogApache`.
160+
"""
161+
return FiltreLogApache(None, None)
162+
151163
@pytest.fixture()
152-
def analyseur_log_apache(fichier_log_apache):
164+
def analyseur_log_apache(fichier_log_apache, filtre_log_apache):
153165
"""
154166
Fixture pour initialiser un analyseur statistique de fichier de log Apache.
155167
Le fichier qu'analyse cet analyseur comprend par défaut les entrées parsées de la liste
156-
``lignes_valides``.
168+
``lignes_valides`` et toutes les vérifications de sont filtres sont à ``None``.
157169
158170
Args:
159171
fichier_log_apache (FichierLogApache): Fixture pour l'instance
160172
de la classe :class:`FichierLogApache`.
173+
filtre_log_apache (FiltreLogApache): Fixture pour l'instance
174+
de la classe :class:`FiltreLogApache`.
161175
162176
Returns:
163177
AnalyseurLogApache: Une instance de la classe :class:`AnalyseurLogApache`.
164178
"""
165-
return AnalyseurLogApache(fichier_log_apache)
179+
return AnalyseurLogApache(fichier_log_apache, filtre_log_apache)
166180

167181
@pytest.fixture
168182
def fichier_json(tmp_path):

tests/test_analyseur_log_apache.py

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,25 @@
44

55
import pytest
66
from parse.fichier_log_apache import FichierLogApache
7+
from analyse.filtre_log_apache import FiltreLogApache
78
from analyse.analyseur_log_apache import AnalyseurLogApache
89

910

1011
# Tests unitaires
1112

12-
@pytest.mark.parametrize("fichier, nombre_par_top", [
13-
(False, 3),
14-
(FichierLogApache("test.log"), False)
13+
@pytest.mark.parametrize("fichier, filtre, nombre_par_top", [
14+
(False, FiltreLogApache(None, None), 3),
15+
(FichierLogApache("test.log"), False, 3),
16+
(FichierLogApache("test.log"), FiltreLogApache(None, None), False)
1517
])
16-
def test_analyseur_log_exception_type_invalide(fichier, nombre_par_top):
18+
def test_analyseur_log_exception_type_invalide(fichier, filtre, nombre_par_top):
1719
"""
1820
Vérifie que la classe AnalyseurLogApache lève une :class:`TypeError` si les types des
1921
paramètres du constructeur sont invalides.
2022
2123
Scénarios testés:
2224
- Type incorrect pour le paramètre ``fichier``.
25+
- Type incorrect pour le paramètre ``filtre``.
2326
- Type incorrect pour le paramètre ``nombre_par_top``.
2427
2528
Asserts:
@@ -30,7 +33,7 @@ def test_analyseur_log_exception_type_invalide(fichier, nombre_par_top):
3033
nombre_par_top (any): Nombre maximum d'éléments dans le top classement.
3134
"""
3235
with pytest.raises(TypeError):
33-
analyseur = AnalyseurLogApache(fichier, nombre_par_top)
36+
analyseur = AnalyseurLogApache(fichier, filtre, nombre_par_top)
3437

3538
def test_analyseur_log_exception_valeur_nombre_par_top_invalide():
3639
"""
@@ -44,7 +47,9 @@ def test_analyseur_log_exception_valeur_nombre_par_top_invalide():
4447
- Une exception :class:`ValueError` est levée.
4548
"""
4649
with pytest.raises(ValueError):
47-
analyseur = AnalyseurLogApache(FichierLogApache("test.log"), -4)
50+
analyseur = AnalyseurLogApache(FichierLogApache("test.log"),
51+
FiltreLogApache(None, None),
52+
-4)
4853

4954
@pytest.mark.parametrize("liste_elements, nom_element, mode_top_classement", [
5055
(0, "test", True),
@@ -189,7 +194,7 @@ def test_analyseur_top_urls_valide(analyseur_log_apache):
189194
assert top_urls[1]["total"] == 2
190195
assert top_urls[1]["taux"] == 40.0
191196

192-
def test_analyseur_repartition_code_statut_htpp_valide(analyseur_log_apache):
197+
def test_analyseur_repartition_code_statut_http_valide(analyseur_log_apache):
193198
"""
194199
Vérifie que ``get_total_par_code_statut_http`` retourne la répartition correcte des codes HTTP.
195200
@@ -241,6 +246,45 @@ def test_analyseur_get_total_entrees_valide(analyseur_log_apache,
241246
fichier_log_apache.entrees = [entree_log_apache] * nombre_entrees
242247
assert analyseur_log_apache.get_total_entrees() == nombre_entrees
243248

249+
@pytest.mark.parametrize("nombre_entrees_valides", [
250+
(0), (3), (100)
251+
])
252+
def test_analyseur_get_entrees_passent_filtre_valide(mocker,
253+
analyseur_log_apache,
254+
entree_log_apache,
255+
nombre_entrees_valides):
256+
"""
257+
Vérifie que ``_get_entrees_passent_filtre`` retourne la liste des entrées
258+
qui passent le filtre.
259+
260+
Scénarios testés:
261+
- Passage d'entrée à la méthode ``_get_entrees_passent_filtre``.
262+
263+
Asserts:
264+
- Le nombre d'entrées retourné est égale au nombre de True retourné.
265+
266+
Args:
267+
mocker (any): Fixture pour simuler des attributs et retours de méthode.
268+
analyseur_log_apache (AnalyseurLogApache): Fixture pour l'instance
269+
de la classe :class:`AnalyseurLogApache`.
270+
entree_log_apache (EntreeLogApache): Fixture pour l'instance
271+
de la classe :class:`EntreeLogApache`.
272+
nombre_entrees_valides (int): Le nombre d'entrées valides que retourne la méthode.
273+
"""
274+
analyseur_log_apache.fichier = mocker.MagicMock()
275+
analyseur_log_apache.fichier.entrees = [entree_log_apache] * (nombre_entrees_valides * 2)
276+
277+
retour_methode = [True] * nombre_entrees_valides
278+
retour_methode += [False] * nombre_entrees_valides
279+
280+
analyseur_log_apache.filtre = mocker.MagicMock()
281+
analyseur_log_apache.filtre.entree_passe_filtre.side_effect = retour_methode
282+
283+
entrees_filtre = analyseur_log_apache._get_entrees_passent_filtre()
284+
285+
assert entrees_filtre == [entree_log_apache] * nombre_entrees_valides
286+
assert len(entrees_filtre) == nombre_entrees_valides
287+
244288
def test_analyseur_get_analyse_complete_valide(analyseur_log_apache):
245289
"""
246290
Vérifie que ``get_analyse_complete`` retourne un rapport de l'analyse correct
@@ -255,16 +299,13 @@ def test_analyseur_get_analyse_complete_valide(analyseur_log_apache):
255299
Args:
256300
analyseur_log_apache (AnalyseurLogApache): Fixture pour l'instance
257301
de la classe :class:`AnalyseurLogApache`.
258-
fichier_log_apache (FichierLogApache): Fixture pour l'instance
259-
de la classe :class:`FichierLogApache`.
260-
entree_log_apache (EntreeLogApache): Fixture pour l'instance
261-
de la classe :class:`EntreeLogApache`.
262-
nombre_entrees (int): Le nombre total d'entrées dans le fichier.
263302
"""
264303
analyse = analyseur_log_apache.get_analyse_complete()
265304
assert analyse["chemin"] == analyseur_log_apache.fichier.chemin
305+
assert analyse["total_entrees"] == analyseur_log_apache.get_total_entrees()
306+
assert analyse["filtre"] == analyseur_log_apache.filtre.get_dict_filtre()
266307
statistiques = analyse["statistiques"]
267-
assert statistiques["total_entrees"] == analyseur_log_apache.get_total_entrees()
308+
assert statistiques["total_entrees_filtre"] == analyseur_log_apache.get_total_entrees_filtre()
268309
statistiques_requetes = statistiques["requetes"]
269310
assert statistiques_requetes["top_urls"] == analyseur_log_apache.get_top_urls()
270311
assert (statistiques_requetes["repartition_code_statut_http"]

tests/test_filtre_log_apache.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
"""
2+
Module des tests unitaires pour le filtre de log Apache.
3+
"""
4+
5+
import pytest
6+
from analyse.filtre_log_apache import FiltreLogApache
7+
8+
9+
# Tests unitaires
10+
11+
@pytest.mark.parametrize("filtre_adresse_ip, filtre_code_statut_http", [
12+
(False, 200),
13+
("127.0.0.1", False)
14+
])
15+
def test_filtre_log_type_invalide(filtre_adresse_ip, filtre_code_statut_http):
16+
"""
17+
Vérifie que la classe renvoie une erreur lorsque un argument de type invalide
18+
est passé dans le constructeur.
19+
20+
Scénarios testés:
21+
- Type incorrect pour le paramètre ``filtre_adresse_ip``.
22+
- Type incorrect pour le paramètre ``filtre_code_statut_http``.
23+
24+
Asserts:
25+
- Une exception :class:`TypeError` est levée.
26+
27+
Args:
28+
filtre_adresse_ip (any): La vérification sur l'adresse IP.
29+
filtre_code_statut_http (any): La vérification sur le code de statut http.
30+
"""
31+
with pytest.raises(TypeError):
32+
filtre = FiltreLogApache(filtre_adresse_ip, filtre_code_statut_http)
33+
34+
def test_filtre_log_entree_passe_filtre_type_invalide(filtre_log_apache):
35+
"""
36+
Vérifie que la méthode ``entree_passe_filtre`` renvoie une erreur en cas
37+
de type de paramètre invalide.
38+
39+
Scénarios testés:
40+
- Type incorrect pour le paramètre ``entree``.
41+
42+
Asserts:
43+
- Une exception :class:`TypeError` est levée.
44+
45+
Args:
46+
filtre_log_apache (FiltreLogApache): Fixture pour l'instance
47+
de la classe :class:`FiltreLogApache`.
48+
"""
49+
with pytest.raises(TypeError):
50+
filtre_log_apache.entree_passe_filtre(False)
51+
52+
@pytest.mark.parametrize("filtre_adresse_ip, adresse_ip_entree, retour_attendu", [
53+
("127.0.0.1", "127.0.0.1", True),
54+
("127.0.0.2", "127.0.0.1", False),
55+
("127.0.0.1", "127.0.0.2", False)
56+
])
57+
def test_filtre_log_entree_passe_filtre_adresse_ip_valide(filtre_log_apache,
58+
entree_log_apache,
59+
filtre_adresse_ip,
60+
adresse_ip_entree,
61+
retour_attendu):
62+
"""
63+
Vérifie que la méthode ``entree_passe_filtre`` applique correctement la vérification
64+
sur l'adresse IP.
65+
66+
Scénarios testés:
67+
- L'adresse IP de l'entrée égale à celle du filtre.
68+
- L'adresse IP de l'entrée différente de celle du filtre.
69+
70+
Asserts:
71+
- La méthode ``entree_passe_filtre`` est égale à ``retour_attendu``.
72+
73+
Args:
74+
filtre_log_apache (FiltreLogApache): Fixture pour l'instance
75+
de la classe :class:`FiltreLogApache`.
76+
entree_log_apache (EntreeLogApache): Fixture pour l'instance
77+
de la classe :class:`EntreeLogApache`.
78+
filtre_adresse_ip (str): La valeur du filtre de l'adresse IP.
79+
adresse_ip_entree (str): L'adresse IP de l'entrée.
80+
retour_attendu (bool): Le retour attendu par la méthode.
81+
"""
82+
filtre_log_apache.adresse_ip = filtre_adresse_ip
83+
entree_log_apache.client.adresse_ip = adresse_ip_entree
84+
assert filtre_log_apache.entree_passe_filtre(entree_log_apache) == retour_attendu
85+
86+
@pytest.mark.parametrize("filtre_code_statut_http, code_statut_http_entree, retour_attendu", [
87+
(200, 200, True),
88+
(404, 200, False),
89+
(200, 404, False)
90+
])
91+
def test_filtre_log_entree_passe_filtre_code_statut_http_valide(filtre_log_apache,
92+
entree_log_apache,
93+
filtre_code_statut_http,
94+
code_statut_http_entree,
95+
retour_attendu):
96+
"""
97+
Vérifie que la méthode ``entree_passe_filtre`` applique correctement la vérification
98+
sur le code de statut http.
99+
100+
Scénarios testés:
101+
- Le code de statut http de l'entrée égale à celle du filtre.
102+
- Le code de statut http de l'entrée différente de celle du filtre.
103+
104+
Asserts:
105+
- La méthode ``entree_passe_filtre`` est égale à ``retour_attendu``.
106+
107+
Args:
108+
filtre_log_apache (FiltreLogApache): Fixture pour l'instance
109+
de la classe :class:`FiltreLogApache`.
110+
entree_log_apache (EntreeLogApache): Fixture pour l'instance
111+
de la classe :class:`EntreeLogApache`.
112+
filtre_code_statut_http (str): La valeur du filtre du code de statut http.
113+
code_statut_http_entree (str): Le code de statut http de l'entrée.
114+
retour_attendu (bool): Le retour attendu par la méthode.
115+
"""
116+
filtre_log_apache.code_statut_http = filtre_code_statut_http
117+
entree_log_apache.reponse.code_statut_http = code_statut_http_entree
118+
assert filtre_log_apache.entree_passe_filtre(entree_log_apache) == retour_attendu

tests/test_main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ def test_main_succes(mocker):
5252
chemin_log="test.log"
5353
)
5454

55+
mocker.patch("main.FiltreLogApache")
56+
5557
mock_parseur_log = mocker.patch("main.ParseurLogApache")
5658
mock_parseur_log.return_value.parse_fichier.return_value = mocker.MagicMock()
5759

tests/test_parseur_arguments_cli.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,92 @@ def test_parseur_cli_verification_extention_chemin_sortie(parseur_arguments_cli)
196196
"""
197197
with pytest.raises(ArgumentCLIException):
198198
parseur_arguments_cli.parse_args(args=["fichier.txt", "-s", "invalide.txt"])
199+
200+
def test_parseur_cli_recuperation_chemin_sortie_defaut_valide(parseur_arguments_cli):
201+
"""
202+
Vérifie que le chemin du fichier de sortie JSON par défaut est bien appliqué lorsque
203+
aucun chemin de sortie n'est donné.
204+
205+
Scénarios testés:
206+
- Demande de parsage avec aucun fichier de sortie indiqué.
207+
208+
Asserts:
209+
- La bonne valeur par défaut pour le chemin de sortie à été appliquée.
210+
211+
Args:
212+
parseur_arguments_cli (ParseurArgumentsCLI): Fixture pour l'instance
213+
de la classe :class:`ParseurArgumentsCLI`.
214+
"""
215+
argument = parseur_arguments_cli.parse_args(args=["fichier.txt"])
216+
assert argument.sortie == "./analyse-log-apache.json"
217+
218+
@pytest.mark.parametrize("adresse_ip", [
219+
("127.0.0.1"), ("192.168.0.0"), ("10.0.0.8")
220+
])
221+
def test_parseur_cli_recuperation_filtre_adresse_ip_valide(parseur_arguments_cli, adresse_ip):
222+
"""
223+
Vérifie que le filtre sur l'adresse IP fourni depuis la ligne de commande est bien
224+
récupéré par le parseur.
225+
226+
Scénarios testés:
227+
- Ajout d'un filtre sur l'adresse IP dans les arguments de la CLI.
228+
229+
Asserts:
230+
- La valeur de l'adresse IP est bien récupérée et conforme à l'entrée.
231+
232+
Args:
233+
parseur_arguments_cli (ParseurArgumentsCLI): Fixture pour l'instance
234+
de la classe :class:`ParseurArgumentsCLI`.
235+
adresse_ip (str): Le filtre sur l'adresse IP.
236+
"""
237+
arguments = parseur_arguments_cli.parse_args(args=["fichier.txt", "-i", adresse_ip])
238+
assert arguments.ip == adresse_ip
239+
240+
@pytest.mark.parametrize("code_statut_http", [
241+
("200"), ("302"), ("404")
242+
])
243+
def test_parseur_cli_recuperation_filtre_code_statut_http_valide(parseur_arguments_cli,
244+
code_statut_http):
245+
"""
246+
Vérifie que le filtre sur le code de statut http fourni depuis la ligne de commande est bien
247+
récupéré par le parseur.
248+
249+
Scénarios testés:
250+
- Ajout d'un filtre sur le code de statut http dans les arguments de la CLI.
251+
252+
Asserts:
253+
- La valeur du code de statut http est bien récupérée et conforme à l'entrée.
254+
- La valeur du code de statut http est bien convertie en entier.
255+
256+
Args:
257+
parseur_arguments_cli (ParseurArgumentsCLI): Fixture pour l'instance
258+
de la classe :class:`ParseurArgumentsCLI`.
259+
code_statut_http (str): Le filtre sur le code de statut http.
260+
"""
261+
arguments = parseur_arguments_cli.parse_args(args=["fichier.txt", "-c", code_statut_http])
262+
assert arguments.code_statut_http == int(code_statut_http)
263+
264+
@pytest.mark.parametrize("code_statut_http_invalide", [
265+
("test"), ("invalide")
266+
])
267+
def test_parseur_cli_exception_recuperation_filtre_code_statut_http_invalide(
268+
parseur_arguments_cli,
269+
code_statut_http_invalide):
270+
"""
271+
Vérifie qu'une erreur se produit lorsque le filtre sur le code de statut http n'est pas
272+
convertisable en un entier.
273+
274+
Scénarios testés:
275+
- Ajout d'un filtre sur le code de statut http invalide dans les arguments de la CLI.
276+
277+
Asserts:
278+
- Une exception :class:`ArgumentCLIException` est levée.
279+
280+
Args:
281+
parseur_arguments_cli (ParseurArgumentsCLI): Fixture pour l'instance
282+
de la classe :class:`ParseurArgumentsCLI`.
283+
code_statut_http_invalide (str): Le filtre invalide sur le code de statut http.
284+
"""
285+
with pytest.raises(ArgumentCLIException):
286+
arguments = parseur_arguments_cli.parse_args(
287+
args=["fichier.txt", "-c", code_statut_http_invalide])

0 commit comments

Comments
 (0)