86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
"""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"],
|
|
]
|