from recipe_graph import scrape from bs4 import BeautifulSoup from recipe_graph.db import RecipeSite, Recipe, RecipeIngredient, RecipeIngredientParts from pytest import fixture @fixture def mock_site(): return RecipeSite( name="mock-site", ingredient_class="mock-ing", name_class="mock-name", base_url="example-site/mock-site", ) # TODO: should probably load HTML from file @fixture def mock_page(): return BeautifulSoup( """
test_recipe
test_ingredient
""", "html.parser", ) @fixture def mock_blank_page(): return BeautifulSoup("""
""", "html.parser") @fixture def mock_recipe(): return Recipe(name="test_recipe", identifier="mock_1") @fixture def mock_ingredient(): return RecipeIngredient(text="1 ounce water") @fixture def mock_url(): return "example-site/mock-site" def test_load_page(): page = scrape.load_page("https://www.google.com") assert type(page) == BeautifulSoup page = scrape.load_page("https://www.google.com/some-nonsense") assert page == None def test_ingredient_regex(): regex = scrape.ingredient_regex(["cup"], ["crushed"]) assert ( regex.pattern == "((?:[\\d\\./\\u00BC-\\u00BE\\u2150-\\u215E]*\\s?(?:\\(.+\\))?)*)((?:(?:[cC]up)e?s?)?)((?:(?:(?:[cC]rushed)(?:ly)?)| )*)([a-zA-Z '\\-]+),?(.*)" ) regex = scrape.ingredient_regex(["cup", "ounce"], ["crushed", "ground"]) assert ( regex.pattern == "((?:[\\d\\./\\u00BC-\\u00BE\\u2150-\\u215E]*\\s?(?:\\(.+\\))?)*)((?:(?:[cC]up|[oO]unce)e?s?)?)((?:(?:(?:[cC]rushed|[gG]round)(?:ly)?)| )*)([a-zA-Z '\\-]+),?(.*)" ) def test_parse_recipe_name(mock_site, mock_page, mock_recipe, mock_url, mock_blank_page,): expected_name = mock_recipe.name mock_recipe.name = None mock_recipe = scrape.parse_recipe_name( mock_site, mock_page, mock_recipe, ) assert mock_recipe.name == expected_name ex = None try: mock_recipe = scrape.parse_recipe_name( mock_site, mock_blank_page, mock_recipe, ) except Exception as e: ex = e url = {"site": mock_site.base_url, "recipe": mock_recipe.identifier} assert str(e) == f"Could not extract recipe name: {url}" assert ex def test_ingredient_to_parts(mock_ingredient): parts = scrape.ingredient_to_parts(mock_ingredient) assert parts.quantity == "1" assert parts.unit == "ounce" assert parts.instruction == "" assert parts.ingredient == "water" assert parts.supplement == None