84 lines
3.6 KiB
Python
84 lines
3.6 KiB
Python
"""Tests des statistiques calculées sur les sets LEGO filtrés."""
|
|
|
|
from lib.rebrickable.stats import compute_basic_stats, write_stats_csv
|
|
|
|
|
|
def test_compute_basic_stats_returns_expected_values(tmp_path) -> None:
|
|
"""Calcule les statistiques principales sur un échantillon maîtrisé."""
|
|
themes = [
|
|
{"id": "602", "name": "Jurassic World", "parent_id": ""},
|
|
{"id": "274", "name": "Jurassic Park III", "parent_id": "273"},
|
|
]
|
|
all_sets = [
|
|
{"set_num": "123-1", "name": "A", "year": "2020", "theme_id": "602", "num_parts": "100", "img_url": ""},
|
|
{"set_num": "124-1", "name": "B", "year": "2021", "theme_id": "602", "num_parts": "200", "img_url": ""},
|
|
{"set_num": "125-1", "name": "C", "year": "2021", "theme_id": "274", "num_parts": "300", "img_url": ""},
|
|
]
|
|
filtered_sets = [
|
|
{"set_num": "123-1", "name": "A", "year": "2020", "theme_id": "602", "num_parts": "100", "img_url": ""},
|
|
{"set_num": "124-1", "name": "B", "year": "2021", "theme_id": "602", "num_parts": "200", "img_url": ""},
|
|
]
|
|
enriched_sets = [
|
|
{
|
|
"set_num": "123-1",
|
|
"name": "A",
|
|
"year": "2020",
|
|
"theme_id": "602",
|
|
"num_parts": "100",
|
|
"img_url": "",
|
|
"set_id": "123",
|
|
"rebrickable_url": "",
|
|
"in_collection": "true",
|
|
},
|
|
{
|
|
"set_num": "124-1",
|
|
"name": "B",
|
|
"year": "2021",
|
|
"theme_id": "602",
|
|
"num_parts": "200",
|
|
"img_url": "",
|
|
"set_id": "124",
|
|
"rebrickable_url": "",
|
|
"in_collection": "false",
|
|
},
|
|
]
|
|
|
|
stats = compute_basic_stats(themes, all_sets, filtered_sets, enriched_sets)
|
|
|
|
assert stats == [
|
|
("Nombre total de sets (catalogue complet)", "3"),
|
|
("Nombre total de thèmes (catalogue complet)", "2"),
|
|
("Nombre de sets après filtrage (thèmes ciblés)", "2"),
|
|
("Nombre moyen de sets par thème (catalogue complet)", "1.50"),
|
|
("Pourcentage des sets filtrés vs total", "66.67%"),
|
|
("Taux de possession (thèmes filtrés)", "50.00%"),
|
|
("Sets dans la collection", "1"),
|
|
("Sets manquants pour la collection", "1"),
|
|
("Nombre moyen de pièces par set (thèmes filtrés)", "150.00"),
|
|
("Médiane de pièces par set (thèmes filtrés)", "150.00"),
|
|
("Nombre moyen de sets commercialisés par an (thèmes filtrés)", "1.00"),
|
|
("Total de pièces pour les thèmes filtrés", "300"),
|
|
("Total de pièces des sets possédés", "100"),
|
|
("Pourcentage de pièces possédées (thèmes filtrés)", "33.33%"),
|
|
("Nombre de thèmes filtrés", "1"),
|
|
("Première année de sortie (thèmes filtrés)", "2020"),
|
|
("Dernière année de sortie (thèmes filtrés)", "2021"),
|
|
("Année la plus prolifique (thèmes filtrés)", "2020 (1 sets)"),
|
|
("Set avec le plus de pièces (thèmes filtrés)", "124-1 - B (200 pièces)"),
|
|
("Set avec le moins de pièces (thèmes filtrés)", "123-1 - A (100 pièces)"),
|
|
("Set le plus ancien (thèmes filtrés)", "123-1 - A (2020)"),
|
|
("Set le plus récent (thèmes filtrés)", "124-1 - B (2021)"),
|
|
("Nombre moyen de pièces des sets possédés", "100.00"),
|
|
("Nombre moyen de pièces des sets manquants", "200.00"),
|
|
]
|
|
|
|
|
|
def test_write_stats_csv_outputs_two_columns(tmp_path) -> None:
|
|
"""Écrit un CSV simple avec libellé et valeur."""
|
|
destination = tmp_path / "stats.csv"
|
|
stats = [("A", "1"), ("B", "2")]
|
|
|
|
write_stats_csv(destination, stats)
|
|
|
|
assert destination.read_text() == "libelle,valeur\nA,1\nB,2\n"
|