from src.cleaning.units import parse_size, parse_price_label, unit_price def test_sizes(): assert parse_size("450 g").qty == 450 and parse_size("450 g").base == "g" assert parse_size("2 L").qty == 2000 and parse_size("2 L").base == "ml" assert parse_size("12 x 355 ml").qty == 12 * 355 assert parse_size("1,36 kg").qty == 1360 assert parse_size("6 un").base == "un" and parse_size("6 un").qty == 6 assert parse_size("Vendu individuellement").base == "un" s = parse_size("Une barquette contient en moyenne 1250 g"); assert s.qty == 1250 and s.approx s = parse_size("", "Lait 2% 2 L"); assert s.qty == 2000 and s.source == "name" s = parse_size("1,2 - 1,5 kg"); assert abs(s.qty - 1350) < 1e-6 and s.approx assert parse_size("") is None and parse_size(None, None) is None def test_labels_and_unit_price(): pl = parse_price_label("6,57 $ / kg"); assert pl.per_weight_unit == "kg" assert unit_price(6.57, None, pl) == (0.657, "100 g") pl = parse_price_label("2 / 5,00 $"); assert pl.multibuy_n == 2 and pl.multibuy_total == 5.0 assert unit_price(4.99, parse_size("500 g")) == (0.998, "100 g") assert unit_price(3.0, parse_size("6 un")) == (0.5, "un") assert unit_price(None, parse_size("500 g")) is None assert unit_price(4.99, None) is None