You've already forked etude_lego_jurassic_world
Premiers éléments de l'étude
This commit is contained in:
85
tests/test_parts_stats.py
Normal file
85
tests/test_parts_stats.py
Normal file
@@ -0,0 +1,85 @@
|
||||
"""Tests des statistiques simples sur les pièces filtrées."""
|
||||
|
||||
import csv
|
||||
from pathlib import Path
|
||||
|
||||
from lib.rebrickable.parts_stats import build_stats, read_rows, write_parts_stats
|
||||
|
||||
|
||||
def write_csv(path: Path, headers: list[str], rows: list[list[str]]) -> None:
|
||||
"""Écrit un CSV simple pour les besoins de tests."""
|
||||
with path.open("w", newline="") as csv_file:
|
||||
writer = csv.writer(csv_file)
|
||||
writer.writerow(headers)
|
||||
writer.writerows(rows)
|
||||
|
||||
|
||||
def test_build_stats(tmp_path: Path) -> None:
|
||||
"""Calcule les statistiques principales sans les pièces de rechange."""
|
||||
parts_path = tmp_path / "parts_filtered.csv"
|
||||
sets_path = tmp_path / "sets_enriched.csv"
|
||||
stats_path = tmp_path / "stats.csv"
|
||||
write_csv(
|
||||
parts_path,
|
||||
["part_num", "color_rgb", "is_translucent", "set_num", "set_id", "quantity_in_set", "is_spare"],
|
||||
[
|
||||
["3001", "FFFFFF", "false", "1000-1", "1000", "2", "false"],
|
||||
["3001", "FFFFFF", "false", "2000-1", "2000", "1", "false"],
|
||||
["3002", "000000", "true", "1000-1", "1000", "5", "false"],
|
||||
["3003", "FF0000", "false", "1000-1", "1000", "1", "true"],
|
||||
],
|
||||
)
|
||||
write_csv(
|
||||
sets_path,
|
||||
["set_num", "set_id", "num_parts", "in_collection"],
|
||||
[
|
||||
["1000-1", "1000", "8", "true"],
|
||||
["2000-1", "2000", "1", "false"],
|
||||
],
|
||||
)
|
||||
write_csv(
|
||||
stats_path,
|
||||
["libelle", "valeur"],
|
||||
[
|
||||
["Total de pièces pour les thèmes filtrés", "9"],
|
||||
],
|
||||
)
|
||||
|
||||
stats = build_stats(read_rows(parts_path), sets_path, parts_path, stats_path)
|
||||
|
||||
assert stats == [
|
||||
("Total de variations de pièces (hors rechanges)", "2"),
|
||||
(
|
||||
"Pièce la moins utilisée (référence + couleur)",
|
||||
"3001 / FFFFFF / false (3)",
|
||||
),
|
||||
(
|
||||
"Pièce la plus commune (référence + couleur)",
|
||||
"3002 / 000000 / true (5)",
|
||||
),
|
||||
("Total de couleurs utilisées (hors rechanges)", "2"),
|
||||
("Total de pièces hors rechanges", "8"),
|
||||
("Ecart total catalogue (stats) - inventaire (hors rechanges)", "1"),
|
||||
("Nombre de sets en écart inventaire/catalogue", "0"),
|
||||
("Ecart maximal inventaire/catalogue", "none (0)"),
|
||||
]
|
||||
|
||||
|
||||
def test_write_parts_stats(tmp_path: Path) -> None:
|
||||
"""Écrit un CSV de statistiques."""
|
||||
destination_path = tmp_path / "parts_stats.csv"
|
||||
stats = [
|
||||
("A", "1"),
|
||||
("B", "2"),
|
||||
]
|
||||
|
||||
write_parts_stats(destination_path, stats)
|
||||
|
||||
with destination_path.open() as csv_file:
|
||||
rows = list(csv.reader(csv_file))
|
||||
|
||||
assert rows == [
|
||||
["libelle", "valeur"],
|
||||
["A", "1"],
|
||||
["B", "2"],
|
||||
]
|
||||
Reference in New Issue
Block a user