1
etude_lego_jurassic_world/tests/test_head_reuse.py

97 lines
3.0 KiB
Python

"""Tests du calcul de réutilisation des têtes de minifigs."""
import csv
from pathlib import Path
from lib.rebrickable.head_reuse import aggregate_head_reuse, build_head_presence
from lib.rebrickable.minifigs_by_set import load_parts_catalog, select_head_parts
def write_csv(path: Path, headers: list[str], rows: list[list[str]]) -> None:
"""Écrit un petit CSV pour les tests."""
path.parent.mkdir(parents=True, exist_ok=True)
with path.open("w", newline="") as csv_file:
writer = csv.writer(csv_file)
writer.writerow(headers)
writer.writerows(rows)
def test_head_reuse_counts_sets_and_catalog(tmp_path: Path) -> None:
"""Compte les usages des têtes filtrées versus reste du catalogue."""
minifigs_by_set = tmp_path / "minifigs_by_set.csv"
write_csv(
minifigs_by_set,
["set_num", "part_num", "known_character", "fig_num", "gender"],
[
["s1-1", "p1", "Alice", "fig-1", "female"],
["s2-1", "p2", "Bob", "fig-2", "male"],
["s1-1", "p2", "Bob", "fig-2", "male"],
],
)
parts_catalog = tmp_path / "parts.csv"
write_csv(
parts_catalog,
["part_num", "name", "part_cat_id"],
[
["p1", "Head 1", "59"],
["p2", "Head 2", "59"],
["x1", "Other", "1"],
],
)
inventories = tmp_path / "inventories.csv"
write_csv(
inventories,
["id", "version", "set_num"],
[
["i1", "1", "s1-1"],
["i2", "1", "s2-1"],
["i3", "1", "s3-1"],
["i4", "1", "s4-1"],
],
)
inventory_parts = tmp_path / "inventory_parts.csv"
write_csv(
inventory_parts,
["inventory_id", "part_num", "color_id", "quantity", "is_spare"],
[
["i1", "p1", "1", "1", "false"],
["i2", "p2", "1", "1", "false"],
["i3", "p2", "1", "1", "false"],
["i4", "p2", "1", "1", "true"],
["i4", "x1", "1", "1", "false"],
],
)
head_parts = select_head_parts(load_parts_catalog(parts_catalog))
presence = build_head_presence(inventories, inventory_parts, head_parts)
reuse = aggregate_head_reuse(
[
{"set_num": "s1-1", "part_num": "p1", "known_character": "Alice", "fig_num": "fig-1"},
{"set_num": "s2-1", "part_num": "p2", "known_character": "Bob", "fig_num": "fig-2"},
{"set_num": "s1-1", "part_num": "p2", "known_character": "Bob", "fig_num": "fig-2"},
],
load_parts_catalog(parts_catalog),
presence,
)
assert reuse == [
{
"part_num": "p1",
"part_name": "Head 1",
"known_character": "Alice",
"filtered_sets": "1",
"other_sets": "0",
"total_sets": "1",
},
{
"part_num": "p2",
"part_name": "Head 2",
"known_character": "Bob",
"filtered_sets": "2",
"other_sets": "1",
"total_sets": "2",
},
]