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 ") == []