136 lines
4.5 KiB
Python
136 lines
4.5 KiB
Python
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 ") == []
|