Files
CookIT/tools/excel-import/tests/test_parse.py
T

135 lines
4.5 KiB
Python
Raw Normal View History

import pytest
from cookit_import import parse
@pytest.mark.parametrize(
"value, expected",
[
(275, (275, None)),
(1.5, (1.5, None)),
(0.08333333333333333, (0.083, None)),
("0,5", (0.5, None)),
("½", (0.5, None)),
("1/2", (0.5, None)),
("1 1/2", (1.5, None)),
("3/4", (0.75, None)),
("2-3", (2, 3)),
("10 - 12", (10, 12)),
("200-250", (200, 250)),
(None, (None, None)),
(0, (None, None)),
],
)
def test_parse_amount(value, expected):
assert parse.parse_amount(value) == expected
@pytest.mark.parametrize("value", ["opt. als Topping", "(2", "ODER"])
def test_parse_amount_rejects_text(value):
assert parse.parse_amount(value) is None
@pytest.mark.parametrize(
"value, key",
[
("Gramm", "gram"),
("Mililiter", "milliliter"),
("milliliter", "milliliter"),
("Zehe/n", "clove"),
("Zehen", "clove"),
("Kleine", "small"),
("kleine", "small"),
("Große", "large"),
("Zweig (e)", "sprig"),
("Msp.", "knifeTip"),
("Etwas", "some"),
("Tassen", "cup"),
],
)
def test_parse_unit(value, key):
assert parse.parse_unit(value) == key
def test_parse_unit_unknown():
assert parse.parse_unit("Fett") is None
@pytest.mark.parametrize(
"value, expected",
[("100 g", (100, "gram")), ("125 ml", (125, "milliliter")), ("1 TL", (1, "teaspoon")), ("1 Pkt.", (1, "pack")), ("3", (3, None))],
)
def test_split_amount_unit(value, expected):
assert parse.split_amount_unit(value) == expected
@pytest.mark.parametrize(
"value, expected",
[(30, 30), ("45 Minuten", 45), ("2 Stunden", 120), ("1h 30min", 90), ("0 Minuten", None), (None, None), ("über Nacht", "über Nacht")],
)
def test_parse_minutes(value, expected):
assert parse.parse_minutes(value) == expected
@pytest.mark.parametrize(
"value, number, remark",
[
(4, 4, None),
(3.5, 3.5, None),
("6 Portionen", 6, None),
("4 Personen", 4, None),
("8 Stk.", 8, "8 Stk."),
("2 Rollen;\neine Rolle entspricht 8 Scheiben", 2, "2 Rollen;\neine Rolle entspricht 8 Scheiben"),
(None, None, None),
],
)
def test_parse_servings(value, number, remark):
s = parse.parse_servings(value)
assert (s.value, s.remark) == (number, remark)
def test_calories_basis_threshold():
assert parse.calories_basis(1500) == "perServing"
assert parse.calories_basis(1501) == "wholeRecipe"
def test_extract_urls():
urls, rest = parse.extract_urls("Quelle: https://sallys-blog.de/rezepte/focaccia")
assert urls == ["https://sallys-blog.de/rezepte/focaccia"]
assert rest == "Quelle:"
class TestSplitSteps:
def test_blank_lines_separate_steps(self):
sections = parse.split_steps("\nZutaten mischen.\n\nTeig gehen lassen.\n\n\nBacken.")
assert [(s.title, s.steps) for s in sections] == [(None, ["Zutaten mischen.", "Teig gehen lassen.", "Backen."])]
def test_heading_line_starts_a_section(self):
sections = parse.split_steps("Vorteig\nVerrühre die Zutaten.\n\nTeig\nFüge das Mehl hinzu.")
assert [(s.title, s.steps) for s in sections] == [
("Vorteig", ["Verrühre die Zutaten."]),
("Teig", ["Füge das Mehl hinzu."]),
]
def test_lone_heading_paragraph(self):
sections = parse.split_steps("Soße:\n\nAlles verrühren.\n\nAbschmecken.")
assert [(s.title, s.steps) for s in sections] == [("Soße", ["Alles verrühren.", "Abschmecken."])]
def test_inline_heading(self):
sections = parse.split_steps("Salat:Die Zwiebel schneiden.\n\nSoße:Mayo verrühren.")
assert [(s.title, s.steps) for s in sections] == [("Salat", ["Die Zwiebel schneiden."]), ("Soße", ["Mayo verrühren."])]
def test_single_paragraph_splits_on_lines(self):
sections = parse.split_steps(" Mehl und Salz mischen.\n Wasser zugeben und kneten.")
assert sections[0].steps == ["Mehl und Salz mischen.", "Wasser zugeben und kneten."]
def test_short_last_line_stays_a_step(self):
sections = parse.split_steps("Alles anbraten.\n\nServieren")
assert sections[0].steps == ["Alles anbraten.", "Servieren"]
def test_strips_enumeration(self):
sections = parse.split_steps("1. Wasser kochen.\n\n2) Nudeln garen.")
assert sections[0].steps == ["Wasser kochen.", "Nudeln garen."]
def test_empty(self):
assert parse.split_steps("\n\n ") == []