Initial commit: CookIT recipe collection and week planner
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
commit
7d7a0bc60b
173 files changed
+22803
No files matched your search
@@ -0,0 +1,135 @@
|
||||
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 ") == []
|
||||
Reference in new issue
Block a user